mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
Merge pull request #5271 from funny-falcon/cli-migrate-replace
redis-cli reshard/rebalance: ability to force replacement on existing keys
This commit is contained in:
commit
0006c989d2
@ -2826,8 +2826,8 @@ static int clusterManagerMigrateKeysInSlot(clusterManagerNode *source,
|
|||||||
char **err)
|
char **err)
|
||||||
{
|
{
|
||||||
int success = 1;
|
int success = 1;
|
||||||
int do_fix = (config.cluster_manager_command.flags &
|
int replace_existing_keys = (config.cluster_manager_command.flags &
|
||||||
CLUSTER_MANAGER_CMD_FLAG_FIX);
|
(CLUSTER_MANAGER_CMD_FLAG_FIX | CLUSTER_MANAGER_CMD_FLAG_REPLACE));
|
||||||
while (1) {
|
while (1) {
|
||||||
char *dots = NULL;
|
char *dots = NULL;
|
||||||
redisReply *reply = NULL, *migrate_reply = NULL;
|
redisReply *reply = NULL, *migrate_reply = NULL;
|
||||||
@ -2858,13 +2858,14 @@ static int clusterManagerMigrateKeysInSlot(clusterManagerNode *source,
|
|||||||
dots);
|
dots);
|
||||||
if (migrate_reply == NULL) goto next;
|
if (migrate_reply == NULL) goto next;
|
||||||
if (migrate_reply->type == REDIS_REPLY_ERROR) {
|
if (migrate_reply->type == REDIS_REPLY_ERROR) {
|
||||||
if (do_fix && strstr(migrate_reply->str, "BUSYKEY")) {
|
int is_busy = strstr(migrate_reply->str, "BUSYKEY") != NULL;
|
||||||
|
int not_served = strstr(migrate_reply->str, "slot not served") != NULL;
|
||||||
|
if (replace_existing_keys && (is_busy || not_served)) {
|
||||||
/* If the key already exists, try to migrate keys
|
/* If the key already exists, try to migrate keys
|
||||||
* adding REPLACE option.
|
* adding REPLACE option.
|
||||||
* If the key's slot is not served, try to assign slot
|
* If the key's slot is not served, try to assign slot
|
||||||
* to the target node. */
|
* to the target node. */
|
||||||
int is_busy = (strstr(migrate_reply->str, "BUSYKEY") != NULL);
|
if (not_served)
|
||||||
if (strstr(migrate_reply->str, "slot not served") != NULL)
|
|
||||||
clusterManagerSetSlot(source, target, slot, "node", NULL);
|
clusterManagerSetSlot(source, target, slot, "node", NULL);
|
||||||
clusterManagerLogWarn("*** Target key exists. "
|
clusterManagerLogWarn("*** Target key exists. "
|
||||||
"Replacing it for FIX.\n");
|
"Replacing it for FIX.\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user