Add SORT_RO command (#9299)

Add a readonly variant of the STORE command, so it can be used on
read-only workloads (replica, ACL, etc)
This commit is contained in:
Eduardo Semprebon
2021-08-09 09:40:29 +03:00
committed by GitHub
parent e8eeba7bee
commit d3356bf614
4 changed files with 28 additions and 2 deletions
+4
View File
@@ -789,6 +789,10 @@ struct redisCommand redisCommandTable[] = {
"write use-memory @list @set @sortedset @dangerous",
0,sortGetKeys,1,1,1,0,0,0},
{"sort_ro",sortroCommand,-2,
"read-only @list @set @sortedset @dangerous",
0,NULL,1,1,1,0,0,0},
{"info",infoCommand,-1,
"ok-loading ok-stale random @dangerous",
0,NULL,0,0,0,0,0,0},
+1
View File
@@ -2606,6 +2606,7 @@ void syncCommand(client *c);
void flushdbCommand(client *c);
void flushallCommand(client *c);
void sortCommand(client *c);
void sortroCommand(client *c);
void lremCommand(client *c);
void lposCommand(client *c);
void rpoplpushCommand(client *c);
+11 -2
View File
@@ -189,7 +189,7 @@ int sortCompare(const void *s1, const void *s2) {
/* The SORT command is the most complex command in Redis. Warning: this code
* is optimized for speed and a bit less for readability */
void sortCommand(client *c) {
void sortCommandGeneric(client *c, int readonly) {
list *operations;
unsigned int outputlen = 0;
int desc = 0, alpha = 0;
@@ -226,7 +226,7 @@ void sortCommand(client *c) {
break;
}
j+=2;
} else if (!strcasecmp(c->argv[j]->ptr,"store") && leftargs >= 1) {
} else if (readonly == 0 && !strcasecmp(c->argv[j]->ptr,"store") && leftargs >= 1) {
storekey = c->argv[j+1];
j++;
} else if (!strcasecmp(c->argv[j]->ptr,"by") && leftargs >= 1) {
@@ -595,3 +595,12 @@ void sortCommand(client *c) {
}
zfree(vector);
}
/* SORT wrapper function for read-only mode. */
void sortroCommand(client *c) {
sortCommandGeneric(c, 1);
}
void sortCommand(client *c) {
sortCommandGeneric(c, 0);
}
+12
View File
@@ -263,6 +263,18 @@ start_server {
r lrange testb 0 -1
} {5 3 4} {cluster:skip}
test "SORT_RO - Successful case" {
r del mylist
r lpush mylist a
r set x:a 100
r sort_ro mylist by nosort get x:*->
} {100} {cluster:skip}
test "SORT_RO - Cannot run with STORE arg" {
catch {r sort_ro foolist STORE bar} e
set e
} {ERR syntax error}
tags {"slow"} {
set num 100
set res [create_random_dataset $num lpush]