Hi,
I just produce the warning for clarity. sorry for the huge message
==================
WARNING: DATA RACE
Write at 0x00c0002d6480 by goroutine 48:
runtime.mapdelete_faststr()
/usr/local/go/src/runtime/map_faststr.go:297 +0x0
nfnrfapi/services/manag.UpdateNFInstance()
/home/xxx/go/src/nfnrfapi/services/manag/api_nf_instance_id_document_Update.go:48
+0x46d
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
nfnrfapi/common.RecoverHandler.func1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:56 +0xe6
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
github.com/NYTimes/gziphandler.GzipHandlerWithOpts.func1.1()
/home/xxx/go/pkg/mod/github.com/!n!y!times/[email protected]/gzip.go:336
+0x45e
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
github.com/gorilla/mux.(*Router).ServeHTTP()
/home/xxx/go/pkg/mod/github.com/gorilla/[email protected]/mux.go:210 +0x132
nfnrfapi/common.Logging.func1.1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:42 +0xcf
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
nfnrfapi/common.Tracing.func1.1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:26 +0x454
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:2843 +0xca
net/http.initALPNRequest.ServeHTTP()
/usr/local/go/src/net/http/server.go:3415 +0x104
net/http.(*initALPNRequest).ServeHTTP()
<autogenerated>:1 +0xa6
net/http.Handler.ServeHTTP-fm()
/usr/local/go/src/net/http/server.go:87 +0x64
golang.org/x/net/http2.(*serverConn).runHandler()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:2152
+0xc5
Previous read at 0x00c0002d6480 by goroutine 18:
runtime.mapiterinit()
/usr/local/go/src/runtime/map.go:797 +0x0
nfnrfapi/services/manag.PollingWorker()
/home/xxx/go/src/nfnrfapi/services/manag/api_nf_instance_id_document_Update.go:111
+0x604
Goroutine 48 (running) created at:
golang.org/x/net/http2.(*serverConn).processHeaders()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1882
+0x924
golang.org/x/net/http2.(*serverConn).processFrame()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1410
+0x41e
golang.org/x/net/http2.(*serverConn).processFrameFromReader()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1368
+0x7d9
golang.org/x/net/http2.(*serverConn).serve()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:869
+0x14fc
golang.org/x/net/http2.(*Server).ServeConn()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:472
+0xdc4
golang.org/x/net/http2.ConfigureServer.func1()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:298
+0x11e
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:1834 +0x1d5b
Goroutine 18 (running) created at:
main.main()
/home/xxx/go/src/nfnrfapi/main.go:41 +0x2c6
==================
==================
WARNING: DATA RACE
Write at 0x00c0000f7a88 by goroutine 48:
nfnrfapi/services/manag.UpdateNFInstance()
/home/xxx/go/src/nfnrfapi/services/manag/api_nf_instance_id_document_Update.go:50
+0x53c
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
nfnrfapi/common.RecoverHandler.func1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:56 +0xe6
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
github.com/NYTimes/gziphandler.GzipHandlerWithOpts.func1.1()
/home/xxx/go/pkg/mod/github.com/!n!y!times/[email protected]/gzip.go:336
+0x45e
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
github.com/gorilla/mux.(*Router).ServeHTTP()
/home/xxx/go/pkg/mod/github.com/gorilla/[email protected]/mux.go:210 +0x132
nfnrfapi/common.Logging.func1.1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:42 +0xcf
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
nfnrfapi/common.Tracing.func1.1()
/home/xxx/go/src/nfnrfapi/common/middlewares.go:26 +0x454
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2042 +0x51
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:2843 +0xca
net/http.initALPNRequest.ServeHTTP()
/usr/local/go/src/net/http/server.go:3415 +0x104
net/http.(*initALPNRequest).ServeHTTP()
<autogenerated>:1 +0xa6
net/http.Handler.ServeHTTP-fm()
/usr/local/go/src/net/http/server.go:87 +0x64
golang.org/x/net/http2.(*serverConn).runHandler()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:2152
+0xc5
Previous read at 0x00c0000f7a88 by goroutine 18:
nfnrfapi/services/manag.PollingWorker()
/home/xxx/go/src/nfnrfapi/services/manag/api_nf_instance_id_document_Update.go:112
+0x1c4
Goroutine 48 (running) created at:
golang.org/x/net/http2.(*serverConn).processHeaders()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1882
+0x924
golang.org/x/net/http2.(*serverConn).processFrame()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1410
+0x41e
golang.org/x/net/http2.(*serverConn).processFrameFromReader()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:1368
+0x7d9
golang.org/x/net/http2.(*serverConn).serve()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:869
+0x14fc
golang.org/x/net/http2.(*Server).ServeConn()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:472
+0xdc4
golang.org/x/net/http2.ConfigureServer.func1()
/home/xxx/go/pkg/mod/golang.org/x/[email protected]/http2/server.go:298
+0x11e
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:1834 +0x1d5b
Goroutine 18 (running) created at:
main.main()
/home/xxx/go/src/nfnrfapi/main.go:41 +0x2c6
On Friday, November 27, 2020 at 8:14:48 AM UTC+2 Afriyie Abraham Kwabena
wrote:
> Hi,
>
> Yes from the warning it prints the handler function below and after google
> searching what i did was to mutex.Lock and Unlock the handler function and
> no warning again.
> However, my google search people mention of using channels instead of
> mutex. What I would like to ask is, using mutex OK and if not the best way
> of solving it, how can i use
> channels in this case.
>
> Handler function below:
>
> func UpdateNFInstance(response http.ResponseWriter, request *http.Request)
> {
>
> mu.Lock()
> defer mu.Unlock()
>
>
> var (
> localVarHTTPMethod = http.MethodPatch
> ctx = context.Background()
>
> patchItems model.PatchItem
> )
>
> id := config.GetIdFromRequest(request)
>
> if request.Method == localVarHTTPMethod {
>
> if request.Header.Get("Content-Type") !=
> "application/json-patch+json" {
> common.WriteError(response,
> common.ErrStatusUnsupportedMediaTypePatch)
> return
>
> }
>
> err := json.NewDecoder(request.Body).Decode(&patchItems)
> if err != nil {
> common.WriteError(response, common.ErrBadRequest)
> return
> }
>
> defer request.Body.Close()
>
> delete(idtime, id) // delete value in map if exit
>
> idtime[id] = time.Now().Unix()
>
> nfProfile, err := config.Conf.FindNFInstanceProfileById(ctx, id)
> if err != nil {
> common.WriteError(response, common.ErrNotFound)
> return
> }
>
> if patchItems.Path == "/nfStatus" {
>
> nfProfile.NfStatus = patchItems.Value
> nfProfile.LoadTimeStamp = time.Now().String()
>
> success := config.Conf.UpdateNFInstanceHeartBeatNfStatus(ctx,
> nfProfile, id)
> if !success {
> common.WriteError(response, common.ErrInternalServer)
> return
> }
>
> if request.URL.Scheme != "" {
> scheme = request.URL.Scheme
> }
> response.Header().Set("Content-Location",
> scheme+"://"+request.Host+request.URL.Path)
> response.Header().Set("Response-Desc", "Success")
> common.RespondWith3gppJSONPatchJSON(response,
> http.StatusNoContent, nil)
>
> } else {
> // patchItems.Path == "/load" information
> v, err := strconv.Atoi(patchItems.Value)
> if err != nil {
> config.Logrus.Errorf("Failed to convert Patch Item Value
> string to integer: %s", err.Error())
> }
>
> nfProfile.Load = int32(v)
> nfProfile.LoadTimeStamp = time.Now().String()
>
> success := config.Conf.UpdateNFInstanceHeartBeatLoad(ctx,
> nfProfile, id)
> if !success {
> common.WriteError(response, common.ErrInternalServer)
> return
> }
>
> if request.URL.Scheme != "" {
> scheme = request.URL.Scheme
> }
> response.Header().Set("Content-Location",
> scheme+"://"+request.Host+request.URL.Path)
> response.Header().Set("Response-Desc", "Success")
> common.RespondWith3gppJSONPatchJSON(response,
> http.StatusNoContent, nil)
>
> }
> } else {
> common.WriteError(response, common.ErrMethodNotAllowed)
> return
> }
> }
>
>
> BR
> Abraham
>
> On Friday, November 27, 2020 at 6:38:52 AM UTC+2 Shulhan wrote:
>
>>
>>
>> > On 27 Nov 2020, at 07.06, Afriyie Abraham Kwabena <[email protected]>
>> wrote:
>> >
>> > Hi,
>> >
>> > Am experiencing data race warning with my pollingworker function below
>> even though when i build with the -race flag i do not get any error. Any
>> help?
>> >
>>
>> Usually when you got data race warning it will print the line that cause
>> read and write race condition. Pay attention to both lines and I think you
>> will find the cause.
>>
>> It's kind of hard to figure it out only through a single function. It
>> could be in config.Conf or in function that manipulate idtime outside the
>> pollingworker.
>>
>>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/2b9c5058-1f7c-47a1-8d6c-ea74bb565b4cn%40googlegroups.com.