yii\redis\Mutex expiration is not working like I think, or, more likely, I don’t understand things like I think.
I have an issue where my mutexes expire when I don’t expect them to. Honestly, I just don’t have a good handle on the expiration at all. #help
Okay, here is my configuration to start things off:
<?php
// http://stuff.cebe.cc/yii2docs/yii-redis-mutex.html
$config['components']['mutex'] = [
'class' => 'yii\redis\Mutex',
// auto-expire after 1 day just in case; oddly, this defaults to
// 30 seconds!? if you leave this at 30s, then you'll have a lot
// of process overlap, e.g., in yii2-scheduler.
'expire' => 60 * 30, // 30 min
// bug: for whatever reason, if this is not set the mutex
// doesn't seem to do anything?
'autoRelease' => true,
'redis' => [
'hostname' => $_SERVER['REDIS_HOSTNAME'],
'port' => $_SERVER['REDIS_PORT'],
'database' => $_SERVER['REDIS_DB_MUTEX'],
],
];
What I’m finding is my lock expires very quickly. Like, in a minute or so.
Here is an example of getting a mutex to lock some work:
$mutex = new \yii\redis\Mutex();
if ($mutex->acquire($key, Yii::$app->params['default.mutexLockTimeout'])) {
return $mutex;
} else {
throw new \Exception('Unable to acquire lock: ' . $key);
}
Seems standard. Yet, a lot of times when I try to release the mutex I get a warning that it doesn’t exist. Here is an example of that:
if (!$mutex->release($key)) {
$msg = sprintf('Invalid key to release: ' . $key);
//throw new \yii\web\ServerErrorHttpException($msg);
\Yii::error($msg, __METHOD__);
}
Again, this doesn’t take 30 minutes per my mutex component config, it happens in a minute.
What am I doing wrong/misunderstanding?
My redis is just stock redis on Ubuntu. Nothing special and no customized configuration. I wouldn’t think it should matter but FYI.