forked from yuxh/gearman-go
		
	fixed the worker's testing cases
This commit is contained in:
		
							parent
							
								
									bf25cc1728
								
							
						
					
					
						commit
						9f96247384
					
				@ -3,6 +3,7 @@ package worker
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -44,10 +45,10 @@ func (a *agent) work() {
 | 
				
			|||||||
	var data, leftdata []byte
 | 
						var data, leftdata []byte
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		if data, err = a.read(bufferSize); err != nil {
 | 
							if data, err = a.read(bufferSize); err != nil {
 | 
				
			||||||
			a.worker.err(err)
 | 
					 | 
				
			||||||
			if err == ErrLostConn {
 | 
								if err == ErrLostConn {
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								a.worker.err(err)
 | 
				
			||||||
			// If it is unexpected error and the connection wasn't
 | 
								// If it is unexpected error and the connection wasn't
 | 
				
			||||||
			// closed by Gearmand, the agent should close the conection
 | 
								// closed by Gearmand, the agent should close the conection
 | 
				
			||||||
			// and reconnect to job server.
 | 
								// and reconnect to job server.
 | 
				
			||||||
@ -103,6 +104,16 @@ func (a *agent) PreSleep() {
 | 
				
			|||||||
	a.write(outpack)
 | 
						a.write(outpack)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func isClosed(err error) bool {
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case err == io.EOF:
 | 
				
			||||||
 | 
							fallthrough
 | 
				
			||||||
 | 
						case strings.Contains(err.Error(), "use of closed network connection"):
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 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(length int) (data []byte, err error) {
 | 
				
			||||||
	n := 0
 | 
						n := 0
 | 
				
			||||||
@ -110,7 +121,7 @@ func (a *agent) read(length int) (data []byte, err error) {
 | 
				
			|||||||
	// read until data can be unpacked
 | 
						// read until data can be unpacked
 | 
				
			||||||
	for i := length; i > 0 || len(data) < minPacketLength; i -= n {
 | 
						for i := length; i > 0 || len(data) < minPacketLength; i -= n {
 | 
				
			||||||
		if n, err = a.conn.Read(buf); err != nil {
 | 
							if n, err = a.conn.Read(buf); err != nil {
 | 
				
			||||||
			if err == io.EOF {
 | 
								if isClosed(err) {
 | 
				
			||||||
				err = ErrLostConn
 | 
									err = ErrLostConn
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 | 
				
			|||||||
@ -10,10 +10,10 @@ const (
 | 
				
			|||||||
	minPacketLength = 12
 | 
						minPacketLength = 12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// \x00REQ
 | 
						// \x00REQ
 | 
				
			||||||
	req     = 5391697
 | 
						req    = 5391697
 | 
				
			||||||
	reqStr = "\x00REQ"
 | 
						reqStr = "\x00REQ"
 | 
				
			||||||
	// \x00RES
 | 
						// \x00RES
 | 
				
			||||||
	res     = 5391699
 | 
						res    = 5391699
 | 
				
			||||||
	resStr = "\x00RES"
 | 
						resStr = "\x00RES"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// package data type
 | 
						// package data type
 | 
				
			||||||
@ -21,7 +21,7 @@ const (
 | 
				
			|||||||
	dtCantDo         = 2
 | 
						dtCantDo         = 2
 | 
				
			||||||
	dtResetAbilities = 3
 | 
						dtResetAbilities = 3
 | 
				
			||||||
	dtPreSleep       = 4
 | 
						dtPreSleep       = 4
 | 
				
			||||||
	dtNoop            = 6
 | 
						dtNoop           = 6
 | 
				
			||||||
	dtJobCreated     = 8
 | 
						dtJobCreated     = 8
 | 
				
			||||||
	dtGrabJob        = 9
 | 
						dtGrabJob        = 9
 | 
				
			||||||
	dtNoJob          = 10
 | 
						dtNoJob          = 10
 | 
				
			||||||
@ -32,16 +32,16 @@ const (
 | 
				
			|||||||
	dtGetStatus      = 15
 | 
						dtGetStatus      = 15
 | 
				
			||||||
	dtEchoReq        = 16
 | 
						dtEchoReq        = 16
 | 
				
			||||||
	dtEchoRes        = 17
 | 
						dtEchoRes        = 17
 | 
				
			||||||
	dtError           = 19
 | 
						dtError          = 19
 | 
				
			||||||
	dtStatusRes      = 20
 | 
						dtStatusRes      = 20
 | 
				
			||||||
	dtSetClientId   = 22
 | 
						dtSetClientId    = 22
 | 
				
			||||||
	dtCanDoTimeout  = 23
 | 
						dtCanDoTimeout   = 23
 | 
				
			||||||
	dtAllYours       = 24
 | 
						dtAllYours       = 24
 | 
				
			||||||
	dtWorkException  = 25
 | 
						dtWorkException  = 25
 | 
				
			||||||
	dtWorkData       = 28
 | 
						dtWorkData       = 28
 | 
				
			||||||
	dtWorkWarning    = 29
 | 
						dtWorkWarning    = 29
 | 
				
			||||||
	dtGrabJobUniq   = 30
 | 
						dtGrabJobUniq    = 30
 | 
				
			||||||
	dtJobAssignUniq = 31
 | 
						dtJobAssignUniq  = 31
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getBuffer(l int) (buf []byte) {
 | 
					func getBuffer(l int) (buf []byte) {
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ func ExampleWorker() {
 | 
				
			|||||||
	w := worker.New(worker.Unlimited)
 | 
						w := worker.New(worker.Unlimited)
 | 
				
			||||||
	defer w.Close()
 | 
						defer w.Close()
 | 
				
			||||||
	// Add a gearman job server
 | 
						// Add a gearman job server
 | 
				
			||||||
	if err := w.AddServer(worker.NETWORK, "127.0.0.1:4730"); err != nil {
 | 
						if err := w.AddServer(worker.Network, "127.0.0.1:4730"); err != nil {
 | 
				
			||||||
		fmt.Println(err)
 | 
							fmt.Println(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,19 +7,19 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	inpackcases = map[uint32]map[string]string{
 | 
						inpackcases = map[uint32]map[string]string{
 | 
				
			||||||
		noop: map[string]string{
 | 
							dtNoop: map[string]string{
 | 
				
			||||||
			"src": "\x00RES\x00\x00\x00\x06\x00\x00\x00\x00",
 | 
								"src": "\x00RES\x00\x00\x00\x06\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		noJob: map[string]string{
 | 
							dtNoJob: map[string]string{
 | 
				
			||||||
			"src": "\x00RES\x00\x00\x00\x0a\x00\x00\x00\x00",
 | 
								"src": "\x00RES\x00\x00\x00\x0a\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		jobAssign: map[string]string{
 | 
							dtJobAssign: map[string]string{
 | 
				
			||||||
			"src":    "\x00RES\x00\x00\x00\x0b\x00\x00\x00\x07a\x00b\x00xyz",
 | 
								"src":    "\x00RES\x00\x00\x00\x0b\x00\x00\x00\x07a\x00b\x00xyz",
 | 
				
			||||||
			"handle": "a",
 | 
								"handle": "a",
 | 
				
			||||||
			"fn":     "b",
 | 
								"fn":     "b",
 | 
				
			||||||
			"data":   "xyz",
 | 
								"data":   "xyz",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		jobAssign_UNIQ: map[string]string{
 | 
							dtJobAssignUniq: map[string]string{
 | 
				
			||||||
			"src":    "\x00RES\x00\x00\x00\x1F\x00\x00\x00\x09a\x00b\x00c\x00xyz",
 | 
								"src":    "\x00RES\x00\x00\x00\x1F\x00\x00\x00\x09a\x00b\x00c\x00xyz",
 | 
				
			||||||
			"handle": "a",
 | 
								"handle": "a",
 | 
				
			||||||
			"fn":     "b",
 | 
								"fn":     "b",
 | 
				
			||||||
 | 
				
			|||||||
@ -7,51 +7,51 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	outpackcases = map[uint32]map[string]string{
 | 
						outpackcases = map[uint32]map[string]string{
 | 
				
			||||||
		canDo: map[string]string{
 | 
							dtCanDo: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x01\x00\x00\x00\x01a",
 | 
								"src":  "\x00REQ\x00\x00\x00\x01\x00\x00\x00\x01a",
 | 
				
			||||||
			"data": "a",
 | 
								"data": "a",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		canDo_TIMEOUT: map[string]string{
 | 
							dtCanDoTimeout: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x17\x00\x00\x00\x06a\x00\x00\x00\x00\x01",
 | 
								"src":  "\x00REQ\x00\x00\x00\x17\x00\x00\x00\x06a\x00\x00\x00\x00\x01",
 | 
				
			||||||
			"data": "a\x00\x00\x00\x00\x01",
 | 
								"data": "a\x00\x00\x00\x00\x01",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		cantDo: map[string]string{
 | 
							dtCantDo: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x02\x00\x00\x00\x01a",
 | 
								"src":  "\x00REQ\x00\x00\x00\x02\x00\x00\x00\x01a",
 | 
				
			||||||
			"data": "a",
 | 
								"data": "a",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		resetAbilities: map[string]string{
 | 
							dtResetAbilities: map[string]string{
 | 
				
			||||||
			"src": "\x00REQ\x00\x00\x00\x03\x00\x00\x00\x00",
 | 
								"src": "\x00REQ\x00\x00\x00\x03\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		preSleep: map[string]string{
 | 
							dtPreSleep: map[string]string{
 | 
				
			||||||
			"src": "\x00REQ\x00\x00\x00\x04\x00\x00\x00\x00",
 | 
								"src": "\x00REQ\x00\x00\x00\x04\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GRAB_JOB: map[string]string{
 | 
							dtGrabJob: map[string]string{
 | 
				
			||||||
			"src": "\x00REQ\x00\x00\x00\x09\x00\x00\x00\x00",
 | 
								"src": "\x00REQ\x00\x00\x00\x09\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		GRAB_JOB_UNIQ: map[string]string{
 | 
							dtGrabJobUniq: map[string]string{
 | 
				
			||||||
			"src": "\x00REQ\x00\x00\x00\x1E\x00\x00\x00\x00",
 | 
								"src": "\x00REQ\x00\x00\x00\x1E\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		WORK_DATA: map[string]string{
 | 
							dtWorkData: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x1C\x00\x00\x00\x03a\x00b",
 | 
								"src":  "\x00REQ\x00\x00\x00\x1C\x00\x00\x00\x03a\x00b",
 | 
				
			||||||
			"data": "a\x00b",
 | 
								"data": "a\x00b",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		WORK_WARNING: map[string]string{
 | 
							dtWorkWarning: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x1D\x00\x00\x00\x03a\x00b",
 | 
								"src":  "\x00REQ\x00\x00\x00\x1D\x00\x00\x00\x03a\x00b",
 | 
				
			||||||
			"data": "a\x00b",
 | 
								"data": "a\x00b",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		workStatus: map[string]string{
 | 
							dtWorkStatus: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x0C\x00\x00\x00\x08a\x0050\x00100",
 | 
								"src":  "\x00REQ\x00\x00\x00\x0C\x00\x00\x00\x08a\x0050\x00100",
 | 
				
			||||||
			"data": "a\x0050\x00100",
 | 
								"data": "a\x0050\x00100",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		workComplete: map[string]string{
 | 
							dtWorkComplete: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x0D\x00\x00\x00\x03a\x00b",
 | 
								"src":  "\x00REQ\x00\x00\x00\x0D\x00\x00\x00\x03a\x00b",
 | 
				
			||||||
			"data": "a\x00b",
 | 
								"data": "a\x00b",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		workFail: map[string]string{
 | 
							dtWorkFail: map[string]string{
 | 
				
			||||||
			"src":    "\x00REQ\x00\x00\x00\x0E\x00\x00\x00\x01a",
 | 
								"src":    "\x00REQ\x00\x00\x00\x0E\x00\x00\x00\x01a",
 | 
				
			||||||
			"handle": "a",
 | 
								"handle": "a",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		WORK_EXCEPTION: map[string]string{
 | 
							dtWorkException: map[string]string{
 | 
				
			||||||
			"src":  "\x00REQ\x00\x00\x00\x19\x00\x00\x00\x03a\x00b",
 | 
								"src":  "\x00REQ\x00\x00\x00\x19\x00\x00\x00\x03a\x00b",
 | 
				
			||||||
			"data": "a\x00b",
 | 
								"data": "a\x00b",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -59,7 +59,7 @@ var (
 | 
				
			|||||||
			"src":  "\x00REQ\x00\x00\x00\x16\x00\x00\x00\x01a",
 | 
								"src":  "\x00REQ\x00\x00\x00\x16\x00\x00\x00\x01a",
 | 
				
			||||||
			"data": "a",
 | 
								"data": "a",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		ALL_YOURS: map[string]string{
 | 
							dtAllYours: map[string]string{
 | 
				
			||||||
			"src": "\x00REQ\x00\x00\x00\x18\x00\x00\x00\x00",
 | 
								"src": "\x00REQ\x00\x00\x00\x18\x00\x00\x00\x00",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -168,8 +168,8 @@ func (worker *Worker) Ready() (err error) {
 | 
				
			|||||||
	if len(worker.funcs) == 0 {
 | 
						if len(worker.funcs) == 0 {
 | 
				
			||||||
		return ErrNoneFuncs
 | 
							return ErrNoneFuncs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, v := range worker.agents {
 | 
						for _, a := range worker.agents {
 | 
				
			||||||
		if err = v.Connect(); err != nil {
 | 
							if err = a.Connect(); err != nil {
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user