Changeset: 4a64e8dbe306 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a64e8dbe306
Modified Files:
sql/common/sql_changeset.c
sql/common/sql_hash.c
sql/common/sql_list.c
sql/common/sql_types.c
sql/storage/sql_catalog.c
sql/storage/store.c
Branch: Jan2014
Log Message:
some objects were stored twice in the hash tables connected to
the object lists. When an object got removed from the
list an old reference could stay in the hash leading to
crashes later. All the hash_add/del calls are now refactored into
the list code.
diffs (194 lines):
diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c
--- a/sql/common/sql_changeset.c
+++ b/sql/common/sql_changeset.c
@@ -57,27 +57,17 @@ cs_add(changeset * cs, void *elm, int fl
list_append(cs->set, elm);
if (flag == TR_NEW && !cs->nelm)
cs->nelm = cs->set->t;
- MT_lock_set(&cs->set->ht_lock, "cs_add");
- if (cs->set->ht)
- hash_add(cs->set->ht, base_key(elm), elm);
- MT_lock_unset(&cs->set->ht_lock, "cs_add");
}
void
cs_add_before(changeset * cs, node *n, void *elm)
{
list_append_before(cs->set, n, elm);
- MT_lock_set(&cs->set->ht_lock, "cs_add_before");
- if (cs->set->ht)
- hash_add(cs->set->ht, base_key(elm), elm);
- MT_lock_unset(&cs->set->ht_lock, "cs_add_before");
}
void
cs_del(changeset * cs, node *elm, int flag)
{
- void *val = elm->data;
-
if (flag == TR_NEW) { /* remove just added */
if (cs->nelm == elm)
cs->nelm = elm->next;
@@ -87,10 +77,6 @@ cs_del(changeset * cs, node *elm, int fl
cs->dset = list_new(cs->sa, cs->destroy);
list_move_data(cs->set, cs->dset, elm->data);
}
- MT_lock_set(&cs->set->ht_lock, "cs_del");
- if (cs->set->ht)
- hash_del(cs->set->ht, base_key(val), val);
- MT_lock_unset(&cs->set->ht_lock, "cs_del");
}
int
diff --git a/sql/common/sql_hash.c b/sql/common/sql_hash.c
--- a/sql/common/sql_hash.c
+++ b/sql/common/sql_hash.c
@@ -47,11 +47,26 @@ hash_new(sql_allocator *sa, int size, fk
return ht;
}
+static
+int
+not_done(sql_hash *h, int key, void *value)
+{
+ sql_hash_e *e = h->buckets[key&(h->size-1)];
+
+ while(e && e->value != value) {
+ e = e->chain;
+ }
+ if (e)
+ return 0;
+ return 1;
+}
+
sql_hash_e*
hash_add(sql_hash *h, int key, void *value)
{
sql_hash_e *e = SA_ZNEW(h->sa, sql_hash_e);
+ assert(not_done(h,key,value));
e->chain = h->buckets[key&(h->size-1)];
h->buckets[key&(h->size-1)] = e;
e->key = key;
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -108,15 +108,15 @@ void
list_destroy(list *l)
{
if (l) {
- node **n = &l->h;
+ node *n = l->h;
MT_lock_destroy(&l->ht_lock);
+ l->h = NULL;
if (l->destroy || l->sa == NULL) {
- while (*n) {
- node *t = *n;
+ while (n) {
+ node *t = n;
- *n = NULL;
- n = &t->next;
+ n = t->next;
node_destroy(l, t);
}
}
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1152,9 +1152,6 @@ sql_create_func_(sql_allocator *sa, char
list_append(aggrs, t);
} else {
list_append(funcs, t);
- MT_lock_set(&funcs->ht_lock, "sql_create_func_");
- hash_add(funcs->ht, base_key(&t->base), t);
- MT_lock_unset(&funcs->ht_lock, "sql_create_func_");
}
return t;
}
@@ -1180,9 +1177,6 @@ sql_create_sqlfunc(sql_allocator *sa, ch
t->sql = 1;
t->side_effect = FALSE;
list_append(funcs, t);
- MT_lock_set(&funcs->ht_lock, "sql_create_sqlfunc");
- hash_add(funcs->ht, base_key(&t->base), t);
- MT_lock_unset(&funcs->ht_lock, "sql_create_sqlfunc");
return t;
}
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -293,7 +293,7 @@ find_all_sql_func(sql_schema * s, char *
if (f->type == type && name[0] == b->name[0] &&
strcmp(name, b->name) == 0) {
if (!res)
res = list_create((fdestroy)NULL);
- list_append(res, n->data);
+ list_append(res, f);
}
}
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2885,11 +2885,8 @@ reset_changeset(sql_trans *tr, changeset
if (fs->nelm) {
for (n = fs->nelm; n; ) {
node *nxt = n->next;
+
list_remove_node(fs->set, n);
- MT_lock_set(&fs->set->ht_lock, "reset_changeset");
- if(fs->set->ht)
- hash_del(fs->set->ht, base_key(n->data),
n->data);
- MT_lock_unset(&fs->set->ht_lock, "reset_changeset");
n = nxt;
}
fs->nelm = NULL;
@@ -2917,16 +2914,12 @@ reset_changeset(sql_trans *tr, changeset
fprintf(stderr, "#reset_cs %s\n",
(fb->name)?fb->name:"help");
} else if (fb->id < pfb->id) {
node *t = n->next;
+
if (bs_debug) {
sql_base *b = n->data;
fprintf(stderr, "#reset_cs free %s\n",
(b->name)?b->name:"help");
}
list_remove_node(fs->set, n);
- MT_lock_set(&fs->set->ht_lock,
"reset_changeset");
- if(fs->set->ht)
- hash_del(fs->set->ht,
base_key(n->data), n->data);
- MT_lock_unset(&fs->set->ht_lock,
"reset_changeset");
-
n = t;
} else { /* a new id */
sql_base *r = fd(tr, TR_OLD, pfb, b);
@@ -2951,16 +2944,13 @@ reset_changeset(sql_trans *tr, changeset
}
while ( ok == LOG_OK && n) { /* remove remaining old stuff */
node *t = n->next;
+
if (bs_debug) {
sql_base *b = n->data;
fprintf(stderr, "#reset_cs free %s\n",
(b->name)?b->name:"help");
}
list_remove_node(fs->set, n);
- MT_lock_set(&fs->set->ht_lock, "reset_changeset");
- if(fs->set->ht)
- hash_del(fs->set->ht, base_key(n->data),
n->data);
- MT_lock_unset(&fs->set->ht_lock, "reset_changeset");
n = t;
}
}
@@ -3078,10 +3068,6 @@ reset_schema(sql_trans *tr, sql_schema *
node *nxt = n->next;
list_remove_node(fs->tables.set, n);
- MT_lock_set(&fs->tables.set->ht_lock,
"reset_schema");
- if(fs->tables.set->ht)
- hash_del(fs->tables.set->ht,
base_key(n->data), n->data);
- MT_lock_unset(&fs->tables.set->ht_lock,
"reset_schema");
n = nxt;
}
fs->tables.nelm = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list