Commit 6fcb1800 authored by antirez's avatar antirez
Browse files

Skiplist theoretical fix

parent 454eea7c
...@@ -5092,7 +5092,7 @@ static int zslRandomLevel(void) { ...@@ -5092,7 +5092,7 @@ static int zslRandomLevel(void) {
int level = 1; int level = 1;
while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF)) while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))
level += 1; level += 1;
return level; return (level<ZSKIPLIST_MAXLEVEL) ? level : (ZSKIPLIST_MAXLEVEL-1);
} }
static void zslInsert(zskiplist *zsl, double score, robj *obj) { static void zslInsert(zskiplist *zsl, double score, robj *obj) {
......
...@@ -33,6 +33,7 @@ array set ::redis::fd {} ...@@ -33,6 +33,7 @@ array set ::redis::fd {}
array set ::redis::blocking {} array set ::redis::blocking {}
array set ::redis::callback {} array set ::redis::callback {}
array set ::redis::state {} ;# State in non-blocking reply reading array set ::redis::state {} ;# State in non-blocking reply reading
array set ::redis::statestack {} ;# Stack of states, for nested mbulks
array set ::redis::bulkarg {} array set ::redis::bulkarg {}
array set ::redis::multibulkarg {} array set ::redis::multibulkarg {}
...@@ -117,6 +118,7 @@ proc ::redis::__method__close {id fd} { ...@@ -117,6 +118,7 @@ proc ::redis::__method__close {id fd} {
catch {unset ::redis::fd($id)} catch {unset ::redis::fd($id)}
catch {unset ::redis::blocking($id)} catch {unset ::redis::blocking($id)}
catch {unset ::redis::state($id)} catch {unset ::redis::state($id)}
catch {unset ::redis::statestack($id)}
catch {unset ::redis::callback($id)} catch {unset ::redis::callback($id)}
catch {interp alias {} ::redis::redisHandle$id {}} catch {interp alias {} ::redis::redisHandle$id {}}
} }
...@@ -176,6 +178,7 @@ proc ::redis::redis_read_reply fd { ...@@ -176,6 +178,7 @@ proc ::redis::redis_read_reply fd {
proc ::redis::redis_reset_state id { proc ::redis::redis_reset_state id {
set ::redis::state($id) [dict create buf {} mbulk -1 bulk -1 reply {}] set ::redis::state($id) [dict create buf {} mbulk -1 bulk -1 reply {}]
set ::redis::statestack($id) {}
} }
proc ::redis::redis_call_callback {id type reply} { proc ::redis::redis_call_callback {id type reply} {
...@@ -209,7 +212,13 @@ proc ::redis::redis_readable {fd id} { ...@@ -209,7 +212,13 @@ proc ::redis::redis_readable {fd id} {
::redis::redis_readable $fd $id ::redis::redis_readable $fd $id
} }
} }
* {dict set ::redis::state($id) mbulk [string range $line 1 end-1]} * {
dict set ::redis::state($id) mbulk [string range $line 1 end-1]
# Handle *-1
if {[dict get $::redis::state($id) mbulk] == -1} {
redis_call_callback $id reply {}
}
}
default { default {
redis_call_callback $id err \ redis_call_callback $id err \
"Bad protocol, $type as reply type byte" "Bad protocol, $type as reply type byte"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment