From 5c97c1003146e54ab8757961797c3dade8c70ebc Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 6 Sep 2024 15:17:20 +0900 Subject: [PATCH 1/9] update hiredis-cluster to 0.14.0 --- deps/hiredis-cluster | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/hiredis-cluster b/deps/hiredis-cluster index 0a4deb6..d92edb8 160000 --- a/deps/hiredis-cluster +++ b/deps/hiredis-cluster @@ -1 +1 @@ -Subproject commit 0a4deb6ea78cb0b8008288346868a99d29d404d8 +Subproject commit d92edb8ac58d1279f5015715947f7ade61daca72 From 581a04f86561d6ec6b1b833483511476b5c9d0d3 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 6 Sep 2024 19:22:09 +0900 Subject: [PATCH 2/9] nits: Update Minilla version in META.json This commit updates the Minilla version from 3.1.22 to 3.1.23 in the META.json file. This change ensures that the metadata reflects the correct versioning. --- META.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/META.json b/META.json index be9d27d..7975cb2 100644 --- a/META.json +++ b/META.json @@ -4,7 +4,7 @@ "plainbanana " ], "dynamic_config" : 0, - "generated_by" : "Minilla/v3.1.22, CPAN::Meta::Converter version 2.150005", + "generated_by" : "Minilla/v3.1.23, CPAN::Meta::Converter version 2.150005", "license" : [ "perl_5" ], From b64063f3a1675b84f3a35c76531b1ff63f9f1692 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 6 Sep 2024 19:26:13 +0900 Subject: [PATCH 3/9] fix: Fix reconnect issue after forking. To clear HIRCLUSTER_FLAG_SHUTDOWN flag, explicitly call redisClusterConnect2 immediately after fork. --- src/Fast.xs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Fast.xs b/src/Fast.xs index c3903ee..5dd01e4 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -234,6 +234,12 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con } redisClusterAsyncDisconnect(self->acc); self->pid = current_pid; + + if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { + DEBUG_MSG("%s", "failed to connect after forking"); + reply_t->error = self->acc->cc->errstr; + return; + } } status = redisClusterAsyncCommandArgv(self->acc, replyCallback, reply_t, argc, argv, argvlen); From bdfff6689c5b0e8d1649381f1f6b7712b253a0d6 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 21:40:16 +0900 Subject: [PATCH 4/9] fix: dispatch event loop Add missing event_base_dispatch call after async disconnect to ensure the event loop is properly dispatched and not to create dangling pointers. This change ensures that all pending handlers are processed but all of them will return quiqkly by HIRCLUSTER_FLAG_SHUTDOWN. --- src/Fast.xs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Fast.xs b/src/Fast.xs index 5dd01e4..de445ef 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -233,6 +233,7 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con return; } redisClusterAsyncDisconnect(self->acc); + event_base_dispatch(self->cluster_event_base); self->pid = current_pid; if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { From 8e8e1226747fdd8cd7de4c57433e033a4bed9c97 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 21:41:52 +0900 Subject: [PATCH 5/9] fix: error object type --- src/Fast.xs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Fast.xs b/src/Fast.xs index de445ef..dec3daf 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -238,7 +238,7 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { DEBUG_MSG("%s", "failed to connect after forking"); - reply_t->error = self->acc->cc->errstr; + reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); return; } } From 9a4c88d4f6e73018a09e73c50e9d2f7f429d2025 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 22:03:35 +0900 Subject: [PATCH 6/9] feat: Handle event dispatch failure --- src/Fast.xs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Fast.xs b/src/Fast.xs index dec3daf..1ca38cf 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -233,7 +233,11 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con return; } redisClusterAsyncDisconnect(self->acc); - event_base_dispatch(self->cluster_event_base); + + if (event_base_dispatch(self->cluster_event_base) == -1) { + reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); + return; + } self->pid = current_pid; if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { From c1098ae7d2bf46b7eef19a6f4147c71f22b4d383 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 22:04:20 +0900 Subject: [PATCH 7/9] refactor: delete redundant DEBUG_MSG --- src/Fast.xs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Fast.xs b/src/Fast.xs index 1ca38cf..e4e225f 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -241,7 +241,6 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con self->pid = current_pid; if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { - DEBUG_MSG("%s", "failed to connect after forking"); reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); return; } From 450c0e2ada077ede1c020db8bb6ebfd23b640636 Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 22:05:00 +0900 Subject: [PATCH 8/9] fix: process ID assignment order Moved the assignment of self->pid closer to re-connection success check in src/Fast.xs. This ensures that the process ID is set only after a successful re-connection attempt. --- src/Fast.xs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Fast.xs b/src/Fast.xs index e4e225f..7241c5f 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -238,12 +238,13 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); return; } - self->pid = current_pid; if (redisClusterConnect2(self->acc->cc) != REDIS_OK) { reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); return; } + + self->pid = current_pid; } status = redisClusterAsyncCommandArgv(self->acc, replyCallback, reply_t, argc, argv, argvlen); From 70c517c857f0b615a07913717ada3c40a4213bba Mon Sep 17 00:00:00 2001 From: plainbanana Date: Fri, 20 Sep 2024 22:09:30 +0900 Subject: [PATCH 9/9] fix: error message --- src/Fast.xs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Fast.xs b/src/Fast.xs index 7241c5f..fa95ffc 100644 --- a/src/Fast.xs +++ b/src/Fast.xs @@ -235,7 +235,7 @@ void Redis__Cluster__Fast_run_cmd(pTHX_ Redis__Cluster__Fast self, int argc, con redisClusterAsyncDisconnect(self->acc); if (event_base_dispatch(self->cluster_event_base) == -1) { - reply_t->error = newSVpvf("failed to re-connect: %s", self->acc->cc->errstr); + reply_t->error = newSVpvf("%s", "event_base_dispatch failed after forking"); return; }