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
7f9c9734
Commit
7f9c9734
authored
Mar 14, 2011
by
Pieter Noordhuis
Browse files
Fix DEBUG DIGEST, SORT and AOF rewrite
parent
366e872d
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/aof.c
View file @
7f9c9734
...
@@ -452,21 +452,55 @@ int rewriteAppendOnlyFile(char *filename) {
...
@@ -452,21 +452,55 @@ int rewriteAppendOnlyFile(char *filename) {
}
}
}
else
if
(
o
->
type
==
REDIS_ZSET
)
{
}
else
if
(
o
->
type
==
REDIS_ZSET
)
{
/* Emit the ZADDs needed to rebuild the sorted set */
/* Emit the ZADDs needed to rebuild the sorted set */
zset
*
zs
=
o
->
ptr
;
char
cmd
[]
=
"*4
\r\n
$4
\r\n
ZADD
\r\n
"
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
=
o
->
ptr
;
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
unsigned
char
*
eptr
,
*
sptr
;
char
cmd
[]
=
"*4
\r\n
$4
\r\n
ZADD
\r\n
"
;
unsigned
char
*
vstr
;
robj
*
eleobj
=
dictGetEntryKey
(
de
);
unsigned
int
vlen
;
double
*
score
=
dictGetEntryVal
(
de
);
long
long
vll
;
double
score
;
if
(
fwrite
(
cmd
,
sizeof
(
cmd
)
-
1
,
1
,
fp
)
==
0
)
goto
werr
;
if
(
fwriteBulkObject
(
fp
,
&
key
)
==
0
)
goto
werr
;
eptr
=
ziplistIndex
(
zl
,
0
);
if
(
fwriteBulkDouble
(
fp
,
*
score
)
==
0
)
goto
werr
;
redisAssert
(
eptr
!=
NULL
);
if
(
fwriteBulkObject
(
fp
,
eleobj
)
==
0
)
goto
werr
;
sptr
=
ziplistNext
(
zl
,
eptr
);
redisAssert
(
sptr
!=
NULL
);
while
(
eptr
!=
NULL
)
{
redisAssert
(
ziplistGet
(
eptr
,
&
vstr
,
&
vlen
,
&
vll
));
score
=
zzlGetScore
(
sptr
);
if
(
fwrite
(
cmd
,
sizeof
(
cmd
)
-
1
,
1
,
fp
)
==
0
)
goto
werr
;
if
(
fwriteBulkObject
(
fp
,
&
key
)
==
0
)
goto
werr
;
if
(
fwriteBulkDouble
(
fp
,
score
)
==
0
)
goto
werr
;
if
(
vstr
!=
NULL
)
{
if
(
fwriteBulkString
(
fp
,(
char
*
)
vstr
,
vlen
)
==
0
)
goto
werr
;
}
else
{
if
(
fwriteBulkLongLong
(
fp
,
vll
)
==
0
)
goto
werr
;
}
zzlNext
(
zl
,
&
eptr
,
&
sptr
);
}
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_RAW
)
{
zset
*
zs
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
robj
*
eleobj
=
dictGetEntryKey
(
de
);
double
*
score
=
dictGetEntryVal
(
de
);
if
(
fwrite
(
cmd
,
sizeof
(
cmd
)
-
1
,
1
,
fp
)
==
0
)
goto
werr
;
if
(
fwriteBulkObject
(
fp
,
&
key
)
==
0
)
goto
werr
;
if
(
fwriteBulkDouble
(
fp
,
*
score
)
==
0
)
goto
werr
;
if
(
fwriteBulkObject
(
fp
,
eleobj
)
==
0
)
goto
werr
;
}
dictReleaseIterator
(
di
);
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
}
dictReleaseIterator
(
di
);
}
else
if
(
o
->
type
==
REDIS_HASH
)
{
}
else
if
(
o
->
type
==
REDIS_HASH
)
{
char
cmd
[]
=
"*4
\r\n
$4
\r\n
HSET
\r\n
"
;
char
cmd
[]
=
"*4
\r\n
$4
\r\n
HSET
\r\n
"
;
...
...
src/debug.c
View file @
7f9c9734
...
@@ -127,22 +127,57 @@ void computeDatasetDigest(unsigned char *final) {
...
@@ -127,22 +127,57 @@ void computeDatasetDigest(unsigned char *final) {
}
}
setTypeReleaseIterator
(
si
);
setTypeReleaseIterator
(
si
);
}
else
if
(
o
->
type
==
REDIS_ZSET
)
{
}
else
if
(
o
->
type
==
REDIS_ZSET
)
{
zset
*
zs
=
o
->
ptr
;
unsigned
char
eledigest
[
20
];
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
=
o
->
ptr
;
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
unsigned
char
*
eptr
,
*
sptr
;
robj
*
eleobj
=
dictGetEntryKey
(
de
);
unsigned
char
*
vstr
;
double
*
score
=
dictGetEntryVal
(
de
);
unsigned
int
vlen
;
unsigned
char
eledigest
[
20
];
long
long
vll
;
double
score
;
snprintf
(
buf
,
sizeof
(
buf
),
"%.17g"
,
*
score
);
memset
(
eledigest
,
0
,
20
);
eptr
=
ziplistIndex
(
zl
,
0
);
mixObjectDigest
(
eledigest
,
eleobj
);
redisAssert
(
eptr
!=
NULL
);
mixDigest
(
eledigest
,
buf
,
strlen
(
buf
));
sptr
=
ziplistNext
(
zl
,
eptr
);
xorDigest
(
digest
,
eledigest
,
20
);
redisAssert
(
sptr
!=
NULL
);
while
(
eptr
!=
NULL
)
{
redisAssert
(
ziplistGet
(
eptr
,
&
vstr
,
&
vlen
,
&
vll
));
score
=
zzlGetScore
(
sptr
);
memset
(
eledigest
,
0
,
20
);
if
(
vstr
!=
NULL
)
{
mixDigest
(
eledigest
,
vstr
,
vlen
);
}
else
{
ll2string
(
buf
,
sizeof
(
buf
),
vll
);
mixDigest
(
eledigest
,
buf
,
strlen
(
buf
));
}
snprintf
(
buf
,
sizeof
(
buf
),
"%.17g"
,
score
);
mixDigest
(
eledigest
,
buf
,
strlen
(
buf
));
xorDigest
(
digest
,
eledigest
,
20
);
zzlNext
(
zl
,
&
eptr
,
&
sptr
);
}
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_RAW
)
{
zset
*
zs
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
robj
*
eleobj
=
dictGetEntryKey
(
de
);
double
*
score
=
dictGetEntryVal
(
de
);
snprintf
(
buf
,
sizeof
(
buf
),
"%.17g"
,
*
score
);
memset
(
eledigest
,
0
,
20
);
mixObjectDigest
(
eledigest
,
eleobj
);
mixDigest
(
eledigest
,
buf
,
strlen
(
buf
));
xorDigest
(
digest
,
eledigest
,
20
);
}
dictReleaseIterator
(
di
);
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
}
dictReleaseIterator
(
di
);
}
else
if
(
o
->
type
==
REDIS_HASH
)
{
}
else
if
(
o
->
type
==
REDIS_HASH
)
{
hashTypeIterator
*
hi
;
hashTypeIterator
*
hi
;
robj
*
obj
;
robj
*
obj
;
...
...
src/redis.h
View file @
7f9c9734
...
@@ -779,6 +779,9 @@ zskiplist *zslCreate(void);
...
@@ -779,6 +779,9 @@ zskiplist *zslCreate(void);
void
zslFree
(
zskiplist
*
zsl
);
void
zslFree
(
zskiplist
*
zsl
);
zskiplistNode
*
zslInsert
(
zskiplist
*
zsl
,
double
score
,
robj
*
obj
);
zskiplistNode
*
zslInsert
(
zskiplist
*
zsl
,
double
score
,
robj
*
obj
);
unsigned
char
*
zzlInsert
(
unsigned
char
*
zl
,
robj
*
ele
,
double
score
);
unsigned
char
*
zzlInsert
(
unsigned
char
*
zl
,
robj
*
ele
,
double
score
);
double
zzlGetScore
(
unsigned
char
*
sptr
);
void
zzlNext
(
unsigned
char
*
zl
,
unsigned
char
**
eptr
,
unsigned
char
**
sptr
);
void
zzlPrev
(
unsigned
char
*
zl
,
unsigned
char
**
eptr
,
unsigned
char
**
sptr
);
unsigned
int
zsetLength
(
robj
*
zobj
);
unsigned
int
zsetLength
(
robj
*
zobj
);
void
zsetConvert
(
robj
*
zobj
,
int
encoding
);
void
zsetConvert
(
robj
*
zobj
,
int
encoding
);
...
...
src/sort.c
View file @
7f9c9734
...
@@ -199,6 +199,9 @@ void sortCommand(redisClient *c) {
...
@@ -199,6 +199,9 @@ void sortCommand(redisClient *c) {
j
++
;
j
++
;
}
}
/* Destructively convert encoded sorted sets for SORT. */
if
(
sortval
->
type
==
REDIS_ZSET
)
zsetConvert
(
sortval
,
REDIS_ENCODING_RAW
);
/* Load the sorting vector with all the objects to sort */
/* Load the sorting vector with all the objects to sort */
switch
(
sortval
->
type
)
{
switch
(
sortval
->
type
)
{
case
REDIS_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
case
REDIS_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
...
...
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