Added BITFIELD_RO variants for read-only operations.

This commit is contained in:
bodong.ybd 2020-03-04 20:51:45 +08:00 committed by antirez
parent 50f8f9504b
commit b3e4abf06e
4 changed files with 54 additions and 1 deletions

View File

@ -902,6 +902,9 @@ void bitposCommand(client *c) {
* OVERFLOW [WRAP|SAT|FAIL]
*/
#define BITFIELD_COMMON (1<<0)
#define BITFIELD_READONLY (1<<1)
struct bitfieldOp {
uint64_t offset; /* Bitfield offset. */
int64_t i64; /* Increment amount (INCRBY) or SET value */
@ -911,7 +914,7 @@ struct bitfieldOp {
int sign; /* True if signed, otherwise unsigned op. */
};
void bitfieldCommand(client *c) {
void bitfieldGeneric(client *c, int flags) {
robj *o;
size_t bitoffset;
int j, numops = 0, changes = 0;
@ -999,6 +1002,12 @@ void bitfieldCommand(client *c) {
return;
}
} else {
if (flags & BITFIELD_READONLY) {
zfree(ops);
addReplyError(c, "bitfield_ro only support get subcommand");
return;
}
/* Lookup by making room up to the farest bit reached by
* this operation. */
if ((o = lookupStringForBitCommand(c,
@ -1129,3 +1138,11 @@ void bitfieldCommand(client *c) {
}
zfree(ops);
}
void bitfieldCommand(client *c) {
bitfieldGeneric(c, BITFIELD_COMMON);
}
void bitfieldroCommand(client *c) {
bitfieldGeneric(c, BITFIELD_READONLY);
}

View File

@ -238,6 +238,10 @@ struct redisCommand redisCommandTable[] = {
"write use-memory @bitmap",
0,NULL,1,1,1,0,0,0},
{"bitfield_ro",bitfieldroCommand,-2,
"read-only fast @bitmap",
0,NULL,1,1,1,0,0,0},
{"setrange",setrangeCommand,4,
"write use-memory @string",
0,NULL,1,1,1,0,0,0},

View File

@ -2177,6 +2177,7 @@ void existsCommand(client *c);
void setbitCommand(client *c);
void getbitCommand(client *c);
void bitfieldCommand(client *c);
void bitfieldroCommand(client *c);
void setrangeCommand(client *c);
void getrangeCommand(client *c);
void incrCommand(client *c);

View File

@ -199,3 +199,34 @@ start_server {tags {"bitops"}} {
r del mystring
}
}
start_server {tags {"repl"}} {
start_server {} {
set master [srv -1 client]
set master_host [srv -1 host]
set master_port [srv -1 port]
set slave [srv 0 client]
test {setup slave} {
$slave slaveof $master_host $master_port
wait_for_condition 50 100 {
[s 0 master_link_status] eq {up}
} else {
fail "Replication not started."
}
}
test {write on master, read on slave} {
$master del bits
assert_equal 0 [$master bitfield bits set u8 0 255]
assert_equal 255 [$master bitfield bits set u8 0 100]
wait_for_ofs_sync $master $slave
assert_equal 100 [$slave bitfield_ro bits get u8 0]
}
test {bitfield_ro with write option} {
catch {$slave bitfield_ro bits set u8 0 100 get u8 0} err
assert_match {*ERR bitfield_ro only support get subcommand*} $err
}
}
}