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