Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
08ae522f
Commit
08ae522f
authored
Oct 11, 2018
by
zhaozhao.zz
Browse files
Streams: propagate lastid in XCLAIM when it has effect
parent
183ef7ae
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/t_stream.c
View file @
08ae522f
...
@@ -2075,6 +2075,8 @@ void xclaimCommand(client *c) {
...
@@ -2075,6 +2075,8 @@ void xclaimCommand(client *c) {
/* If we stopped because some IDs cannot be parsed, perhaps they
/* If we stopped because some IDs cannot be parsed, perhaps they
* are trailing options. */
* are trailing options. */
time_t now = mstime();
time_t now = mstime();
streamID last_id = {0,0};
int lastid_updated = 0;
for (; j < c->argc; j++) {
for (; j < c->argc; j++) {
int moreargs = (c->argc-1) - j; /* Number of additional arguments. */
int moreargs = (c->argc-1) - j; /* Number of additional arguments. */
char *opt = c->argv[j]->ptr;
char *opt = c->argv[j]->ptr;
...
@@ -2100,18 +2102,18 @@ void xclaimCommand(client *c) {
...
@@ -2100,18 +2102,18 @@ void xclaimCommand(client *c) {
!= C_OK) return;
!= C_OK) return;
} else if (!strcasecmp(opt,"LASTID") && moreargs) {
} else if (!strcasecmp(opt,"LASTID") && moreargs) {
j++;
j++;
streamID
id
;
if (streamParseStrictIDOrReply(c,c->argv[j],&last_id,0) != C_OK) return;
if
(
streamParseStrictIDOrReply
(
c
,
c
->
argv
[
j
],
&
id
,
0
)
!=
C_OK
)
return
;
/* Technically it could be more correct to update that only after
* checking for syntax errors, but this option is only used by
* the replication command that outputs correct syntax. */
if
(
streamCompareID
(
&
id
,
&
group
->
last_id
)
>
0
)
group
->
last_id
=
id
;
} else {
} else {
addReplyErrorFormat(c,"Unrecognized XCLAIM option '%s'",opt);
addReplyErrorFormat(c,"Unrecognized XCLAIM option '%s'",opt);
return;
return;
}
}
}
}
if (streamCompareID(&last_id,&group->last_id) > 0) {
group->last_id = last_id;
lastid_updated = 1;
}
if (deliverytime != -1) {
if (deliverytime != -1) {
/* If a delivery time was passed, either with IDLE or TIME, we
/* If a delivery time was passed, either with IDLE or TIME, we
* do some sanity check on it, and set the deliverytime to now
* do some sanity check on it, and set the deliverytime to now
...
@@ -2132,6 +2134,7 @@ void xclaimCommand(client *c) {
...
@@ -2132,6 +2134,7 @@ void xclaimCommand(client *c) {
streamConsumer *consumer = streamLookupConsumer(group,c->argv[3]->ptr,1);
streamConsumer *consumer = streamLookupConsumer(group,c->argv[3]->ptr,1);
void *arraylenptr = addDeferredMultiBulkLength(c);
void *arraylenptr = addDeferredMultiBulkLength(c);
size_t arraylen = 0;
size_t arraylen = 0;
long long dirty = server.dirty;
for (int j = 5; j <= last_id_arg; j++) {
for (int j = 5; j <= last_id_arg; j++) {
streamID id;
streamID id;
unsigned char buf[sizeof(streamID)];
unsigned char buf[sizeof(streamID)];
...
@@ -2198,6 +2201,10 @@ void xclaimCommand(client *c) {
...
@@ -2198,6 +2201,10 @@ void xclaimCommand(client *c) {
server.dirty++;
server.dirty++;
}
}
}
}
if (server.dirty == dirty && lastid_updated) {
streamPropagateGroupID(c,c->argv[1],group,c->argv[2]);
server.dirty++;
}
setDeferredMultiBulkLength(c,arraylenptr,arraylen);
setDeferredMultiBulkLength(c,arraylenptr,arraylen);
preventCommandPropagation(c);
preventCommandPropagation(c);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment