Skip to content

Commit

Permalink
MDL-83753 redis: Allow for configurable max retries setting
Browse files Browse the repository at this point in the history
  • Loading branch information
djarran committed Dec 18, 2024
1 parent 209072a commit 9262145
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
1 change: 1 addition & 0 deletions config-dist.php
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@
// $CFG->session_redis_lock_retry = 100; // Optional wait between lock attempts in ms, default is 100.
// // After 5 seconds it will throttle down to once per second.
// $CFG->session_redis_connection_timeout = 3; // Optional wait for connection or response from Redis server.
// $CFG->session_redis_maxretries = 3; // Optional number of retries when connecting to Redis server.
//
// Use the igbinary serializer instead of the php default one. Note that phpredis must be compiled with
// igbinary support to make the setting to work. Also, if you change the serializer you have to flush the database!
Expand Down
10 changes: 7 additions & 3 deletions lib/classes/session/redis.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class redis extends handler implements SessionHandlerInterface {
protected bool $clustermode = false;

/** @var int Maximum number of retries for cache store operations. */
const MAX_RETRIES = 5;
protected int $maxretries = 5;

/** @var int $firstaccesstimeout The initial timeout (seconds) for the first browser access without login. */
protected int $firstaccesstimeout = 180;
Expand Down Expand Up @@ -208,6 +208,10 @@ public function __construct() {
$this->connectiontimeout = (int)$CFG->session_redis_connection_timeout;
}

if (isset($CFG->session_redis_max_retries)) {
$this->maxretries = (int)$CFG->session_redis_max_retries;
}

$this->clock = di::get(clock::class);
}

Expand Down Expand Up @@ -285,7 +289,7 @@ public function init(): bool {
// MDL-59866: Add retries for connections (up to 5 times) to make sure it goes through.
$counter = 1;
$exceptionclass = $this->clustermode ? 'RedisClusterException' : 'RedisException';
while ($counter <= self::MAX_RETRIES) {
while ($counter <= $this->maxretries) {
$this->connection = null;
// Make a connection to Redis server(s).
try {
Expand Down Expand Up @@ -387,7 +391,7 @@ public function init(): bool {
return true;
} catch (RedisException | RedisClusterException $e) {
$redishost = $this->clustermode ? implode(',', $this->host) : $server . ':' . $port;
$logstring = "Failed to connect (try {$counter} out of " . self::MAX_RETRIES . ") to Redis ";
$logstring = "Failed to connect (try {$counter} out of " . $this->maxretries . ") to Redis ";
$logstring .= "at ". $redishost .", the error returned was: {$e->getMessage()}";
debugging($logstring);
}
Expand Down

0 comments on commit 9262145

Please sign in to comment.