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
6c0af37b
Commit
6c0af37b
authored
Jan 22, 2018
by
antirez
Browse files
CG: streamCompareID() + group last_id updating.
parent
86fe8fde
Changes
1
Show whitespace changes
Inline
Side-by-side
src/t_stream.c
View file @
6c0af37b
...
@@ -149,6 +149,17 @@ void streamDecodeID(void *buf, streamID *id) {
...
@@ -149,6 +149,17 @@ void streamDecodeID(void *buf, streamID *id) {
id->seq = ntohu64(e[1]);
id->seq = ntohu64(e[1]);
}
}
/* Compare two stream IDs. Return -1 if a < b, 0 if a == b, 1 if a > b. */
int streamCompareID(streamID *a, streamID *b) {
if (a->ms > b->ms) return 1;
else if (a->ms < b->ms) return -1;
/* The ms part is the same. Check the sequence part. */
else if (a->seq > b->seq) return 1;
else if (a->seq < b->seq) return -1;
/* Everything is the same: IDs are equal. */
return 0;
}
/* Adds a new item into the stream 's' having the specified number of
/* Adds a new item into the stream 's' having the specified number of
* field-value pairs as specified in 'numfields' and stored into 'argv'.
* field-value pairs as specified in 'numfields' and stored into 'argv'.
* Returns the new entry ID populating the 'added_id' structure.
* Returns the new entry ID populating the 'added_id' structure.
...
@@ -164,9 +175,7 @@ void streamDecodeID(void *buf, streamID *id) {
...
@@ -164,9 +175,7 @@ void streamDecodeID(void *buf, streamID *id) {
int streamAppendItem(stream *s, robj **argv, int numfields, streamID *added_id, streamID *use_id) {
int streamAppendItem(stream *s, robj **argv, int numfields, streamID *added_id, streamID *use_id) {
/* If an ID was given, check that it's greater than the last entry ID
/* If an ID was given, check that it's greater than the last entry ID
* or return an error. */
* or return an error. */
if
(
use_id
&&
(
use_id
->
ms
<
s
->
last_id
.
ms
||
if (use_id && streamCompareID(use_id,&s->last_id) <= 0) return C_ERR;
(
use_id
->
ms
==
s
->
last_id
.
ms
&&
use_id
->
seq
<=
s
->
last_id
.
seq
)))
return
C_ERR
;
/* Add the new entry. */
/* Add the new entry. */
raxIterator ri;
raxIterator ri;
...
@@ -679,8 +688,21 @@ size_t streamReplyWithRange(client *c, stream *s, streamID *start, streamID *end
...
@@ -679,8 +688,21 @@ size_t streamReplyWithRange(client *c, stream *s, streamID *start, streamID *end
int64_t numfields;
int64_t numfields;
streamID id;
streamID id;
/* If a group was passed, as an optimization we check if the range
* specified is about messages that were never delivered. This is true if
* the 'start' range is greater than the current last_id in the stream.
* In that case, there is no need to check if the messages may already
* have another owner before delivering the message. This speeds up
* the processing significantly. */
int newmessages = group != NULL &&
streamCompareID(start,&group->last_id) > 0;
streamIteratorStart(&si,s,start,end,rev);
streamIteratorStart(&si,s,start,end,rev);
while(streamIteratorGetID(&si,&id,&numfields)) {
while(streamIteratorGetID(&si,&id,&numfields)) {
/* Update the group last_id if needed. */
if (group && streamCompareID(&id,&group->last_id) > 0)
group->last_id = id;
/* Emit a two elements array for each item. The first is
/* Emit a two elements array for each item. The first is
* the ID, the second is an array of field-value pairs. */
* the ID, the second is an array of field-value pairs. */
sds replyid = sdscatfmt(sdsempty(),"+%U-%U\r\n",id.ms,id.seq);
sds replyid = sdscatfmt(sdsempty(),"+%U-%U\r\n",id.ms,id.seq);
...
@@ -1134,8 +1156,15 @@ void streamNotAckedFree(streamNotAcked *na) {
...
@@ -1134,8 +1156,15 @@ void streamNotAckedFree(streamNotAcked *na) {
zfree(na);
zfree(na);
}
}
/* Free a consumer and associated data structures. Note that this function
* will not reassign the pending messages associated with this consumer
* nor will delete them from the stream, so when this function is called
* to delete a consumer, and not when the whole stream is destroyed, the caller
* should do some work before. */
void streamConsumerFree(streamConsumer *sc) {
void streamConsumerFree(streamConsumer *sc) {
zfree
(
sc
->
name
);
raxFree(sc->pel); /* No value free callback: the PEL entries are shared
between the consumer and the main stream PEL. */
sdsfree(sc->name);
zfree(sc);
zfree(sc);
}
}
...
...
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