forked from yuxh/gearman-go
		
	#14 fixed
This commit is contained in:
		
							parent
							
								
									2107c9b883
								
							
						
					
					
						commit
						8e009be940
					
				@ -350,16 +350,20 @@ func (client *Client) Status(handle string, timeout time.Duration) (status *Stat
 | 
				
			|||||||
    client.writeJob(newJob(common.REQ, common.GET_STATUS, []byte(handle)))
 | 
					    client.writeJob(newJob(common.REQ, common.GET_STATUS, []byte(handle)))
 | 
				
			||||||
    select {
 | 
					    select {
 | 
				
			||||||
    case status = <-client.status:
 | 
					    case status = <-client.status:
 | 
				
			||||||
    case <-time.NewTimer(timeout).C:
 | 
					    case <-time.After(timeout):
 | 
				
			||||||
        err = common.ErrTimeOut
 | 
					        err = common.ErrTimeOut
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Send a something out, get the samething back.
 | 
					// Send a something out, get the samething back.
 | 
				
			||||||
func (client *Client) Echo(data []byte) (r []byte) {
 | 
					func (client *Client) Echo(data []byte, timeout time.Duration) (r []byte, err error) {
 | 
				
			||||||
    client.writeJob(newJob(common.REQ, common.ECHO_REQ, data))
 | 
					    client.writeJob(newJob(common.REQ, common.ECHO_REQ, data))
 | 
				
			||||||
    r = <-client.echo
 | 
					    select {
 | 
				
			||||||
 | 
					    case r = <-client.echo:
 | 
				
			||||||
 | 
					    case <-time.After(timeout):
 | 
				
			||||||
 | 
					        err = common.ErrTimeOut
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
package client
 | 
					package client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
					    "time"
 | 
				
			||||||
    "testing"
 | 
					    "testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -19,10 +20,14 @@ func TestClientAddServer(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestClientEcho(t *testing.T) {
 | 
					func TestClientEcho(t *testing.T) {
 | 
				
			||||||
    if echo := string(client.Echo([]byte("Hello world"))); echo == "Hello world" {
 | 
					    echo, err := client.Echo([]byte("Hello world"), time.Second)
 | 
				
			||||||
        t.Log(echo)
 | 
					    if err != nil {
 | 
				
			||||||
    } else {
 | 
					        t.Error(err)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if string(echo) != "Hello world" {
 | 
				
			||||||
        t.Errorf("Invalid echo data: %s", echo)
 | 
					        t.Errorf("Invalid echo data: %s", echo)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -30,8 +35,6 @@ func TestClientDoBg(t *testing.T) {
 | 
				
			|||||||
    if handle := client.DoBg("ToUpper", []byte("abcdef"),
 | 
					    if handle := client.DoBg("ToUpper", []byte("abcdef"),
 | 
				
			||||||
        JOB_LOW); handle == "" {
 | 
					        JOB_LOW); handle == "" {
 | 
				
			||||||
        t.Error("Handle is empty.")
 | 
					        t.Error("Handle is empty.")
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        t.Log(handle)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,21 +58,33 @@ func TestClientDo(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestClientStatus(t *testing.T) {
 | 
					func TestClientStatus(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s1 := client.Status("handle not exists")
 | 
					    s1, err := client.Status("handle not exists", time.Second)
 | 
				
			||||||
 | 
					    if err != nil {
 | 
				
			||||||
 | 
					        t.Error(err)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if s1.Known {
 | 
					    if s1.Known {
 | 
				
			||||||
        t.Errorf("The job (%s) shouldn't be known.", s1.Handle)
 | 
					        t.Errorf("The job (%s) shouldn't be known.", s1.Handle)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if s1.Running {
 | 
					    if s1.Running {
 | 
				
			||||||
        t.Errorf("The job (%s) shouldn't be running.", s1.Handle)
 | 
					        t.Errorf("The job (%s) shouldn't be running.", s1.Handle)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    handle := client.Do("Delay5sec", []byte("abcdef"), JOB_LOW, nil);
 | 
					    handle := client.Do("Delay5sec", []byte("abcdef"), JOB_LOW, nil);
 | 
				
			||||||
    s2 := client.Status(handle)
 | 
					    s2, err := client.Status(handle, time.Second)
 | 
				
			||||||
 | 
					    if err != nil {
 | 
				
			||||||
 | 
					        t.Error(err)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if !s2.Known {
 | 
					    if !s2.Known {
 | 
				
			||||||
        t.Errorf("The job (%s) should be known.", s2.Handle)
 | 
					        t.Errorf("The job (%s) should be known.", s2.Handle)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if s2.Running {
 | 
					    if s2.Running {
 | 
				
			||||||
        t.Errorf("The job (%s) shouldn't be running.", s2.Handle)
 | 
					        t.Errorf("The job (%s) shouldn't be running.", s2.Handle)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -85,7 +85,6 @@ func (pool *Pool) Add(addr string, rate int) (err error) {
 | 
				
			|||||||
        var client *Client
 | 
					        var client *Client
 | 
				
			||||||
        client, err = New(addr)
 | 
					        client, err = New(addr)
 | 
				
			||||||
        item = &poolClient{Client: client, Rate: rate}
 | 
					        item = &poolClient{Client: client, Rate: rate}
 | 
				
			||||||
        err = item.connect()
 | 
					 | 
				
			||||||
        pool.clients[addr] = item
 | 
					        pool.clients[addr] = item
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
@ -126,7 +125,7 @@ func (pool *Pool) Status(addr, handle string, timeout time.Duration) (status *St
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Send a something out, get the samething back.
 | 
					// Send a something out, get the samething back.
 | 
				
			||||||
func (pool *Pool) Echo(addr string, data []byte) (r []byte, err error) {
 | 
					func (pool *Pool) Echo(addr string, data []byte, timeout time.Duration) (r []byte, err error) {
 | 
				
			||||||
    var client *poolClient
 | 
					    var client *poolClient
 | 
				
			||||||
    if addr == "" {
 | 
					    if addr == "" {
 | 
				
			||||||
        client = pool.selectServer()
 | 
					        client = pool.selectServer()
 | 
				
			||||||
@ -137,7 +136,7 @@ func (pool *Pool) Echo(addr string, data []byte) (r []byte, err error) {
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    r = client.Echo(data)
 | 
					    r, err = client.Echo(data, timeout)
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
package client
 | 
					package client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
					    "time"
 | 
				
			||||||
    "testing"
 | 
					    "testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -22,17 +23,17 @@ func TestPoolAdd(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestPoolEcho(t *testing.T) {
 | 
					func TestPoolEcho(t *testing.T) {
 | 
				
			||||||
    echo, err := pool.Echo("", []byte("Hello world"))
 | 
					    echo, err := pool.Echo("", []byte("Hello pool"), time.Second)
 | 
				
			||||||
    if err != nil {
 | 
					    if err != nil {
 | 
				
			||||||
        t.Error(err)
 | 
					        t.Error(err)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if string(echo) != "Hello world" {
 | 
					    if string(echo) != "Hello pool" {
 | 
				
			||||||
        t.Errorf("Invalid echo data: %s", echo)
 | 
					        t.Errorf("Invalid echo data: %s", echo)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _, err = pool.Echo("not exists", []byte("Hello world"))
 | 
					    _, err = pool.Echo("not exists", []byte("Hello pool"), time.Second)
 | 
				
			||||||
    if err != ErrNotFound {
 | 
					    if err != ErrNotFound {
 | 
				
			||||||
        t.Errorf("ErrNotFound expected, got %s", err)
 | 
					        t.Errorf("ErrNotFound expected, got %s", err)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -66,7 +67,7 @@ func TestPoolDo(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestPoolStatus(t *testing.T) {
 | 
					func TestPoolStatus(t *testing.T) {
 | 
				
			||||||
    s1, err := pool.Status("127.0.0.1:4730", "handle not exists")
 | 
					    s1, err := pool.Status("127.0.0.1:4730", "handle not exists", time.Second)
 | 
				
			||||||
    if err != nil {
 | 
					    if err != nil {
 | 
				
			||||||
        t.Error(err)
 | 
					        t.Error(err)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
@ -79,7 +80,7 @@ func TestPoolStatus(t *testing.T) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addr, handle := pool.Do("Delay5sec", []byte("abcdef"), JOB_LOW, nil);
 | 
					    addr, handle := pool.Do("Delay5sec", []byte("abcdef"), JOB_LOW, nil);
 | 
				
			||||||
    s2, err := pool.Status(addr, handle)
 | 
					    s2, err := pool.Status(addr, handle, time.Second)
 | 
				
			||||||
    if err != nil {
 | 
					    if err != nil {
 | 
				
			||||||
        t.Error(err)
 | 
					        t.Error(err)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
@ -92,7 +93,7 @@ func TestPoolStatus(t *testing.T) {
 | 
				
			|||||||
        t.Errorf("The job (%s) shouldn't be running.", s2.Handle)
 | 
					        t.Errorf("The job (%s) shouldn't be running.", s2.Handle)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _, err = pool.Status("not exists", "not exists")
 | 
					    _, err = pool.Status("not exists", "not exists", time.Second)
 | 
				
			||||||
    if err != ErrNotFound {
 | 
					    if err != ErrNotFound {
 | 
				
			||||||
        t.Error(err)
 | 
					        t.Error(err)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,11 @@ func main() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    echo := []byte("Hello\x00 world")
 | 
					    echo := []byte("Hello\x00 world")
 | 
				
			||||||
    wg.Add(1)
 | 
					    wg.Add(1)
 | 
				
			||||||
    log.Println(string(c.Echo(echo)))
 | 
					    echomsg, err := c.Echo(echo, time.Second)
 | 
				
			||||||
 | 
					    if err != nil {
 | 
				
			||||||
 | 
					        log.Fatalln(err)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    log.Println(string(echomsg))
 | 
				
			||||||
    wg.Done()
 | 
					    wg.Done()
 | 
				
			||||||
    jobHandler := func(job *client.Job) {
 | 
					    jobHandler := func(job *client.Job) {
 | 
				
			||||||
        log.Printf("%s", job.Data)
 | 
					        log.Printf("%s", job.Data)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								example/worker
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								example/worker
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@ -91,8 +91,11 @@ func (a *agent) inLoop() {
 | 
				
			|||||||
        case common.NOOP:
 | 
					        case common.NOOP:
 | 
				
			||||||
            a.WriteJob(newJob(common.REQ, common.GRAB_JOB_UNIQ, nil))
 | 
					            a.WriteJob(newJob(common.REQ, common.GRAB_JOB_UNIQ, nil))
 | 
				
			||||||
        case common.ERROR, common.ECHO_RES, common.JOB_ASSIGN_UNIQ, common.JOB_ASSIGN:
 | 
					        case common.ERROR, common.ECHO_RES, common.JOB_ASSIGN_UNIQ, common.JOB_ASSIGN:
 | 
				
			||||||
            job.agent = a
 | 
					 | 
				
			||||||
            if a.worker.running {
 | 
					            if a.worker.running {
 | 
				
			||||||
 | 
					                if a.worker.limit != nil {
 | 
				
			||||||
 | 
					                    a.worker.limit <- true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                job.agent = a
 | 
				
			||||||
                a.worker.in <- job
 | 
					                a.worker.in <- job
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -110,7 +110,7 @@ func (job *Job) UpdateData(data []byte, iswarning bool) {
 | 
				
			|||||||
func (job *Job) UpdateStatus(numerator, denominator int) {
 | 
					func (job *Job) UpdateStatus(numerator, denominator int) {
 | 
				
			||||||
    n := []byte(strconv.Itoa(numerator))
 | 
					    n := []byte(strconv.Itoa(numerator))
 | 
				
			||||||
    d := []byte(strconv.Itoa(denominator))
 | 
					    d := []byte(strconv.Itoa(denominator))
 | 
				
			||||||
    result := append([]byte(job.Handle), 0)
 | 
					    result := append([]byte(job.Handle), '\x00')
 | 
				
			||||||
    result = append(result, n...)
 | 
					    result = append(result, n...)
 | 
				
			||||||
    result = append(result, '\x00')
 | 
					    result = append(result, '\x00')
 | 
				
			||||||
    result = append(result, d...)
 | 
					    result = append(result, d...)
 | 
				
			||||||
 | 
				
			|||||||
@ -73,9 +73,6 @@ func New(l int) (worker *Worker) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if l != Unlimited {
 | 
					    if l != Unlimited {
 | 
				
			||||||
        worker.limit = make(chan bool, l)
 | 
					        worker.limit = make(chan bool, l)
 | 
				
			||||||
        for i := 0; i < l; i ++ {
 | 
					 | 
				
			||||||
            worker.limit <- true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -165,7 +162,7 @@ func (worker *Worker) dealJob(job *Job) {
 | 
				
			|||||||
    defer func() {
 | 
					    defer func() {
 | 
				
			||||||
        job.Close()
 | 
					        job.Close()
 | 
				
			||||||
        if worker.running && worker.limit != nil {
 | 
					        if worker.running && worker.limit != nil {
 | 
				
			||||||
            worker.limit <- true
 | 
					            <-worker.limit
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }()
 | 
					    }()
 | 
				
			||||||
    switch job.DataType {
 | 
					    switch job.DataType {
 | 
				
			||||||
@ -199,9 +196,6 @@ func (worker *Worker) Work() {
 | 
				
			|||||||
    for ok {
 | 
					    for ok {
 | 
				
			||||||
        var job *Job
 | 
					        var job *Job
 | 
				
			||||||
        if job, ok = <-worker.in; ok {
 | 
					        if job, ok = <-worker.in; ok {
 | 
				
			||||||
            if worker.limit != nil {
 | 
					 | 
				
			||||||
                <-worker.limit
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            go worker.dealJob(job)
 | 
					            go worker.dealJob(job)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user