Skip to content
2 changes: 1 addition & 1 deletion src/aof.c
Original file line number Diff line number Diff line change
Expand Up @@ -1910,7 +1910,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
return 0;
}
}
sds ele = node->ele;
sds ele = zslGetNodeElement(node);
if (!rioWriteBulkDouble(r, node->score) || !rioWriteBulkString(r, ele, sdslen(ele))) {
hashtableResetIterator(&iter);
return 0;
Expand Down
4 changes: 2 additions & 2 deletions src/db.c
Original file line number Diff line number Diff line change
Expand Up @@ -1057,7 +1057,7 @@ void hashtableScanCallback(void *privdata, void *entry) {
key = (sds)entry;
} else if (o->type == OBJ_ZSET) {
zskiplistNode *node = (zskiplistNode *)entry;
key = node->ele;
key = zslGetNodeElement(node);
/* zset data is copied after filtering by key */
} else if (o->type == OBJ_HASH) {
key = entryGetField(entry);
Expand All @@ -1080,7 +1080,7 @@ void hashtableScanCallback(void *privdata, void *entry) {
if (o->type == OBJ_ZSET) {
/* zset data is copied */
zskiplistNode *node = (zskiplistNode *)entry;
key = sdsdup(node->ele);
key = sdsdup(zslGetNodeElement(node));
if (!data->only_keys) {
char buf[MAX_LONG_DOUBLE_CHARS];
int len = ld2string(buf, sizeof(buf), node->score, LD_STR_AUTO);
Expand Down
3 changes: 2 additions & 1 deletion src/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,8 @@ void xorObjectDigest(serverDb *db, robj *keyobj, unsigned char *digest, robj *o)
const int len = fpconv_dtoa(node->score, buf);
buf[len] = '\0';
memset(eledigest, 0, 20);
mixDigest(eledigest, node->ele, sdslen(node->ele));
sds ele = zslGetNodeElement(node);
mixDigest(eledigest, ele, sdslen(ele));
mixDigest(eledigest, buf, strlen(buf));
xorDigest(digest, eledigest, 20);
}
Expand Down
8 changes: 2 additions & 6 deletions src/defrag.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,8 @@ static void activeDefragZsetNode(void *privdata, void *entry_ref) {
zskiplistNode **node_ref = (zskiplistNode **)entry_ref;
zskiplistNode *node = *node_ref;

/* defragment node internals */
sds newsds = activeDefragSds(node->ele);
if (newsds) node->ele = newsds;

const double score = node->score;
const sds ele = node->ele;
const sds ele = zslGetNodeElement(node);

/* find skiplist pointers that need to be updated if we end up moving the
* skiplist node. */
Expand All @@ -283,7 +279,7 @@ static void activeDefragZsetNode(void *privdata, void *entry_ref) {
zskiplistNode *next = x->level[i].forward;
while (next &&
(next->score < score ||
(next->score == score && sdscmp(next->ele, ele) < 0))) {
(next->score == score && sdscmp(zslGetNodeElement(next), ele) < 0))) {
x = next;
next = x->level[i].forward;
}
Expand Down
4 changes: 2 additions & 2 deletions src/geo.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,8 @@ int geoGetPointsInRange(robj *zobj, double min, double max, GeoShape *shape, geo
if (!zslValueLteMax(ln->score, &range)) break;
if (geoWithinShape(shape, ln->score, xy, &distance) == C_OK) {
/* Append the new element. */
geoArrayAppend(ga, xy, distance, ln->score, sdsdup(ln->ele));
sds ele = zslGetNodeElement(ln);
geoArrayAppend(ga, xy, distance, ln->score, sdsdup(ele));
}
if (ga->used && limit && ga->used >= limit) break;
ln = ln->level[0].forward;
Expand Down Expand Up @@ -825,7 +826,6 @@ void georadiusGeneric(client *c, int srcKeyIndex, int flags) {
totelelen += elelen;
znode = zslInsert(zs->zsl, score, gp->member);
serverAssert(hashtableAdd(zs->ht, znode));
gp->member = NULL;
}

if (returned_items) {
Expand Down
9 changes: 5 additions & 4 deletions src/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -5113,7 +5113,8 @@ ValkeyModuleString *VM_ZsetRangeCurrentElement(ValkeyModuleKey *key, double *sco
} else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) {
zskiplistNode *ln = key->u.zset.current;
if (score) *score = ln->score;
str = createStringObject(ln->ele, sdslen(ln->ele));
sds ele = zslGetNodeElement(ln);
str = createStringObject(ele, sdslen(ele));
} else {
serverPanic("Unsupported zset encoding");
}
Expand Down Expand Up @@ -5170,7 +5171,7 @@ int VM_ZsetRangeNext(ValkeyModuleKey *key) {
key->u.zset.er = 1;
return 0;
} else if (key->u.zset.type == VALKEYMODULE_ZSET_RANGE_LEX) {
if (!zslLexValueLteMax(next->ele, &key->u.zset.lrs)) {
if (!zslLexValueLteMax(zslGetNodeElement(next), &key->u.zset.lrs)) {
key->u.zset.er = 1;
return 0;
}
Expand Down Expand Up @@ -5232,7 +5233,7 @@ int VM_ZsetRangePrev(ValkeyModuleKey *key) {
key->u.zset.er = 1;
return 0;
} else if (key->u.zset.type == VALKEYMODULE_ZSET_RANGE_LEX) {
if (!zslLexValueGteMin(prev->ele, &key->u.zset.lrs)) {
if (!zslLexValueGteMin(zslGetNodeElement(prev), &key->u.zset.lrs)) {
key->u.zset.er = 1;
return 0;
}
Expand Down Expand Up @@ -11241,7 +11242,7 @@ static void moduleScanKeyHashtableCallback(void *privdata, void *entry) {
/* no value */
} else if (o->type == OBJ_ZSET) {
zskiplistNode *node = (zskiplistNode *)entry;
key = node->ele;
key = zslGetNodeElement(node);
value = createStringObjectFromLongDouble(node->score, 0);
} else if (o->type == OBJ_HASH) {
key = entryGetField(entry);
Expand Down
19 changes: 4 additions & 15 deletions src/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,21 +657,11 @@ void dismissSetObject(robj *o, size_t size_hint) {
}

/* See dismissObject() */
void dismissZsetObject(robj *o, size_t size_hint) {
void dismissZsetObject(robj *o) {
if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr;
zskiplist *zsl = zs->zsl;
serverAssert(zsl->length != 0);
/* We iterate all nodes only when average member size is bigger than a
* page size, and there's a high chance we'll actually dismiss something. */
if (size_hint / zsl->length >= server.page_size) {
zskiplistNode *zn = zsl->tail;
while (zn != NULL) {
dismissSds(zn->ele);
zn = zn->backward;
}
}

/* The skiplist nodes are usually smaller than the page size (typically 4KB),
* so we skip releasing the skiplist and only release the hashtable. */
dismissHashtable(zs->ht);
} else if (o->encoding == OBJ_ENCODING_LISTPACK) {
dismissMemory(o->ptr, lpBytes((unsigned char *)o->ptr));
Expand Down Expand Up @@ -750,7 +740,7 @@ void dismissObject(robj *o, size_t size_hint) {
case OBJ_STRING: dismissStringObject(o); break;
case OBJ_LIST: dismissListObject(o, size_hint); break;
case OBJ_SET: dismissSetObject(o, size_hint); break;
case OBJ_ZSET: dismissZsetObject(o, size_hint); break;
case OBJ_ZSET: dismissZsetObject(o); break;
case OBJ_HASH: dismissHashObject(o, size_hint); break;
case OBJ_STREAM: dismissStreamObject(o, size_hint); break;
default: break;
Expand Down Expand Up @@ -1193,7 +1183,6 @@ size_t objectComputeSize(robj *key, robj *o, size_t sample_size, int dbid) {
asize = zmalloc_size((void *)o) + sizeof(zset) + sizeof(zskiplist) +
hashtableMemUsage(ht) + zmalloc_size(zsl->header);
while (znode != NULL && samples < sample_size) {
elesize += sdsAllocSize(znode->ele);
elesize += zmalloc_size(znode);
samples++;
znode = znode->level[0].forward;
Expand Down
4 changes: 3 additions & 1 deletion src/rdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,8 @@ ssize_t rdbSaveObject(rio *rdb, robj *o, robj *key, int dbid) {
* O(1) instead of O(log(N)). */
zskiplistNode *zn = zsl->tail;
while (zn != NULL) {
if ((n = rdbSaveRawString(rdb, (unsigned char *)zn->ele, sdslen(zn->ele))) == -1) {
sds ele = zslGetNodeElement(zn);
if ((n = rdbSaveRawString(rdb, (unsigned char *)ele, sdslen(ele))) == -1) {
return -1;
}
nwritten += n;
Expand Down Expand Up @@ -2074,6 +2075,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key, int dbid, int *error) {
totelelen += sdslen(sdsele);

znode = zslInsert(zs->zsl, score, sdsele);
sdsfree(sdsele);
if (!hashtableAdd(zs->ht, znode)) {
rdbReportCorruptRDB("Duplicate zset fields detected");
decrRefCount(o);
Expand Down
2 changes: 1 addition & 1 deletion src/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ hashtableType setHashtableType = {

const void *zsetHashtableGetKey(const void *element) {
const zskiplistNode *node = element;
return node->ele;
return zslGetNodeElement(node);
}

/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */
Expand Down
2 changes: 1 addition & 1 deletion src/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -1402,7 +1402,6 @@ struct sharedObjectsStruct {

/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
sds ele;
double score;
struct zskiplistNode *backward;
struct zskiplistLevel {
Expand Down Expand Up @@ -3238,6 +3237,7 @@ zskiplist *zslCreate(void);
void zslFree(zskiplist *zsl);
zskiplistNode *zslInsert(zskiplist *zsl, double score, sds ele);
zskiplistNode *zslNthInRange(zskiplist *zsl, zrangespec *range, long n, long *rank);
sds zslGetNodeElement(const zskiplistNode *x);
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);
Expand Down
6 changes: 4 additions & 2 deletions src/sort.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ void sortCommandGeneric(client *c, int readonly) {

while (rangelen--) {
serverAssertWithInfo(c, sortval, ln != NULL);
sdsele = ln->ele;
sdsele = zslGetNodeElement(ln);
vector[j].obj = createStringObject(sdsele, sdslen(sdsele));
vector[j].u.score = 0;
vector[j].u.cmpobj = NULL;
Expand All @@ -449,9 +449,11 @@ void sortCommandGeneric(client *c, int readonly) {
hashtableIterator iter;
hashtableInitIterator(&iter, ht, 0);
void *next;
sds sdsele;
while (hashtableNext(&iter, &next)) {
zskiplistNode *node = next;
vector[j].obj = createStringObject(node->ele, sdslen(node->ele));
sdsele = zslGetNodeElement(node);
vector[j].obj = createStringObject(sdsele, sdslen(sdsele));
vector[j].u.score = 0;
vector[j].u.cmpobj = NULL;
j++;
Expand Down
Loading
Loading