Changeset: 7703eda4a1d5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7703eda4a1d5
Modified Files:
        gdk/gdk_hash.c
Branch: default
Log Message:

Merge with Jul2021 branch.


diffs (159 lines):

diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1146,7 +1146,7 @@ HASHappend_locked(BAT *b, BUN i, const v
        h->heaplink.free += h->width;
        BUN hb = HASHget(h, c);
        BUN hb2;
-       BATiter bi = bat_iterator(b);
+       BATiter bi = bat_iterator_nolock(b);
        int (*atomcmp)(const void *, const void *) = ATOMcompare(h->type);
        for (hb2 = hb;
             hb2 != BUN_NONE;
@@ -1154,7 +1154,6 @@ HASHappend_locked(BAT *b, BUN i, const v
                if (atomcmp(v, BUNtail(bi, hb2)) == 0)
                        break;
        }
-       bat_iterator_end(&bi);
        h->nheads += hb == BUN_NONE;
        h->nunique += hb2 == BUN_NONE;
        HASHputlink(h, i, hb);
@@ -1192,7 +1191,7 @@ HASHinsert_locked(BAT *b, BUN p, const v
        }
        BUN c = HASHprobe(h, v);
        BUN hb = HASHget(h, c);
-       BATiter bi = bat_iterator(b);
+       BATiter bi = bat_iterator_nolock(b);
        int (*atomcmp)(const void *, const void *) = ATOMcompare(h->type);
        if (hb == BUN_NONE || hb < p) {
                /* bucket is empty, or bucket is used by lower numbered
@@ -1209,7 +1208,6 @@ HASHinsert_locked(BAT *b, BUN p, const v
                                        /* found another row with the
                                         * same value, so don't
                                         * increment nunique */
-                                       bat_iterator_end(&bi);
                                        return;
                                }
                                hb = HASHgetlink(h, hb);
@@ -1217,7 +1215,6 @@ HASHinsert_locked(BAT *b, BUN p, const v
                }
                /* this is a new value */
                h->nunique++;
-               bat_iterator_end(&bi);
                return;
        }
        bool seen = false;
@@ -1235,7 +1232,6 @@ HASHinsert_locked(BAT *b, BUN p, const v
                        }
                        if (!seen)
                                h->nunique++;
-                       bat_iterator_end(&bi);
                        return;
                }
                hb = hb2;
@@ -1271,7 +1267,7 @@ HASHdelete_locked(BAT *b, BUN p, const v
        }
        BUN c = HASHprobe(h, v);
        BUN hb = HASHget(h, c);
-       BATiter bi = bat_iterator(b);
+       BATiter bi = bat_iterator_nolock(b);
        int (*atomcmp)(const void *, const void *) = ATOMcompare(h->type);
        if (hb == p) {
                BUN hb2 = HASHgetlink(h, p);
@@ -1287,7 +1283,6 @@ HASHdelete_locked(BAT *b, BUN p, const v
                                        /* found another row with the
                                         * same value, so don't
                                         * decrement nunique below */
-                                       bat_iterator_end(&bi);
                                        return;
                                }
                                hb2 = HASHgetlink(h, hb2);
@@ -1296,7 +1291,6 @@ HASHdelete_locked(BAT *b, BUN p, const v
                /* no rows found with the same value, so number of
                 * unique values is one lower */
                h->nunique--;
-               bat_iterator_end(&bi);
                return;
        }
        bool seen = false;
@@ -1320,7 +1314,6 @@ HASHdelete_locked(BAT *b, BUN p, const v
        HASHputlink(h, p, BUN_NONE);
        if (!seen)
                h->nunique--;
-       bat_iterator_end(&bi);
 }
 
 void
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -320,32 +320,38 @@ os_append_name(objectset *os, objectvers
        return os;
 }
 
+static void
+os_append_id_map(objectset *os)
+{
+       if (os->id_map)
+               hash_destroy(os->id_map);
+       os->id_map = hash_new(os->sa, os->id_based_cnt, (fkeyvalue)&os_id_key);
+       if (os->id_map == NULL)
+               return ;
+       for (versionhead  *n = os->id_based_h; n; n = n->next ) {
+               int key = os_id_key(n);
+
+               if (hash_add(os->id_map, key, n) == NULL) {
+                       hash_destroy(os->id_map);
+                       os->id_map = NULL;
+                       return ;
+               }
+       }
+}
+
 static objectset *
 os_append_node_id(objectset *os, versionhead  *n)
 {
        lock_writer(os);
-       if ((!os->id_map || (os->id_map->size*16 < os->id_based_cnt && 
os->id_based_cnt > HASH_MIN_SIZE)) && os->sa) {
-               hash_destroy(os->id_map);
-               os->id_map = hash_new(os->sa, os->id_based_cnt, 
(fkeyvalue)&os_id_key);
-               if (os->id_map == NULL) {
-                       unlock_writer(os);
-                       return NULL;
-               }
-               for (versionhead  *n = os->id_based_h; n; n = n->next ) {
-                       int key = os_id_key(n);
-
-                       if (hash_add(os->id_map, key, n) == NULL) {
-                               unlock_writer(os);
-                               return NULL;
-                       }
-               }
-       }
+       if (!os->id_map || (os->id_map->size*16 < os->id_based_cnt && 
os->id_based_cnt > HASH_MIN_SIZE))
+               os_append_id_map(os); /* on failure just fall back too slow 
method */
 
        if (os->id_map) {
                int key = os->id_map->key(n);
                if (hash_add(os->id_map, key, n) == NULL) {
-                       unlock_writer(os);
-                       return NULL;
+                       hash_destroy(os->id_map);
+                       os->id_map = NULL;
+                       /* fall back too slow search */
                }
        }
 
@@ -671,10 +677,10 @@ os_destroy(objectset *os, sql_store stor
                n = hn;
        }
 
-       if (os->id_map && !os->id_map->sa)
+       if (os->id_map)
                hash_destroy(os->id_map);
 
-       if (os->name_map && !os->name_map->sa)
+       if (os->name_map)
                hash_destroy(os->name_map);
 
        if (!os->sa)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to