46 Commits

Author SHA1 Message Date
antirez
0f43a908f9 CG: consumer lookup + initial streamReplyWithRange() work to supprot CG. 2018-03-15 12:54:10 +01:00
antirez
23dc98ac52 CG: add & populate group+consumer in the blocking state. 2018-03-15 12:54:10 +01:00
antirez
20bc183ef8 CG: fix parsing in XREADGROUP and streamLookupCG() NULL check. 2018-03-15 12:54:10 +01:00
antirez
d293a8a11e CG: XGROUPREAD group option parsing and groups lookup. 2018-03-15 12:54:10 +01:00
antirez
7dba47a535 CG: fix raxFind() retval check in streamCreateCG(). 2018-03-15 12:54:10 +01:00
antirez
2c348dafd0 CG: data structures design + XGROUP CREATE implementation. 2018-03-15 12:54:10 +01:00
antirez
4ee8d1377f Stream: update the listpack pointer in streamTrimByLength(). 2018-03-01 17:26:02 +01:00
antirez
3e0767209a Streams: fix a few type mismatches in t_stream.c. 2017-12-04 11:59:15 +01:00
antirez
e021e37571 Streams: fix lp-count field for non-same-fields entries. 2017-12-01 10:24:25 +01:00
antirez
8be81febcf Streams: XRANGE REV option -> XREVRANGE command. 2017-12-01 10:24:25 +01:00
antirez
326b8dbb83 Streams: fix reverse iterator discarding of items out of range. 2017-12-01 10:24:25 +01:00
antirez
f0bf5710cc Streams: fix reverse iteration next node jumping. 2017-12-01 10:24:25 +01:00
antirez
009c14e944 Streams: state machine for reverse iteration WIP 1. 2017-12-01 10:24:25 +01:00
antirez
effaf79518 Streams: augment stream entries to allow backward scanning. 2017-12-01 10:24:25 +01:00
antirez
ddf9ccefd2 Streams: fix COUNT parsing, issue #4433. 2017-12-01 10:24:24 +01:00
antirez
6808443d33 Streams: move ID ms/seq separator from '.' to '-'
After checking with the community via Twitter (here:
https://twitter.com/antirez/status/915130876861788161) the verdict was to
use ":". However I later realized, after users lamented the fact that
it's hard to copy IDs just with double click, that this was the reason
why I moved to "." in the first instance. Fortunately "-", that was the
other option with most votes, also gets selected with double click on
most terminal applications on Linux and MacOS.

So my reasoning was:

1) We can't retain "." because it's actually confusing to newcomers, it
looks like a floating number, people may be tricked into thinking they
can order IDs numerically as floats.

2) Moving to a double-click-to-select format is much better. People will
work with such IDs for long time when coding / debugging. Why making now
a choice that will impact this for the next years?

The only other viable option was "-", and that's what I did. Thanks.
2017-12-01 10:24:24 +01:00
antirez
bcb6900b9f Streams: fix XADD + MAXLEN propagation due to var shadowing.
Clang should be more prone to return warnings by default when there is
same-var-name shadowing. GCC does this and can avoid bugs like that.
2017-12-01 10:24:24 +01:00
antirez
b577ac28d1 Streams: fix memory leak in streamTrimByLength(). 2017-12-01 10:24:24 +01:00
antirez
6ad0d48cf8 Streams: fix streamTrimByLength() standalone items skipping. 2017-12-01 10:24:24 +01:00
antirez
350768d822 Streams: XADD MAXLEN implementation.
The core of this change is the implementation of stream trimming, and
the resulting MAXLEN option of XADD as a trivial result of having
trimming functionalities. MAXLEN already works but in order to be more
efficient listpack GC should be implemented, currently marked as a TODO
item inside the comments.
2017-12-01 10:24:24 +01:00
antirez
2c74f66e79 Streams: reduce listpack max size to 2k to speedup range queries.
Listpack max size is a tradeoff between space and time. A 2k max entry
puts the memory usage approximately at a similar order of magnitude (5
million entries went from 96 to 120 MB), but the range queries speed
doubled (because there are half entries to scan in the average case).

Lower values could be considered, or maybe this parameter should be
made tunable.
2017-12-01 10:24:24 +01:00
antirez
75fb0da53a Streams: delta encode IDs based on key. Add count + deleted fields.
We used to have the master ID stored at the start of the listpack,
however using the key directly makes more sense in order to create a
space efficient representation: anyway the key at the radix tree is very
unlikely to change because of how the stream is implemented. Moreover on
nodes merging, to rewrite the merged listpacks is anyway the most
sensible operation, and we can use the iterator and the append-to-stream
function in order to avoid re-implementing the code needed for merging.

This commit also adds two items at the start of the listpack: the
number of valid items inside the listpack, and the number of items
marked as deleted. This means that there is no need to scan a listpack
in order to understand if it's a good candidate for garbage collection,
if the ration between valid/deleted items triggers the GC.
2017-12-01 10:24:24 +01:00
antirez
b4982aafb5 Streams: specify better how the master enty works. 2017-12-01 10:24:24 +01:00
antirez
13ae1fa2b9 Streams: items compression implemented.
The approach used is to set a fixed header at the start of every
listpack blob (that contains many entries). The header contains a
"master" ID and fields, that are initially just obtained from the first
entry inserted in the listpack, so that the first enty is always well
compressed. Later every new entry is checked against these fields, and
if it matches, the SAMEFIELD flag is set in the entry so that we know to
just use the master entry flags. The IDs are always delta-encoded
against the first entry. This approach avoids cascading effects in which
entries are encoded depending on the previous entries, in order to avoid
complexity and rewritings of the data when data is removed in the middle
(which is a planned feature).
2017-12-01 10:24:24 +01:00
antirez
319a89b32e Streams: AOF rewriting + minor iterator improvements. 2017-12-01 10:24:24 +01:00
antirez
3f8ed9a516 Streams: export iteration API. 2017-12-01 10:24:24 +01:00
antirez
84af6ec436 Streams: implement streamReplyWithRange() in terms of the iterator. 2017-12-01 10:24:24 +01:00
antirez
0f48b7436d Streams: stream iteration refactoring, WIP 2. 2017-12-01 10:24:24 +01:00
antirez
6556a208e6 Streams: stream iteration refactoring, WIP 1. 2017-12-01 10:24:24 +01:00
antirez
d436d38155 Streams: fix bug in XREAD last received ID processing. 2017-12-01 10:24:24 +01:00
antirez
df8e92d763 Streams: fix memory leak in freeStream(). 2017-12-01 10:24:24 +01:00
antirez
6887a8e963 Streams: rewrite XADD ID argument for AOF/slaves. 2017-12-01 10:24:24 +01:00
antirez
541b1a7cc3 Streams: fix XADD API and keyspace notifications.
XADD was suboptimal in the first incarnation of the command, not being
able to accept an ID (very useufl for replication), nor options for
having capped streams.

The keyspace notification for streams was not implemented.
2017-12-01 10:24:24 +01:00
antirez
433624adda Streams: When XREAD blocks without COUNT, set a default one.
A client may lose a lot of time between invocations of blocking XREAD,
for example because it is processing the messages or for any other
cause. When it returns back, it may provide a low enough message ID that
the server will block to send an unreasonable number of messages in a
single call. For this reason we set a COUNT when the client is blocked
with XREAD calls, even if no COUNT is given. This is arbitrarily set to
1000 because it's enough to avoid slowing down the reception of many
messages, but low enough to avoid to block.
2017-12-01 10:24:24 +01:00
antirez
799eaab940 Streams: fix XREAD ready-key signaling.
With lists we need to signal only on key creation, but streams can
provide data to clients listening at every new item added.
To make this slightly more efficient we now track different classes of
blocked clients to avoid signaling keys when there is nobody listening.
A typical case is when the stream is used as a time series DB and
accessed only by range with XRANGE.
2017-12-01 10:24:24 +01:00
antirez
671c1a2251 Streams: fix XREAD timeout handling, zero is valid. 2017-12-01 10:24:24 +01:00
antirez
9290ad3cb9 Streams: XREAD ability to block fixed. 2017-12-01 10:24:24 +01:00
antirez
539d8747b2 Streams: synchronous xread fixes and improvements. 2017-12-01 10:24:24 +01:00
antirez
004a8b8712 Streams: XREAD, first draft. Handling of blocked clients still missing. 2017-12-01 10:24:24 +01:00
antirez
7ccc80d503 Streams: XREAD arguments parsing. 2017-12-01 10:24:24 +01:00
antirez
a477b95b01 Streams: augment client.bpop with XREAD specific fields. 2017-12-01 10:24:24 +01:00
antirez
8016093ee9 Streams: implement stream object release. 2017-12-01 10:24:24 +01:00
antirez
6a4fd95478 Streams: XLEN command. 2017-12-01 10:24:24 +01:00
antirez
fac980c6d1 Streams: RDB saving. 2017-12-01 10:24:24 +01:00
antirez
27fd469a8d Streams: assign value of 6 to OBJ_STREAM + some refactoring. 2017-12-01 10:24:24 +01:00
antirez
1850ff43f4 Streams: 12 commits squashed into the initial Streams implementation. 2017-12-01 10:24:24 +01:00