Hi,
Am experiancing 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?
func PollingWorker() {
tiker := time.NewTicker(60 * time.Second)
for _ = range tiker.C {
mu.Lock()
for keyid := range idtime {
d := time.Now().Unix() - idtime[keyid]
if d >= 60 {
// Find nfinstance using keyid
nfinstanceProfile, err :=
config.Conf.FindNFInstanceProfileById(ctx, keyid)
if err != nil {
config.Logrus.Error("Could not find NF Instance Profile
with ID :" + keyid + " to SUSPEND Status")
}
// change nfStatus of nfinstance to SUSPENDED
err = config.Conf.SuspendNFInstanceNfStatus(ctx,
nfinstanceProfile, keyid)
if err != nil {
config.Logrus.Error(err)
}
delete(idtime, keyid)
}
}
mu.Unlock()
}
}
BR
Abraham
On Wednesday, November 18, 2020 at 10:51:49 AM UTC+2 Afriyie Abraham
Kwabena wrote:
> Hi Sulhan, Anderson,
>
> Thanks for your guidance. It works now using time.Ticker
>
> func worker() {
> tiker := time.NewTicker(30 * time.Second)
> for _ = range tiker.C {
>
> mu.Lock()
> for keyid := range idtime {
>
> d := time.Now().Unix() - idtime[keyid]
> if d >= 60 {
> // delete resouce in database after 60 seconds
> _ = DeleteNFInstance(ctx, keyid)
> }
> }
> mu.Unlock()
> }
> }
>
> BR
> Abraham
>
>
>
> On Tuesday, November 17, 2020 at 9:41:01 PM UTC+2 Shulhan wrote:
>
>>
>>
>> > On 18 Nov 2020, at 01.06, Afriyie Abraham Kwabena <[email protected]>
>> wrote:
>> >
>> > Hi,
>> >
>> > The UpdateData function is the HTTP handler for the route which matches
>> the URL and is called after the mux.Router after receiving an incoming
>> request matches the incoming request
>> > against the registered route.
>>
>> ...
>>
>> > var idtime = make(map[string]int64)
>> >
>> >
>> > func UpdateData(response http.ResponseWriter, request *http.Request) {
>> >
>> > var (
>> > localVarHTTPMethod = http.MethodPatch
>> > patchItems model.PatchItem
>> > )
>> >
>> > id := config.GetIdFromRequest(request)
>> >
>> > if request.Method == localVarHTTPMethod {
>> >
>> > err := json.NewDecoder(request.Body).Decode(&patchItems)
>> > if err != nil {
>> > common.WriteError(response, common.ErrBadRequest)
>> > return
>> > }
>> >
>> > defer request.Body.Close()
>> >
>> > idtime[id] = time.Now().Unix()
>> >
>>
>> We still may have data race here.
>>
>> >
>> > func worker() {
>> > mu.Lock()
>> > for keyid := range idtime {
>> >
>> > d := time.Now().Unix() - idtime[keyid]
>> > if d >= 60 {
>> >
>> > // delete resouce in database after 60 seconds
>> > _ = DeleteNFInstance(ctx, keyid)
>> > }
>> > }
>> > mu.Unlock()
>> > }
>> >
>>
>> ...
>>
>> > // main function
>> > func main() {
>> > r := NewRouter()
>> >
>> > go worker()
>> >
>> >
>> > fmt.Println("Start listening")
>> > fmt.Println(http.ListenAndServe(":8080", r))
>> > }
>> >
>> > I appreciate your help but am still not able to it work.
>> >
>>
>> Looks like your worker only loop once and then it finished. Either you
>> use time.Sleep() to repeat the loop inside loop or use time.Ticker [1].
>>
>> [1] https://pkg.go.dev/time#Ticker
>>
>>
--
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/9db5a074-0b0a-4f3a-ab20-7c5d67f458a0n%40googlegroups.com.