TT#177700 handle slow KeyDB startup

KeyDB notifies systemd prematurely about its readiness, while it might
still be loading data from persistent storage or from its replication
master. It refuses access to its databases during that time, so make
mediator sleep/retry a few times to handle this.

Change-Id: Ieff52bc9f92697385f300c6fba26ace03fde78f6
mr11.0
Richard Fuchs 3 years ago
parent 5ae3e4e0b9
commit 097cd85911

@ -422,7 +422,7 @@ static med_entry_t *medredis_reply_to_entry(redisReply *reply, const char* cid,
/**********************************************************************/
int medredis_init() {
static int medredis_init_one(void) {
struct timeval tv;
redisReply *reply;
@ -472,7 +472,7 @@ int medredis_init() {
medredis_free_reply(&reply);
reply = redisCommand(con->ctx, "SCRIPT LOAD %s", SREM_KEY_LUA);
medredis_check_reply("SELECT", reply, err);
medredis_check_reply("SCRIPT LOAD", reply, err);
if (reply->type != REDIS_REPLY_STRING || reply->len >= sizeof(medredis_srem_key_lua)) {
L_ERROR("Invalid reply from SCRIPT LOAD: %i/%lu\n", reply->type, (unsigned long) reply->len);
goto err;
@ -497,6 +497,18 @@ err:
}
return -1;
}
int medredis_init() {
int i = 0;
static const int max_retries = 10;
while (1) {
if (medredis_init_one() == 0)
return 0;
if (i++ >= max_retries)
return -1;
L_ERROR("Redis connection init failed, retry attempt #%i/%i\n", i, max_retries);
usleep(200000);
}
}
/**********************************************************************/

Loading…
Cancel
Save