Fixed a bug, that encoding the job but without the handle infomation.
This commit is contained in:
parent
a6fab88b22
commit
bf0c48b87f
@ -112,12 +112,11 @@ func (worker * Worker) Work() {
|
|||||||
switch job.dataType {
|
switch job.dataType {
|
||||||
case NO_JOB:
|
case NO_JOB:
|
||||||
// do nothing
|
// do nothing
|
||||||
log.Println(job)
|
|
||||||
case ERROR:
|
case ERROR:
|
||||||
log.Println(string(job.Data))
|
log.Println(string(job.Data))
|
||||||
case JOB_ASSIGN, JOB_ASSIGN_UNIQ:
|
case JOB_ASSIGN, JOB_ASSIGN_UNIQ:
|
||||||
if err := worker.exec(job); err != nil {
|
if err := worker.exec(job); err != nil {
|
||||||
log.Panicln(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
default:
|
default:
|
||||||
@ -154,6 +153,7 @@ func (worker * Worker) WriteJob(job *Job) (err os.Error) {
|
|||||||
e := make(chan os.Error)
|
e := make(chan os.Error)
|
||||||
for _, v := range worker.clients {
|
for _, v := range worker.clients {
|
||||||
go func() {
|
go func() {
|
||||||
|
log.Println(v)
|
||||||
e <- v.WriteJob(job)
|
e <- v.WriteJob(job)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@ -189,7 +189,13 @@ func (worker * Worker) exec(job *Job) (err os.Error) {
|
|||||||
job.UniqueId = string(jobdata[2])
|
job.UniqueId = string(jobdata[2])
|
||||||
job.Data = jobdata[3]
|
job.Data = jobdata[3]
|
||||||
}
|
}
|
||||||
result, err := worker.functions[funcname](job)
|
f := worker.functions[funcname]
|
||||||
|
if f == nil {
|
||||||
|
return os.NewError("function is nil")
|
||||||
|
}
|
||||||
|
result, err := f(job)
|
||||||
|
log.Println(result)
|
||||||
|
log.Println(err)
|
||||||
var datatype uint32
|
var datatype uint32
|
||||||
if err == nil {
|
if err == nil {
|
||||||
datatype = WORK_COMPLETE
|
datatype = WORK_COMPLETE
|
||||||
@ -200,23 +206,27 @@ func (worker * Worker) exec(job *Job) (err os.Error) {
|
|||||||
datatype = WORK_EXCEPTION
|
datatype = WORK_EXCEPTION
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
worker.WriteJob(NewJob(REQ, datatype, result))
|
job.magicCode = REQ
|
||||||
|
job.dataType = datatype
|
||||||
|
job.Data = result
|
||||||
|
|
||||||
|
worker.WriteJob(job)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func splitByteArray(slice []byte, spot byte) (data [][]byte){
|
func splitByteArray(slice []byte, spot byte) (data [][]byte){
|
||||||
data = make([][]byte, 0, 10)
|
data = make([][]byte, 0, 10)
|
||||||
log.Println(data)
|
|
||||||
start, end := 0, 0
|
start, end := 0, 0
|
||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
if v == spot {
|
if v == spot {
|
||||||
if start != end {
|
if start != end {
|
||||||
data = append(data, slice[start:end])
|
data = append(data, slice[start:end])
|
||||||
}
|
}
|
||||||
start, end = i, i
|
start, end = i + 1, i + 1
|
||||||
} else {
|
} else {
|
||||||
end ++
|
end ++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
data = append(data, slice[start:])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package gearman
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Job struct {
|
type Job struct {
|
||||||
@ -42,23 +43,27 @@ func DecodeJob(data []byte) (job *Job, err os.Error) {
|
|||||||
if len(data[12:]) != int(l) {
|
if len(data[12:]) != int(l) {
|
||||||
return nil, os.NewError("Invalid data length.")
|
return nil, os.NewError("Invalid data length.")
|
||||||
}
|
}
|
||||||
switch(byteToUint32([4]byte{data[4], data[5], data[6], data[7]})) {
|
|
||||||
case ECHO_RES:
|
|
||||||
data = data[12:]
|
data = data[12:]
|
||||||
}
|
|
||||||
return NewJob(REQ, datatype, data), err
|
return NewJob(REQ, datatype, data), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (job *Job) Encode() (data []byte) {
|
func (job *Job) Encode() (data []byte) {
|
||||||
magiccode := uint32ToByte(job.magicCode)
|
magiccode := uint32ToByte(job.magicCode)
|
||||||
datatype := uint32ToByte(job.dataType)
|
datatype := uint32ToByte(job.dataType)
|
||||||
|
data = make([]byte, 0, 1024 * 64)
|
||||||
|
data = append(data, magiccode[:] ...)
|
||||||
|
data = append(data, datatype[:] ...)
|
||||||
|
data = append(data, []byte{0, 0, 0, 0} ...)
|
||||||
l := len(job.Data)
|
l := len(job.Data)
|
||||||
|
if job.Handle != "" {
|
||||||
|
data = append(data, []byte(job.Handle) ...)
|
||||||
|
data = append(data, 0)
|
||||||
|
l += len(job.Handle) + 1
|
||||||
|
}
|
||||||
|
data = append(data, job.Data ...)
|
||||||
datalength := uint32ToByte(uint32(l))
|
datalength := uint32ToByte(uint32(l))
|
||||||
data = make([]byte, 12 + l)
|
|
||||||
copy(data[:4], magiccode[:])
|
|
||||||
copy(data[4:8], datatype[:])
|
|
||||||
copy(data[8:12], datalength[:])
|
copy(data[8:12], datalength[:])
|
||||||
copy(data[12:], job.Data)
|
log.Println(data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package gearman
|
|||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
// "log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type jobClient struct {
|
type jobClient struct {
|
||||||
@ -22,6 +22,7 @@ func newJobClient(addr string, incoming chan *Job) (jobclient *jobClient, err os
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (client *jobClient) Work() (err os.Error) {
|
func (client *jobClient) Work() (err os.Error) {
|
||||||
|
log.Println("Job client work().")
|
||||||
noop := true
|
noop := true
|
||||||
for client.running {
|
for client.running {
|
||||||
// grab job
|
// grab job
|
||||||
@ -65,6 +66,7 @@ func (client *jobClient) WriteJob(job * Job) (err os.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (client *jobClient) Write(buf []byte) (err os.Error) {
|
func (client *jobClient) Write(buf []byte) (err os.Error) {
|
||||||
|
log.Println(buf)
|
||||||
var n int
|
var n int
|
||||||
for i := 0; i < len(buf); i += n {
|
for i := 0; i < len(buf); i += n {
|
||||||
n, err = client.conn.Write(buf[i:])
|
n, err = client.conn.Write(buf[i:])
|
||||||
|
Loading…
Reference in New Issue
Block a user