Skip to content

Commit

Permalink
Copy 'errno' and use copied value in the if check of retry in cluster…
Browse files Browse the repository at this point in the history
… migrate commands socket_err block. (#1042)

errno is global variable and shared with system calls, so there is
chance it may be overwritten during io free or close socket in migrate
command code. It would be better it is copied before the free or
closesocket and use copied value to check for retry in socket_err block.
So added new variable to take copy and used the copy variable for the
check.

Signed-off-by: Shivshankar-Reddy <[email protected]>
  • Loading branch information
Shivshankar-Reddy committed Sep 18, 2024
1 parent ff69b4b commit ba71c7e
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/cluster.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,7 @@ void migrateCommand(client *c) {
int may_retry = 1;
int write_error = 0;
int argv_rewritten = 0;
int errno_copy = 0;

/* To support the KEYS option we need the following additional state. */
int first_key = 3; /* Argument index of the first key. */
Expand Down Expand Up @@ -710,6 +711,10 @@ void migrateCommand(client *c) {
* It is very common for the cached socket to get closed, if just reopening
* it works it's a shame to notify the error to the caller. */
socket_err:
/* Take a copy of 'errno' prior cleanup as it can be overwritten and
* use copied variable for re-try check. */
errno_copy = errno;

/* Cleanup we want to perform in both the retry and no retry case.
* Note: Closing the migrate socket will also force SELECT next time. */
sdsfree(cmd.io.buffer.ptr);
Expand All @@ -724,7 +729,7 @@ void migrateCommand(client *c) {

/* Retry only if it's not a timeout and we never attempted a retry
* (or the code jumping here did not set may_retry to zero). */
if (errno != ETIMEDOUT && may_retry) {
if (errno_copy != ETIMEDOUT && may_retry) {
may_retry = 0;
goto try_again;
}
Expand Down

0 comments on commit ba71c7e

Please sign in to comment.