Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
096ad2e8
Commit
096ad2e8
authored
Jan 22, 2015
by
antirez
Browse files
Merge branch 'testing' into 3.0
parents
00e76ae8
71da1b15
Changes
2
Show whitespace changes
Inline
Side-by-side
src/util.c
View file @
096ad2e8
...
...
@@ -40,6 +40,7 @@
#include <stdint.h>
#include "util.h"
#include "sha1.h"
/* Glob-style pattern matching. */
int
stringmatchlen
(
const
char
*
pattern
,
int
patternLen
,
...
...
@@ -428,11 +429,44 @@ int d2string(char *buf, size_t len, double value) {
* having run_id == A, and you reconnect and it has run_id == B, you can be
* sure that it is either a different instance or it was restarted. */
void
getRandomHexChars
(
char
*
p
,
unsigned
int
len
)
{
FILE
*
fp
=
fopen
(
"/dev/urandom"
,
"r"
);
char
*
charset
=
"0123456789abcdef"
;
unsigned
int
j
;
if
(
fp
==
NULL
||
fread
(
p
,
len
,
1
,
fp
)
==
0
)
{
/* Global state. */
static
int
seed_initialized
=
0
;
static
unsigned
char
seed
[
20
];
/* The SHA1 seed, from /dev/urandom. */
static
uint64_t
counter
=
0
;
/* The counter we hash with the seed. */
if
(
!
seed_initialized
)
{
/* Initialize a seed and use SHA1 in counter mode, where we hash
* the same seed with a progressive counter. For the goals of this
* function we just need non-colliding strings, there are no
* cryptographic security needs. */
FILE
*
fp
=
fopen
(
"/dev/urandom"
,
"r"
);
if
(
fp
&&
fread
(
seed
,
sizeof
(
seed
),
1
,
fp
)
==
1
)
seed_initialized
=
1
;
if
(
fp
)
fclose
(
fp
);
}
if
(
seed_initialized
)
{
while
(
len
)
{
unsigned
char
digest
[
20
];
SHA1_CTX
ctx
;
unsigned
int
copylen
=
len
>
20
?
20
:
len
;
SHA1Init
(
&
ctx
);
SHA1Update
(
&
ctx
,
seed
,
sizeof
(
seed
));
SHA1Update
(
&
ctx
,
(
unsigned
char
*
)
&
counter
,
sizeof
(
counter
));
SHA1Final
(
digest
,
&
ctx
);
counter
++
;
memcpy
(
p
,
digest
,
copylen
);
/* Convert to hex digits. */
for
(
j
=
0
;
j
<
copylen
;
j
++
)
p
[
j
]
=
charset
[
p
[
j
]
&
0x0F
];
len
-=
copylen
;
p
+=
copylen
;
}
}
else
{
/* If we can't read from /dev/urandom, do some reasonable effort
* in order to create some entropy, since this function is used to
* generate run_id and cluster instance IDs */
...
...
@@ -459,14 +493,12 @@ void getRandomHexChars(char *p, unsigned int len) {
x
+=
sizeof
(
pid
);
}
/* Finally xor it with rand() output, that was already seeded with
* time() at startup. */
for
(
j
=
0
;
j
<
len
;
j
++
)
* time() at startup
, and convert to hex digits
. */
for
(
j
=
0
;
j
<
len
;
j
++
)
{
p
[
j
]
^=
rand
();
}
/* Turn it into hex digits taking just 4 bits out of 8 for every byte. */
for
(
j
=
0
;
j
<
len
;
j
++
)
p
[
j
]
=
charset
[
p
[
j
]
&
0x0F
];
if
(
fp
)
fclose
(
fp
);
}
}
}
/* Given the filename, return the absolute path as an SDS string, or NULL
...
...
tests/cluster/tests/includes/init-tests.tcl
View file @
096ad2e8
...
...
@@ -28,8 +28,10 @@ test "Cluster nodes are reachable" {
test
"Cluster nodes hard reset"
{
foreach_redis_id id
{
catch
{
R $id flushall
}
;
# May fail for readonly slaves.
R $id MULTI
R $id cluster reset hard
R $id cluster set-config-epoch
[
expr
{
$id
+1
}]
R $id EXEC
R $id config set cluster-node-timeout 3000
R $id config set cluster-slave-validity-factor 10
R $id config rewrite
...
...
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