forked from yuxh/gearman-go
		
	Add lock on job handler assignment
Fixes race condition on jobs being done before handler is set.
This commit is contained in:
		
							parent
							
								
									27942f55cd
								
							
						
					
					
						commit
						2dbf199260
					
				@ -31,7 +31,7 @@ type Client struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type responseHandlerMap struct {
 | 
					type responseHandlerMap struct {
 | 
				
			||||||
	sync.RWMutex
 | 
						sync.Mutex
 | 
				
			||||||
	holder map[string]ResponseHandler
 | 
						holder map[string]ResponseHandler
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -46,17 +46,22 @@ func (r *responseHandlerMap) remove(key string) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *responseHandlerMap) get(key string) (ResponseHandler, bool) {
 | 
					func (r *responseHandlerMap) get(key string) (ResponseHandler, bool) {
 | 
				
			||||||
	r.RLock()
 | 
						r.Lock()
 | 
				
			||||||
	rh, b := r.holder[key]
 | 
						rh, b := r.holder[key]
 | 
				
			||||||
	r.RUnlock()
 | 
						r.Unlock()
 | 
				
			||||||
	return rh, b
 | 
						return rh, b
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *responseHandlerMap) put(key string, rh ResponseHandler) {
 | 
					func (r *responseHandlerMap) put(key string, rh ResponseHandler) {
 | 
				
			||||||
	r.Lock()
 | 
						r.Lock()
 | 
				
			||||||
	r.holder[key] = rh
 | 
						r.holder[key] = rh
 | 
				
			||||||
	r.Unlock()
 | 
						r.Unlock()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *responseHandlerMap) putNoLock(key string, rh ResponseHandler) {
 | 
				
			||||||
 | 
						r.holder[key] = rh
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Return a client.
 | 
					// Return a client.
 | 
				
			||||||
func New(network, addr string) (client *Client, err error) {
 | 
					func New(network, addr string) (client *Client, err error) {
 | 
				
			||||||
	client = &Client{
 | 
						client = &Client{
 | 
				
			||||||
@ -266,9 +271,12 @@ func (client *Client) Do(funcname string, data []byte,
 | 
				
			|||||||
	default:
 | 
						default:
 | 
				
			||||||
		datatype = dtSubmitJob
 | 
							datatype = dtSubmitJob
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client.respHandler.Lock()
 | 
				
			||||||
 | 
						defer client.respHandler.Unlock()
 | 
				
			||||||
	handle, err = client.do(funcname, data, datatype)
 | 
						handle, err = client.do(funcname, data, datatype)
 | 
				
			||||||
	if err == nil && h != nil {
 | 
						if err == nil && h != nil {
 | 
				
			||||||
		client.respHandler.put(handle, h)
 | 
							client.respHandler.putNoLock(handle, h)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user