github-vet / github-vet/rangeloop-pointer-findings

zhanghjster/go-gearman: worker.go; 83 LoC

Open
#7,258 0 comments 0 reactions 0 assignees View on GitHub
fresh medium
Dominant language
No language data
Stars
0
Forks
0
PR merge metrics
PR metrics pending

Description

Found a possible issue in [zhanghjster/go-gearman](https://www.github.com/zhanghjster/go-gearman) at [worker.go](https://github.com/zhanghjster/go-gearman/blob/6461511c2f8fec3914300e59561ea4e6f6894906/worker.go#L164-L246)

Below is the message reported by the analyzer for this snippet of code. Beware that the analyzer only reports the first
issue it finds, so please do not limit your consideration to the contents of the below message.

> range-loop variable s used in defer or goroutine at line 183

[Click here to see the code in its original context.](https://github.com/zhanghjster/go-gearman/blob/6461511c2f8fec3914300e59561ea4e6f6894906/worker.go#L164-L246)

Click here to show the 83 line(s) of Go which triggered the analyzer.

```go
for _, s := range w.server {
w.noopFlag[s] = make(FlagChan)

wg.Add(1)
go func(server string) {
defer wg.Done()

for {
w.descJobs()

// retrieve next job
var req = newRequestToServerWithType(server, PtGrabJobAll)

resp, err := w.sender.sendAndWaitResp(req)
if err != nil {
Log.Printf("send grab req to %s fail, %s", server, err.Error())
return
}

Log.Printf("send grab request to %s suc", s)

switch resp.Type {
case PtNoJob:
// send pre sleep then Wait for wake up signal
var req = newRequestToServerWithType(server, PtPreSleep)
peer, err := w.sender.send(req)
if err != nil {
Log.Printf("send pre sleep packet to %s fail, %s", server, err)
return
}

Log.Printf("job retriever for %s Wait for weekup", server)

select {
case <-w.noopFlag[server]:
Log.Printf("job retriever for %s weekup", server)
case <-peer.Closed():
Log.Printf("job retriever for %s err. ", err.Error())
}
case PtJobAssign, PtJobAssignUnique, PtJobAssignAll:
go func(resp *Response) {
defer w.descJobs()

var job = &Job{w: w, resp: resp}

funcName, _ := job.resp.GetFuncName()
handle, ok := w.jobHandles[funcName]
if !ok {
Log.Printf("no worker handle found for job %s", funcName)
return
}

handleId, err := job.resp.GetHandle()
if err != nil {
log.Printf("get job handle err, %s", err)
return
}

// handle the job
data, err := handle(job)

var req = newRequestTo(server)
// set req type
if err != nil {
req.SetType(PtWorkFail)
} else {
req.SetType(PtWorkComplete)
req.SetData(data)
}

if err = req.SetHandle(handleId); err != nil {
log.Printf("req set handle err, %s", err.Error())
return
}

if _, err := w.sender.send(req); err != nil {
Log.Printf("send job result request %d err, %s", req.Type, err.Error())
}
}(resp)
}
}
}(s)
}

```

Leave a reaction on this issue to contribute to the project by classifying this instance as a **Bug** :-1:, **Mitigated** :+1:, or **Desirable Behavior** :rocket:
See the descriptions of the classifications [here](https://github.com/github-vet/rangeclosure-findings#how-can-i-help) for more information.

commit ID: 6461511c2f8fec3914300e59561ea4e6f6894906

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.