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:
Salvatore Sanfilippo 2018-12-07 12:27:32 +01:00 committed by GitHub
commit 0006c989d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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");