Work on shard listing
authorJeroen van der Heijden <jeroen@transceptor.technology>
Thu, 10 Sep 2020 16:40:14 +0000 (18:40 +0200)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Thu, 10 Sep 2020 16:40:14 +0000 (18:40 +0200)
include/omap/omap.h
include/siri/db/shards.h
src/siri/db/listener.c
src/siri/db/shards.c
src/siri/optimize.c

index 7b5d5fd9498c55c6a11197adfe51b7b4648cc75e..3b70ecf6fb87f6accce161be8c62d82bc508c126 100644 (file)
@@ -36,10 +36,9 @@ uint64_t * omap_last_id(omap_t * omap);
 void * omap_rm(omap_t * omap, uint64_t id);
 static inline omap_iter_t omap_iter(omap_t * omap);
 static inline uint64_t omap_iter_id(omap_iter_t iter);
-#define omap_each(iter__, dt__, var__) \
-        dt__ * var__; \
-        iter__ && \
-        (var__ = (dt__ *) iter__->data_); \
+#define omap_loop(iter__, var__) \
+        ;iter__ && \
+        (var__ = iter__->data_); \
         iter__ = iter__->next_
 
 struct omap_s
index ed7c64c32de8764594807ce04bdc00a7cf4e23cf..0d66147e2735e74cafcc844f134f1b8ed97084ec 100644 (file)
@@ -30,5 +30,7 @@ double siridb_shards_count_percent(
         siridb_t * siridb,
         uint64_t end_ts,
         uint8_t tp);
+size_t siridb_shards_n(siridb_t * siridb);
+vec_t * siridb_shards_vec(siridb_t * siridb);
 
 #endif  /* SIRIDB_SHARDS_H_ */
index 593860914a2c13b6bdad709f9dfa392b3cb3e03e..693ca0081b8ee146ae495090f1b296728a781781 100644 (file)
@@ -2972,7 +2972,7 @@ static void exit_drop_shards(uv_async_t * handle)
     }
 
     double percent = (double)
-            q_drop->shards_list->len / siridb->shards->len;
+            q_drop->shards_list->len / siridb_shards_n(siridb);
 
     if (IS_MASTER &&
         q_drop->shards_list->len &&
index 5fd4ae17f0d121d5d5f665f848c47e8c619adae1..784a5062c8ddf8c3d326550f7ea3816d4a9beff9 100644 (file)
@@ -328,6 +328,43 @@ int siridb_shards_add_points(
     return siri_err;
 }
 
+static inline int SHARDS_count_cb(omap_t * omap, size_t * n)
+{
+    *n += omap->n;
+    return 0;
+}
+
+size_t siridb_shards_n(siridb_t * siridb)
+{
+    size_t n = 0;
+    imap_walk(siridb->shards, (imap_cb) SHARDS_count_cb, &n);
+    return n;
+}
+
+static inline int SHARDS_to_vec_cb(omap_t * omap, vec_t * v)
+{
+    omap_iter_t iter = omap_iter(omap);
+    siridb_shard_t * shard;
+    for (;iter && (shard = iter->data_); iter = iter->next_)
+    {
+        vec_append(v, shard);
+        ++shard->ref;
+    }
+    return 0;
+}
+
+vec_t * siridb_shards_vec(siridb_t * siridb)
+{
+    size_t n = siridb_shards_n(siridb);
+    vec_t * vec = vec_new(n);
+    if (vec == NULL)
+    {
+        return NULL;
+    }
+    imap_walk(siridb->shards, (imap_cb) SHARDS_to_vec_cb, &n);
+    return vec;
+}
+
 double siridb_shards_count_percent(
         siridb_t * siridb,
         uint64_t end_ts,
index b9fb1ccc46d6ca1a6d5ff4246ce365b0c889c7ab..f1b48a65f749ad822f5ac289725cf84d666413e0 100644 (file)
@@ -12,6 +12,7 @@
 #include <assert.h>
 #include <logger/logger.h>
 #include <siri/db/shard.h>
+#include <siri/db/shards.h>
 #include <siri/optimize.h>
 #include <siri/siri.h>
 #include <vec/vec.h>
@@ -300,7 +301,7 @@ static void OPTIMIZE_work(uv_work_t * work  __attribute__((unused)))
 
         uv_mutex_lock(&siridb->shards_mutex);
 
-        slshards = imap_2vec_ref(siridb->shards);
+        slshards = siridb_shards_vec(siridb);
 
         uv_mutex_unlock(&siridb->shards_mutex);