Skip to content

Instantly share code, notes, and snippets.

@anton-povarov
Created June 3, 2014 15:49
Show Gist options
  • Save anton-povarov/eb7d4a01af4163487c1a to your computer and use it in GitHub Desktop.
Save anton-povarov/eb7d4a01af4163487c1a to your computer and use it in GitHub Desktop.
patch for ziutek/mymysql race
diff --git a/native/packet.go b/native/packet.go
index 6fc606e..a2609c5 100644
--- a/native/packet.go
+++ b/native/packet.go
@@ -107,9 +107,31 @@ func (pr *pktReader) readAll() (buf []byte) {
return
}
-var skipBuf [4069]byte
+//var skipBuf [4069]byte
+const skipBufSize = 4096
+
+var skipChan = make(chan []byte, 8)
+
+func skipBufGet() []byte {
+ select {
+ case b := <-skipChan:
+ return b
+ default:
+ }
+ return make([]byte, skipBufSize)
+}
+
+func skipBufRelease(b []byte) {
+ select {
+ case skipChan <- b:
+ default:
+ }
+}
func (pr *pktReader) skipAll() {
+ buf := skipBufGet()
+ defer skipBufRelease(buf)
+
for {
if pr.remain == 0 {
if pr.last {
@@ -117,11 +139,11 @@ func (pr *pktReader) skipAll() {
}
pr.readHeader()
}
- n := len(skipBuf)
+ n := len(buf)
if n > pr.remain {
n = pr.remain
}
- n, err := pr.rd.Read(skipBuf[:n])
+ n, err := pr.rd.Read(buf[:n])
pr.remain -= n
if err != nil {
panic(err)
@@ -130,8 +152,11 @@ func (pr *pktReader) skipAll() {
return
}
-// works only for n <= len(skipBuf)
+// works only for n <= skipBufSize
func (pr *pktReader) skipN(n int) {
+ buf := skipBufGet()
+ defer skipBufRelease(buf)
+
for n > 0 {
if pr.remain == 0 {
if pr.last {
@@ -140,13 +165,13 @@ func (pr *pktReader) skipN(n int) {
pr.readHeader()
}
m := n
- if m > len(skipBuf) {
- m = len(skipBuf)
+ if m > len(buf) {
+ m = len(buf)
}
if m > pr.remain {
m = pr.remain
}
- m, err := pr.rd.Read(skipBuf[:m])
+ m, err := pr.rd.Read(buf[:m])
pr.remain -= m
n -= m
if err != nil {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment