12903 Commits

Author SHA1 Message Date
antirez
ae3ce0eba3 In Redis RDB check: log decompression errors. 2016-07-01 11:59:25 +02:00
antirez
df3c69e89e In Redis RDB check: log object type on error. 2016-07-01 11:40:40 +02:00
antirez
247cf937bb In Redis RDB check: log object type on error. 2016-07-01 11:40:40 +02:00
antirez
c0f4d19331 Added a trivial program to randomly corrupt RDB files in /utils. 2016-07-01 09:55:50 +02:00
antirez
d882ccb6a2 Added a trivial program to randomly corrupt RDB files in /utils. 2016-07-01 09:55:50 +02:00
antirez
2ab7097178 In Redis RDB check: minor output message changes. 2016-07-01 09:52:35 +02:00
antirez
80920cba73 In Redis RDB check: minor output message changes. 2016-07-01 09:52:35 +02:00
antirez
e9f31ba9c2 In Redis RDB check: better error reporting. 2016-07-01 09:36:52 +02:00
antirez
c67f1a46e3 In Redis RDB check: better error reporting. 2016-07-01 09:36:52 +02:00
sskorgal
9dfd9d1412 Fix for redis_cli printing default DB when select command fails. 2016-07-01 10:42:22 +05:30
sskorgal
9aacdebf63 Fix for redis_cli printing default DB when select command fails. 2016-07-01 10:42:22 +05:30
antirez
e97fadb045 In Redis RDB check: initial POC.
So far we used an external program (later executed within Redis) and
parser in order to check RDB files for correctness. This forces, at each
RDB format update, to have two copies of the same format implementation
that are hard to keep in sync. Morover the former RDB checker only
checked the very high-level format of the file, without actually trying
to load things in memory. Certain corruptions can only be handled by
really loading key-value pairs.

This first commit attempts to unify the Redis RDB loadig code with the
task of checking the RDB file for correctness. More work is needed but
it looks like a sounding direction so far.
2016-06-30 23:44:44 +02:00
antirez
3d4399e160 In Redis RDB check: initial POC.
So far we used an external program (later executed within Redis) and
parser in order to check RDB files for correctness. This forces, at each
RDB format update, to have two copies of the same format implementation
that are hard to keep in sync. Morover the former RDB checker only
checked the very high-level format of the file, without actually trying
to load things in memory. Certain corruptions can only be handled by
really loading key-value pairs.

This first commit attempts to unify the Redis RDB loadig code with the
task of checking the RDB file for correctness. More work is needed but
it looks like a sounding direction so far.
2016-06-30 23:44:44 +02:00
Rojin George
d0f53079e3 Merge remote-tracking branch 'refs/remotes/antirez/unstable' into unstable 2016-06-30 16:34:01 +05:30
Rojin George
5b26a16096 Merge remote-tracking branch 'refs/remotes/antirez/unstable' into unstable 2016-06-30 16:34:01 +05:30
Yusaku Kaneta
b6c4822f7c Fix the firstkey, lastkey, and keystep of moduleCommand 2016-06-29 18:09:16 +09:00
Yusaku Kaneta
679290d632 Fix the firstkey, lastkey, and keystep of moduleCommand 2016-06-29 18:09:16 +09:00
antirez
24bd9b19f6 Test: new randomized stress tester for #3343 alike bugs. 2016-06-28 09:42:20 +02:00
antirez
163f95978b Test: new randomized stress tester for #3343 alike bugs. 2016-06-28 09:42:20 +02:00
antirez
f983318e52 Stress tester WIP. 2016-06-28 09:33:36 +02:00
antirez
30e2f37ab7 Stress tester WIP. 2016-06-28 09:33:36 +02:00
antirez
49899866c8 Regression test for issue #3343 exact min crash sequence.
Note: it was verified that it can crash the test suite without the patch
applied.
2016-06-28 09:27:14 +02:00
antirez
2f3b3ae896 Regression test for issue #3343 exact min crash sequence.
Note: it was verified that it can crash the test suite without the patch
applied.
2016-06-28 09:27:14 +02:00
antirez
dc18a6a6f8 Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-06-27 18:12:46 +02:00
antirez
52e759540e Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-06-27 18:12:46 +02:00
antirez
5e176e1af5 Fix quicklistReplaceAtIndex() by updating the quicklist ziplist size.
The quicklist takes a cached version of the ziplist representation size
in bytes. The implementation must update this length every time the
underlying ziplist changes. However quicklistReplaceAtIndex() failed to
fix the length.

During LSET calls, the size of the ziplist blob and the cached size
inside the quicklist diverged. Later, when this size is used in an
authoritative way, for example during nodes splitting in order to copy
the nodes, we end with a duplicated node that may contain random
garbage.

This commit should fix issue #3343, however several problems were found
reviewing the quicklist.c code in search of this bug that should be
addressed soon or later.

For example:

1. To take a cached ziplist length is fragile since failing to update it
leads to this kind of issues.

2. The node splitting code needs auditing. For example it works just for
a side effect of ziplistDeleteRange() to be able to cope with a wrong
count of elements to remove. The code inside quicklist.c assumes that
-1 means "delete till the end" while actually it's just a count of how
many elements to delete, and is an unsigned count. So -1 gets converted
into the maximum integer, and just by chance the ziplist code stops
deleting elements after there are no more to delete.

3. Node splitting is extremely inefficient, it copies the node and
removes elements from both nodes even when actually there is to move a
single entry from one node to the other, or when the new resulting node
is empty at all so there is nothing to copy but just to create a new
node.

However at least for Redis 3.2 to introduce fresh code inside
quicklist.c may be even more risky, so instead I'm writing a better
fuzzy tester to stress the internals a bit more in order to anticipate
other possible bugs.

This bug was found using a fuzzy tester written after having some clue
about where the bug could be. The tester eventually created a ~2000
commands sequence able to always crash Redis. I wrote a better version
of the tester that searched for the smallest sequence that could crash
Redis automatically. Later this smaller sequence was minimized by
removing random commands till it still crashed the server. This resulted
into a sequence of 7 commands. With this small sequence it was just a
matter of filling the code with enough printf() to understand enough
state to fix the bug.
2016-06-27 18:02:33 +02:00
antirez
c147eaf8f8 Fix quicklistReplaceAtIndex() by updating the quicklist ziplist size.
The quicklist takes a cached version of the ziplist representation size
in bytes. The implementation must update this length every time the
underlying ziplist changes. However quicklistReplaceAtIndex() failed to
fix the length.

During LSET calls, the size of the ziplist blob and the cached size
inside the quicklist diverged. Later, when this size is used in an
authoritative way, for example during nodes splitting in order to copy
the nodes, we end with a duplicated node that may contain random
garbage.

This commit should fix issue #3343, however several problems were found
reviewing the quicklist.c code in search of this bug that should be
addressed soon or later.

For example:

1. To take a cached ziplist length is fragile since failing to update it
leads to this kind of issues.

2. The node splitting code needs auditing. For example it works just for
a side effect of ziplistDeleteRange() to be able to cope with a wrong
count of elements to remove. The code inside quicklist.c assumes that
-1 means "delete till the end" while actually it's just a count of how
many elements to delete, and is an unsigned count. So -1 gets converted
into the maximum integer, and just by chance the ziplist code stops
deleting elements after there are no more to delete.

3. Node splitting is extremely inefficient, it copies the node and
removes elements from both nodes even when actually there is to move a
single entry from one node to the other, or when the new resulting node
is empty at all so there is nothing to copy but just to create a new
node.

However at least for Redis 3.2 to introduce fresh code inside
quicklist.c may be even more risky, so instead I'm writing a better
fuzzy tester to stress the internals a bit more in order to anticipate
other possible bugs.

This bug was found using a fuzzy tester written after having some clue
about where the bug could be. The tester eventually created a ~2000
commands sequence able to always crash Redis. I wrote a better version
of the tester that searched for the smallest sequence that could crash
Redis automatically. Later this smaller sequence was minimized by
removing random commands till it still crashed the server. This resulted
into a sequence of 7 commands. With this small sequence it was just a
matter of filling the code with enough printf() to understand enough
state to fix the bug.
2016-06-27 18:02:33 +02:00
Salvatore Sanfilippo
ae4f5b303e Merge pull request #3342 from yossigo/fix_calloc
Fix RedisModule_Calloc() definition typo.
2016-06-24 08:58:23 +02:00
Salvatore Sanfilippo
c40bd5fd61 Merge pull request #3342 from yossigo/fix_calloc
Fix RedisModule_Calloc() definition typo.
2016-06-24 08:58:23 +02:00
Yossi Gottlieb
19c401d81d Fix RedisModule_Calloc() definition typo. 2016-06-23 22:30:32 +03:00
Yossi Gottlieb
0c94a88075 Fix RedisModule_Calloc() definition typo. 2016-06-23 22:30:32 +03:00
rojingeorge
4242fdf45c Display the nodes summary once the cluster is established using redis-trib.rb
Display the nodes summary once the cluster is established using
redis-trib.rb
After the cluster meet and join was done, when the summary was shown, it
was giving info regarding the nodes. This fix ensures that confusion
where the slaves were shown as masters.
Fix would be to reset the nodes and reload the cluster information
before checking the cluster status after creating it.
2016-06-23 21:58:03 +05:30
rojingeorge
feee7d547a Display the nodes summary once the cluster is established using redis-trib.rb
Display the nodes summary once the cluster is established using
redis-trib.rb
After the cluster meet and join was done, when the summary was shown, it
was giving info regarding the nodes. This fix ensures that confusion
where the slaves were shown as masters.
Fix would be to reset the nodes and reload the cluster information
before checking the cluster status after creating it.
2016-06-23 21:58:03 +05:30
rojingeorge
4aab50ac7b Merge remote-tracking branch 'refs/remotes/antirez/unstable' into unstable 2016-06-23 21:34:03 +05:30
rojingeorge
fae1ce2316 Merge remote-tracking branch 'refs/remotes/antirez/unstable' into unstable 2016-06-23 21:34:03 +05:30
Salvatore Sanfilippo
f60aa4de30 Merge pull request #3324 from mishan/fix-wrong-comment-about-sentinel-mode
Fix incorrect comment for checkForSentinelMode function
2016-06-23 16:39:51 +02:00
Salvatore Sanfilippo
ae1a9be8b0 Merge pull request #3324 from mishan/fix-wrong-comment-about-sentinel-mode
Fix incorrect comment for checkForSentinelMode function
2016-06-23 16:39:51 +02:00
antirez
18983113c5 Modules: mention RedisModule_Calloc() in the doc. 2016-06-23 16:20:48 +02:00
antirez
67950680b9 Modules: mention RedisModule_Calloc() in the doc. 2016-06-23 16:20:48 +02:00
Salvatore Sanfilippo
3a0b776b94 Merge pull request #3335 from dvirsky/rm_calloc
added RM_Calloc implementation
2016-06-23 16:19:14 +02:00
Salvatore Sanfilippo
8e9eef76bf Merge pull request #3335 from dvirsky/rm_calloc
added RM_Calloc implementation
2016-06-23 16:19:14 +02:00
antirez
c026b5cd3e Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-06-23 16:18:57 +02:00
antirez
2e9fd96c57 Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-06-23 16:18:57 +02:00
antirez
0f484d8312 Actually remove static from #3331.
I forgot -a when amending in the previous commit.
2016-06-23 16:18:30 +02:00
antirez
b98fc4bfee Actually remove static from #3331.
I forgot -a when amending in the previous commit.
2016-06-23 16:18:30 +02:00
Salvatore Sanfilippo
28ea585fce Merge pull request #3336 from yossigo/create_string_from_string
Add RedisModule_CreateStringFromString().
2016-06-23 16:16:28 +02:00
Salvatore Sanfilippo
9df3006aa8 Merge pull request #3336 from yossigo/create_string_from_string
Add RedisModule_CreateStringFromString().
2016-06-23 16:16:28 +02:00
antirez
c0ca87dcc0 Minor change to conform PR #3331 to Redis code base style.
Also avoid "static" in order to have symbols during crashes.
2016-06-23 16:14:16 +02:00
antirez
3d42fa5b75 Minor change to conform PR #3331 to Redis code base style.
Also avoid "static" in order to have symbols during crashes.
2016-06-23 16:14:16 +02:00
Salvatore Sanfilippo
a66dd43331 Merge pull request #3331 from yossigo/fix_openkey_crash
Fix occasional RM_OpenKey() crashes.
2016-06-23 16:12:07 +02:00