From 9f12208f5767a89827e87e589049161915431fca Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Fri, 30 May 2025 07:48:43 -0700 Subject: [PATCH] Redis: disconnect cleanly if INFO request fails --- src/storage/backend/redis/Redis.cc | 22 ++++++++++++++++------ src/storage/backend/redis/Redis.h | 5 +++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/storage/backend/redis/Redis.cc b/src/storage/backend/redis/Redis.cc index aca3156de1..578b4a61b4 100644 --- a/src/storage/backend/redis/Redis.cc +++ b/src/storage/backend/redis/Redis.cc @@ -124,14 +124,14 @@ void redisGeneric(redisAsyncContext* ctx, void* reply, void* privdata) { } /** - * Callback handler for ZADD commands. + * Callback handler for INFO commands. * * @param ctx The async context that called this callback. * @param reply The reply from the server for the command. * @param privdata A pointer to private data passed in the command. */ void redisINFO(redisAsyncContext* ctx, void* reply, void* privdata) { - auto t = Tracer("generic"); + auto t = Tracer("info"); auto backend = static_cast(ctx->data); backend->HandleInfoResult(static_cast(reply)); } @@ -630,8 +630,13 @@ void Redis::HandleInfoResult(redisReply* reply) { } } - if ( ! connected && res.err_str.empty() ) - res.err_str = "INFO command did not return server version"; + if ( ! connected ) { + if ( res.err_str.empty() ) + res.err_str = "INFO command did not return server version"; + + disconnect_reason = res.err_str; + redisAsyncDisconnect(async_ctx); + } freeReplyObject(reply); CompleteCallback(open_cb, res); @@ -678,8 +683,13 @@ void Redis::OnDisconnect(int status) { else { --active_ops; - EnqueueBackendLost("Client disconnected"); - CompleteCallback(close_cb, {ReturnCode::SUCCESS}); + if ( disconnect_reason.empty() ) + EnqueueBackendLost("Client disconnected"); + else + EnqueueBackendLost(util::fmt("Client disconnected: %s", disconnect_reason.c_str())); + + if ( close_cb ) + CompleteCallback(close_cb, {ReturnCode::SUCCESS}); } redisAsyncFree(async_ctx); diff --git a/src/storage/backend/redis/Redis.h b/src/storage/backend/redis/Redis.h index 326a1b3574..a0110dd55d 100644 --- a/src/storage/backend/redis/Redis.h +++ b/src/storage/backend/redis/Redis.h @@ -70,12 +70,13 @@ private: // poll. std::deque reply_queue; - OpenResultCallback* open_cb; - ResultCallback* close_cb; + OpenResultCallback* open_cb = nullptr; + ResultCallback* close_cb = nullptr; std::mutex expire_mutex; std::string server_addr; std::string key_prefix; + std::string disconnect_reason; std::atomic connected = false; std::atomic expire_running = false;