summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/src/estore.h
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/src/estore.h')
-rw-r--r--examples/redis-unstable/src/estore.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/examples/redis-unstable/src/estore.h b/examples/redis-unstable/src/estore.h
new file mode 100644
index 0000000..4bc8fd7
--- /dev/null
+++ b/examples/redis-unstable/src/estore.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2011-Present, Redis Ltd.
+ * All rights reserved.
+ *
+ * Licensed under your choice of (a) the Redis Source Available License 2.0
+ * (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the
+ * GNU Affero General Public License v3 (AGPLv3).
+ *
+ * estore.h -- Expiration Store implementation
+ *
+ * ESTORE (Expiration Store)
+ * =========================
+ *
+ * Index-based expiration store implementation. Similar to kvstore, but built
+ * on top of ebuckets instead of dict. Items stored in estore must embed an
+ * ExpireMeta, enabling efficient active-expiration.
+ *
+ * Estore is currently used to manage "subexpiry" only for hash objects with
+ * field-level expiration (HFE). Each hash with HFE is registered in estore
+ * with the earliest expiration time among its fields.
+ *
+ * USAGE IN REDIS
+ * ==============
+ * This implementation is used to efficiently track hash objects that have
+ * field-level expiration (HFE):
+ * - Each hash with HFE is registered with its earliest field expiration time
+ * - Enables efficient active expiration of hash fields
+ * - Uses Fenwick tree for efficient iteration through non-empty buckets
+ * - Supports cluster mode with per-slot buckets
+ *
+ * IMPLEMENTATION NOTES
+ * ====================
+ * - Built on top of ebuckets data structure for expiration management
+ * - Uses Fenwick tree to track cumulative item counts across buckets
+ * - Supports both single bucket (standalone) and multiple buckets (cluster) modes
+ * - All operations have O(log n) time complexity for bucket selection
+ *
+ * STRUCTURE
+ * =========
+ * - ebArray: Array of ebuckets (one per slot in cluster mode, or just one)
+ * - buckets_sizes: Fenwick tree tracking cumulative counts for efficient iteration
+ * - bucket_type: EbucketsType defining callbacks for the stored items
+ */
+
+#ifndef __ESTORE_H
+#define __ESTORE_H
+
+#include "ebuckets.h"
+#include "fwtree.h"
+
+/* Forward declaration of the estore structure */
+typedef struct _estore estore;
+
+/* Estore API */
+
+estore *estoreCreate(EbucketsType *type, int num_buckets_bits);
+
+void estoreEmpty(estore *es);
+
+int estoreIsEmpty(estore *es);
+
+void estoreRelease(estore *es);
+
+void estoreActiveExpire(estore *es, int eidx, ExpireInfo *info);
+
+uint64_t estoreRemove(estore *es, int eidx, eItem item);
+
+void estoreAdd(estore *es, int eidx, eItem item, uint64_t when);
+
+void estoreUpdate(estore *es, int eidx, eItem item, uint64_t when);
+
+uint64_t estoreSize(estore *es);
+
+ebuckets *estoreGetBuckets(estore *es, int eidx);
+
+int estoreGetFirstNonEmptyBucket(estore *es);
+
+int estoreGetNextNonEmptyBucket(estore *es, int eidx);
+
+void estoreMoveEbuckets(estore *src, estore *dst, int eidx);
+
+/* Hash-specific function to get ExpireMeta from a hash kvobj.
+ * Once we shall have another data-type with subexpiry, we should refactor
+ * ExpireMeta to optionally reside as part of kvobj struct */
+ExpireMeta *hashGetExpireMeta(const eItem kvobjHash);
+
+#ifdef REDIS_TEST
+int estoreTest(int argc, char *argv[], int flags);
+#endif
+
+#endif /* __ESTORE_H */