Commit cb8032d6 authored by Matt Stancliff's avatar Matt Stancliff
Browse files

Add adaptive quicklist fill factor

Fill factor now has two options:
  - negative (1-5) for size-based ziplist filling
  - positive for length-based ziplist filling with implicit size cap.

Negative offsets define ziplist size limits of:
  -1: 4k
  -2: 8k
  -3: 16k
  -4: 32k
  -5: 64k

Positive offsets now automatically limit their max size to 8k.  Any
elements larger than 8k will be in individual nodes.

Positive ziplist fill factors will keep adding elements
to a ziplist until one of:
  - ziplist has FILL number of elements
    - or -
  - ziplist grows above our ziplist max size (currently 8k)

When using positive fill factors, if you insert a large
element (over 8k), that element will automatically allocate
an individual quicklist node with one element and no other elements will be
in the same ziplist inside that quicklist node.

When using negative fill factors, elements up to the size
limit can be added to one quicklist node.  If an element
is added larger than the max ziplist size, that element
will be allocated an individual ziplist in a new quicklist node.

Tests also updated to start testing at fill factor -5.
parent 2cf51b46
This diff is collapsed.
...@@ -38,6 +38,7 @@ typedef struct quicklistNode { ...@@ -38,6 +38,7 @@ typedef struct quicklistNode {
struct quicklistNode *next; struct quicklistNode *next;
unsigned char *zl; unsigned char *zl;
unsigned int count; /* cached count of items in ziplist */ unsigned int count; /* cached count of items in ziplist */
unsigned int sz; /* ziplist size in bytes */
} quicklistNode; } quicklistNode;
typedef struct quicklist { typedef struct quicklist {
...@@ -71,20 +72,19 @@ typedef struct quicklistEntry { ...@@ -71,20 +72,19 @@ typedef struct quicklistEntry {
/* Prototypes */ /* Prototypes */
quicklist *quicklistCreate(void); quicklist *quicklistCreate(void);
void quicklistRelease(quicklist *quicklist); void quicklistRelease(quicklist *quicklist);
quicklist *quicklistPushHead(quicklist *quicklist, const size_t fill, quicklist *quicklistPushHead(quicklist *quicklist, const int fill, void *value,
void *value, const size_t sz); const size_t sz);
quicklist *quicklistPushTail(quicklist *quicklist, const size_t fill, quicklist *quicklistPushTail(quicklist *quicklist, const int fill, void *value,
void *value, const size_t sz); const size_t sz);
void quicklistPush(quicklist *quicklist, const size_t fill, void *value, void quicklistPush(quicklist *quicklist, const int fill, void *value,
const size_t sz, int where); const size_t sz, int where);
void quicklistAppendZiplist(quicklist *quicklist, unsigned char *zl); void quicklistAppendZiplist(quicklist *quicklist, unsigned char *zl);
quicklist *quicklistAppendValuesFromZiplist(quicklist *quicklist, quicklist *quicklistAppendValuesFromZiplist(quicklist *quicklist,
const size_t fill, const int fill, unsigned char *zl);
unsigned char *zl); quicklist *quicklistCreateFromZiplist(int fill, unsigned char *zl);
quicklist *quicklistCreateFromZiplist(size_t fill, unsigned char *zl); void quicklistInsertAfter(quicklist *quicklist, const int fill,
void quicklistInsertAfter(quicklist *quicklist, const size_t fill,
quicklistEntry *node, void *value, const size_t sz); quicklistEntry *node, void *value, const size_t sz);
void quicklistInsertBefore(quicklist *quicklist, const size_t fill, void quicklistInsertBefore(quicklist *quicklist, const int fill,
quicklistEntry *node, void *value, const size_t sz); quicklistEntry *node, void *value, const size_t sz);
void quicklistDelEntry(quicklistIter *iter, quicklistEntry *entry); void quicklistDelEntry(quicklistIter *iter, quicklistEntry *entry);
int quicklistReplaceAtIndex(quicklist *quicklist, long index, void *data, int quicklistReplaceAtIndex(quicklist *quicklist, long index, void *data,
...@@ -100,7 +100,7 @@ int quicklistIndex(const quicklist *quicklist, const long long index, ...@@ -100,7 +100,7 @@ int quicklistIndex(const quicklist *quicklist, const long long index,
quicklistEntry *entry); quicklistEntry *entry);
void quicklistRewind(quicklist *quicklist, quicklistIter *li); void quicklistRewind(quicklist *quicklist, quicklistIter *li);
void quicklistRewindTail(quicklist *quicklist, quicklistIter *li); void quicklistRewindTail(quicklist *quicklist, quicklistIter *li);
void quicklistRotate(quicklist *quicklist, const size_t fill); void quicklistRotate(quicklist *quicklist, const int fill);
int quicklistPopCustom(quicklist *quicklist, int where, unsigned char **data, int quicklistPopCustom(quicklist *quicklist, int where, unsigned char **data,
unsigned int *sz, long long *sval, unsigned int *sz, long long *sval,
void *(*saver)(unsigned char *data, unsigned int sz)); void *(*saver)(unsigned char *data, unsigned int sz));
......
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