|
@@ -2,6 +2,8 @@ package worker |
|
|
|
|
|
|
|
|
import ( |
|
|
import ( |
|
|
"bufio" |
|
|
"bufio" |
|
|
|
|
|
"bytes" |
|
|
|
|
|
"encoding/binary" |
|
|
"net" |
|
|
"net" |
|
|
"sync" |
|
|
"sync" |
|
|
"io" |
|
|
"io" |
|
@@ -53,7 +55,7 @@ func (a *agent) work() { |
|
|
var err error |
|
|
var err error |
|
|
var data, leftdata []byte |
|
|
var data, leftdata []byte |
|
|
for { |
|
|
for { |
|
|
if data, err = a.read(bufferSize); err != nil { |
|
|
|
|
|
|
|
|
if data, err = a.read(); err != nil { |
|
|
if opErr, ok := err.(*net.OpError); ok { |
|
|
if opErr, ok := err.(*net.OpError); ok { |
|
|
if opErr.Temporary() { |
|
|
if opErr.Temporary() { |
|
|
continue |
|
|
continue |
|
@@ -159,20 +161,31 @@ func (a *agent) reconnect() (error){ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// read length bytes from the socket |
|
|
// read length bytes from the socket |
|
|
func (a *agent) read(length int) (data []byte, err error) { |
|
|
|
|
|
|
|
|
func (a *agent) read() (data []byte, err error) { |
|
|
n := 0 |
|
|
n := 0 |
|
|
buf := getBuffer(bufferSize) |
|
|
|
|
|
// read until data can be unpacked |
|
|
|
|
|
for i := length; i > 0 || len(data) < minPacketLength; i -= n { |
|
|
|
|
|
if n, err = a.rw.Read(buf); err != nil { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
data = append(data, buf[0:n]...) |
|
|
|
|
|
if n < bufferSize { |
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmp := getBuffer(bufferSize) |
|
|
|
|
|
var buf bytes.Buffer |
|
|
|
|
|
|
|
|
|
|
|
// read the header so we can get the length of the data |
|
|
|
|
|
if n, err = a.rw.Read(tmp); err != nil { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
dl := int(binary.BigEndian.Uint32(tmp[8:12])) |
|
|
|
|
|
|
|
|
|
|
|
// write what we read so far |
|
|
|
|
|
buf.Write(tmp[:n]) |
|
|
|
|
|
|
|
|
|
|
|
// read until we receive all the data |
|
|
|
|
|
for buf.Len() < dl+minPacketLength { |
|
|
|
|
|
if n, err = a.rw.Read(tmp); err != nil { |
|
|
|
|
|
return buf.Bytes(), err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
buf.Write(tmp[:n]) |
|
|
} |
|
|
} |
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return buf.Bytes(), err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Internal write the encoded job. |
|
|
// Internal write the encoded job. |
|
|