hey, I'm working on a program which I need to lock some keys
in Redis every 10 second and do some operations! how ever I have faced a strange problem. these is part of my code which works every 10 seconds:
keys, err := services.GetAllKeys(tempKey)
if err != nil {
continue
}
for _, key := range keys
go processDeviceLogs(key)
}
The way it works is that it gets all the keys I want to use (keys
) and passes them to a go routine
, inside the routine:
lock, err := services.ObtainLock(key)
which services.ObtainLock
looks like
func ObtainLock(key string) (*redislock.Lock, error) {
lock, err := BeethovenCacheProvider.Locker.Obtain(key, 200*time.Millisecond, nil)
if err == redislock.ErrNotObtained {
log.Errorf("Could not obtain lock: %v", err)
return lock, err
} else if err != nil {
log.Errorf("Error when locking key %v : %v", key, err)
return lock, err
}
return lock, nil
}
The problem is that the locking mechanism does not work and none of the keys get locked! I did some debugging add added some statements:
keys, err := services.GetAllKeys(tempKey)
if err != nil {
continue
}
for _, key := range keys{
lock, err := services.BeethovenCacheProvider.Locker.Obtain("device_log:-:device_id:-:1", 200*time.Second, nil)
lock2, err := services.BeethovenCacheProvider.Locker.Obtain("device_log:-:device_id:-:2", 200*time.Second, nil)
if err == redislock.ErrNotObtained {
log.Errorf("Could not obtain lock for key %v : %v", "device_log:-:device_id:-:1", err)
} else if err != nil {
log.Errorf("Error when locking key %v : %v", "device_log:-:device_id:-:1", err)
}
time.Sleep(100 * time.Second)
_ = lock
_ = lock2
_ = key
//go processDeviceLogs(key)
}
after checking each part I understood that the problem is no related to the go-routine
or getting the keys
from Redis and not even using the keys!, the problem was actually the for loop! so the above code doesn't work but when I change the for loop to :
keys, err := services.GetAllKeys(tempKey)
if err != nil {
continue
}
_ =keys
for i := 1; i < 5; i++{
lock, err := services.BeethovenCacheProvider.Locker.Obtain("device_log:-:device_id:-:1", 200*time.Second, nil)
lock2, err := services.BeethovenCacheProvider.Locker.Obtain("device_log:-:device_id:-:2", 200*time.Second, nil)
if err == redislock.ErrNotObtained {
log.Errorf("Could not obtain lock for key %v : %v", "device_log:-:device_id:-:1", err)
} else if err != nil {
log.Errorf("Error when locking key %v : %v", "device_log:-:device_id:-:1", err)
}
time.Sleep(100 * time.Second)
_ = lock
_ = lock2
//_ = key
//go processDeviceLogs(key)
}
the above code works just fine and I just changed the for loop ... I really don't get what is happening but I would appreciate some help. Thanks for your library.