6954 Commits

Author SHA1 Message Date
artix
9e373c89b8 Cluster Manager: fixed expected slots calculation (rebalance)
Cluster Manager: fixed argument parsing after --cluster-weight
2018-04-20 19:25:10 +02:00
artix
4026c92b1b Cluster Manager: fixed bug when parsing CLUSTER NODES reply (clusterManagerNodeLoadInfo) 2018-04-20 18:08:30 +02:00
artix
a3d5864e42 Cluster Manager: code improvements and more comments added. 2018-04-19 18:52:01 +02:00
antirez
a968ee6fcd Streams: XTRIM command added. 2018-04-19 16:25:29 +02:00
antirez
f918d0c0f7 Streams: XADD, handle signaling of write in different ways. 2018-04-19 16:11:43 +02:00
antirez
5bfd409b6e Streams: XDEL command. 2018-04-18 13:12:09 +02:00
antirez
d13ff164bf Streams: higher level "delete by ID" API for streams. 2018-04-17 17:55:56 +02:00
antirez
852cc013ac Streams: iterator entry deletion abilities. 2018-04-17 17:18:00 +02:00
Salvatore Sanfilippo
da87ffb3ae Merge pull request #4842 from soloestoy/fix-timer-api-wrong-insert
Modules Timer API: fix wrong raxInsert() usage
2018-04-13 19:51:46 +02:00
zhaozhao.zz
ba2dbba0cb Modules Timer API: fix wrong raxInsert() usage 2018-04-14 01:20:02 +08:00
artix
7ace7af0b7 Cluster Manager: set-timeout command 2018-04-13 16:09:22 +02:00
antirez
7365cbf830 Modules API: Add call to get the blocked client handle from the context.
This is useful in the reply and timeout callback, if the module wants to
do some cleanup of the blocked client handle that may be stored around
in the module-private data structures.
2018-04-13 13:48:11 +02:00
antirez
d7fdac673c Modules API: moduleGetReplyClient() refactoring. 2018-04-13 13:42:49 +02:00
antirez
f305a7790d Modules API: blocked client disconnection callback. 2018-04-12 13:21:48 +02:00
antirez
3f9809d6fc Modules API: fix timer example. 2018-04-12 13:00:18 +02:00
artix
64cf7a314c - Cluster Manager: del-node command.
- Cluster Manager: fixed bug in clusterManagerNodeWithLeastReplicas
2018-04-11 18:23:28 +02:00
artix
5b9b7bb7ce Cluster Manager: add-node command. 2018-04-11 17:08:53 +02:00
antirez
643d5348cc Modules API: fix OOM_WARNING flag implementation. 2018-04-11 16:25:54 +02:00
antirez
936e29a1f3 Modules API: OOM_WARNING flags.
In some modules it may be useful to have an idea about being near to
OOM. Anyway additionally an explicit call to get the fill ratio will be
added in the future.
2018-04-11 16:22:52 +02:00
antirez
a0149c995b getMaxmemoryState() fixed and improved. 2018-04-11 12:48:26 +02:00
artix
f3c9a00c1c Cluster Manager: added clusterManagerCheckCluster to import command 2018-04-10 16:53:24 +02:00
artix
7866903555 Cluster Manager: import command 2018-04-10 16:25:25 +02:00
dejun.xdj
e7c0edc734 Return more accurate message when specified ID is invalid 2018-04-10 17:11:10 +08:00
dejun.xdj
2e0d90fc96 Bugfix: xadd command ID parse
strictly check the string to be converted,
strtoull() in libc may not set errno to EINVAL when the string contains
invalid digits.
2018-04-10 17:05:48 +08:00
dejun.xdj
32c2185ff5 Bugfix: xadd comand <field,value> arity check
missing parenthesis causes wrong arithmetic priority.
2018-04-10 16:36:05 +08:00
antirez
0d46b971f6 Modules: context flags now include OOM flag.
Plus freeMemoryIfNeeded() refactoring to improve legibility.
Please review this commit for sanity.
2018-04-09 17:44:30 +02:00
antirez
01a2f09e18 freeMemoryIfNeeded() lacked a top comment. 2018-04-09 17:20:36 +02:00
antirez
095de965c1 Modules: remove trailing empty spaces. 2018-04-09 17:16:55 +02:00
antirez
86c9680425 Modules API: experimental APIs version.
This way it is possible to use conditional compilation to be compatible
with a larger amount of Redis versions, however note that this breaks
binary compatibiltiy, so the module must be compiled with the
corresponding redismodule.h file depending on the version of Redis
targeted.
2018-04-09 12:17:19 +02:00
antirez
73b4f7873a Modules API: blocked client free callback modified to get a context.
Note that this was an experimental API that can only be enabled with
REIDSMODULE_EXPERIMENTAL_API, so it is subject to change until its
promoted to stable API. Sorry for the breakage, it is trivial to
resolve btw. This change will not be back ported to Redis 4.0.
2018-04-09 11:54:44 +02:00
artix
00771be4e0 Cluster Manager: fix command. 2018-04-06 18:02:40 +02:00
antirez
7b028a237c Modules API: RM_GetRandomBytes() / GetRandomHexChars(). 2018-04-05 13:24:22 +02:00
antirez
978dd8a7f5 Modules Cluster API: GetClusterSize() added. 2018-04-01 16:36:32 +02:00
antirez
9302109e72 Modules Cluster API: GetMyClusterID() added. 2018-04-01 16:20:57 +02:00
antirez
534147a368 Modules Timer API: add example of API. 2018-03-31 10:12:34 +02:00
antirez
736c0fc956 Modules Timer API: Wait at least 1 ms per iteration. Convert to ms. 2018-03-31 10:11:30 +02:00
antirez
e40b8e352e Modules Timer API: fix wrong raxRemove() key argument. 2018-03-31 09:58:43 +02:00
antirez
d120cca2f5 Modules Timer API: fix infinite loop and export API. 2018-03-31 00:44:46 +02:00
antirez
203257f3d7 Modules Timer API: timer handling implemented. 2018-03-30 22:50:21 +02:00
antirez
432e3e0b1c Modules Timer API: initial implementation. 2018-03-30 20:40:35 +02:00
antirez
a8857e6cba Modules Cluster API: node API exported, example improved. 2018-03-30 17:00:45 +02:00
antirez
ac2094f975 Modules Cluster API: nodes list and info API. 2018-03-30 16:16:47 +02:00
antirez
088dac5743 Modules Cluster API: node information struct and flags. 2018-03-30 13:16:55 +02:00
antirez
d7faf88f39 Modules Cluster API: make node IDs pointers constant. 2018-03-30 13:16:07 +02:00
antirez
11e653b85b Modules Cluster API: add a simple example module. 2018-03-30 12:49:45 +02:00
antirez
9aa6ac8867 Modules Cluster API: fix new API calls exporting. 2018-03-30 12:49:16 +02:00
antirez
d0bf651ff9 Modules Cluster API: sending / receiving API first implementation. 2018-03-30 11:06:08 +02:00
antirez
3cb3ea3902 Modules Cluster API: message bus implementation. 2018-03-29 15:13:31 +02:00
zhaozhao.zz
e0ca7cb729 adjust position of _dictNextPower in dictExpand 2018-03-29 17:36:15 +08:00
antirez
aed9670c57 Fix ae.c when a timer finalizerProc adds an event.
While this feature is not used by Redis, ae.c implements the ability for
a timer to call a finalizer callback when an timer event is deleted.
This feature was bugged since the start, and because it was never used
we never noticed a problem. However Anthony LaTorre was using the same
library in order to implement a different system: he found a bug that he
describes as follows, and which he fixed with the patch in this commit,
sent me by private email:

    --- Anthony email ---

've found one bug in the current implementation of the timed events.
It's possible to lose track of a timed event if an event is added in
the finalizerProc of another event.

For example, suppose you start off with three timed events 1, 2, and
3. Then the linked list looks like:

3 -> 2 -> 1

Then, you run processTimeEvents and events 2 and 3 finish, so now the
list looks like:

-1 -> -1 -> 2

Now, on the next iteration of processTimeEvents it starts by deleting
the first event, and suppose this finalizerProc creates a new event,
so that the list looks like this:

4 -> -1 -> 2

On the next iteration of the while loop, when it gets to the second
event, the variable prev is still set to NULL, so that the head of the
event loop after the next event will be set to 2, i.e. after deleting
the next event the event loop will look like:

2

and the event with id 4 will be lost.

I've attached an example program to illustrate the issue. If you run
it you will see that it prints:

```
foo id = 0
spam!
```

But if you uncomment line 29 and run it again it won't print "spam!".

    --- End of email ---

Test.c source code is as follows:

    #include "ae.h"
    #include <stdio.h>

    aeEventLoop *el;

    int foo(struct aeEventLoop *el, long long id, void *data)
    {
	printf("foo id = %lld\n", id);

	return AE_NOMORE;
    }

    int spam(struct aeEventLoop *el, long long id, void *data)
    {
	printf("spam!\n");

	return AE_NOMORE;
    }

    void bar(struct aeEventLoop *el, void *data)
    {
	aeCreateTimeEvent(el, 0, spam, NULL, NULL);
    }

    int main(int argc, char **argv)
    {
	el = aeCreateEventLoop(100);

	//aeCreateTimeEvent(el, 0, foo, NULL, NULL);
	aeCreateTimeEvent(el, 0, foo, NULL, bar);

	aeMain(el);

	return 0;
    }

Anthony fixed the problem by using a linked list for the list of timers, and
sent me back this patch after he tested the code in production for some time.
The code looks sane to me, so committing it to Redis.
2018-03-28 14:11:04 +02:00