Changeset: f75fa9bdca94 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f75fa9bdca94 Modified Files: sql/storage/objectset.c Branch: nospare-aris Log Message:
ungoing work diffs (truncated from 521 to 300 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -18,7 +18,7 @@ * keep hash/map of names -> objectversion */ -struct versionchain;// TODO: rename to object_version_chain +struct object_node;// TODO: rename to object_version_chain typedef struct objectversion { bool deleted; @@ -27,30 +27,30 @@ typedef struct objectversion { sql_base *obj; struct objectversion *name_based_older; struct objectversion *name_based_newer; - struct versionchain *name_based_chain; + struct object_node *name_based_chain; struct objectversion *id_based_older; struct objectversion *id_based_newer; - struct versionchain *id_based_chain; + struct object_node *id_based_chain; } objectversion; -typedef struct versionchain { - struct versionchain* prev; - struct versionchain* next; +typedef struct object_node { + struct object_node* prev; + struct object_node* next; objectversion* data; struct objectset* os; -} versionchain; +} object_node; typedef struct objectset { int refcnt; sql_allocator *sa; destroy_fptr destroy; MT_Lock ht_lock; /* latch protecting ht */ - versionchain *name_based_h; - versionchain *name_based_t; - versionchain *id_based_h; - versionchain *id_based_t; - versionchain * graveyard; + object_node *name_based_h; + object_node *name_based_t; + object_node *id_based_h; + object_node *id_based_t; + object_node * graveyard; int name_based_cnt; int id_based_cnt; struct sql_hash *name_map; @@ -60,12 +60,12 @@ typedef struct objectset { } objectset; static int -os_id_key(versionchain *n) +os_id_key(object_node *n) { return BATatoms[TYPE_int].atomHash(&n->data->obj->id); } -static versionchain * +static object_node * find_id(objectset *os, sqlid id) { if (os) { @@ -78,7 +78,7 @@ find_id(objectset *os, sqlid id) return NULL; } - for (versionchain *n = os->id_based_h; n; n = n->next ) { + for (object_node *n = os->id_based_h; n; n = n->next ) { int key = os_id_key(n); if (hash_add(os->id_map, key, n) == NULL) { @@ -92,7 +92,7 @@ find_id(objectset *os, sqlid id) sql_hash_e *he = os->id_map->buckets[key&(os->id_map->size-1)]; for (; he; he = he->chain) { - versionchain *n = he->value; + object_node *n = he->value; if (n && n->data->obj->id == id) { MT_lock_unset(&os->ht_lock); @@ -104,7 +104,7 @@ find_id(objectset *os, sqlid id) } MT_lock_unset(&os->ht_lock); // TODO: can we actually reach this point? - for (versionchain *n = os->id_based_h; n; n = n->next) { + for (object_node *n = os->id_based_h; n; n = n->next) { objectversion *ov = n->data; /* check if ids match */ @@ -135,17 +135,17 @@ hash_delete(sql_hash *h, void *data) } static void -node_destroy(objectset *os, versionchain *n) +node_destroy(objectset *os, object_node *n) { if (!os->sa) _DELETE(n); } -static versionchain * -os_remove_name_based_chain(objectset *os, versionchain *n) +static object_node * +os_remove_name_based_chain(objectset *os, object_node *n) { assert(n); - versionchain *p = os->name_based_h; + object_node *p = os->name_based_h; if (p != n) while (p && p->next != n) @@ -173,11 +173,11 @@ os_remove_name_based_chain(objectset *os return p; } -static versionchain * -os_remove_id_based_chain(objectset *os, versionchain *n) +static object_node * +os_remove_id_based_chain(objectset *os, object_node *n) { assert(n); - versionchain *p = os->id_based_h; + object_node *p = os->id_based_h; if (p != n) while (p && p->next != n) @@ -205,21 +205,21 @@ os_remove_id_based_chain(objectset *os, return p; } -static versionchain * +static object_node * node_create(sql_allocator *sa, objectversion *ov) { - versionchain *n = (sa)?SA_NEW(sa, versionchain):MNEW(versionchain); + object_node *n = (sa)?SA_NEW(sa, object_node):MNEW(object_node); if (n == NULL) return NULL; - *n = (versionchain) { + *n = (object_node) { .data = ov, }; return n; } static objectset * -os_append_node_name(objectset *os, versionchain *n) +os_append_node_name(objectset *os, object_node *n) { if (os->name_based_t) { os->name_based_t->next = n; @@ -248,7 +248,7 @@ os_append_node_name(objectset *os, versi static objectset * os_append_name(objectset *os, objectversion *ov) { - versionchain *n = node_create(os->sa, ov); + object_node *n = node_create(os->sa, ov); if (n == NULL) return NULL; @@ -258,7 +258,7 @@ os_append_name(objectset *os, objectvers } static objectset * -os_append_node_id(objectset *os, versionchain *n) +os_append_node_id(objectset *os, object_node *n) { if (os->id_based_t) { os->id_based_t->next = n; @@ -287,7 +287,7 @@ os_append_node_id(objectset *os, version static objectset * os_append_id(objectset *os, objectversion *ov) { - versionchain *n = node_create(os->sa, ov); + object_node *n = node_create(os->sa, ov); if (n == NULL) return NULL; @@ -295,34 +295,7 @@ os_append_id(objectset *os, objectversio return os_append_node_id(os, n); } -static versionchain* find_name(objectset *os, const char *name); - - - -static void -mark_objectversion_to_be_destroyed(sqlstore *store, objectset* os, objectversion *ov) -{ - // For the moment we (mis)use a newly allocated objectversion to represent a tombstone. - objectversion* tombstone = SA_ZNEW(os->sa, objectversion); - ov->ts = store->timestamp; - - MT_lock_set(&os->ht_lock); - if (!ov->name_based_newer) { - os_remove_name_based_chain(os, ov->name_based_chain); - } - - if (!ov->id_based_newer) { - os_remove_id_based_chain(os, ov->name_based_chain); - } - - if (os->graveyard->data) { - os->graveyard->data->id_based_newer = tombstone; - tombstone->name_based_older = os->graveyard->data; - } - - os->graveyard->data = tombstone; - MT_lock_unset(&os->ht_lock); -} +static object_node* find_name(objectset *os, const char *name); static void objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng oldest) @@ -347,14 +320,14 @@ objectversion_destroy(sqlstore *store, o objectset* os = ov->name_based_chain->os; if (!name_based_newer) { - versionchain *on = NULL; + object_node *on = NULL; if (os->unique) on = find_name(os, ov->obj->name); else on = find_id(os, ov->obj->id); assert(on->data == ov); if (on) - os_remove_node(os, on); + os_remove_name_based_chain(os, on); if (name_based_older) os_append_name(os, name_based_older); } @@ -365,7 +338,29 @@ objectversion_destroy(sqlstore *store, o static int rollback_objectversion(sql_store Store, objectversion *ov) { + objectset* os = ov->name_based_chain->os; assert(ov->ts > TRANSACTION_ID_BASE); + + if (ov->name_based_older && ov->name_based_older->ts < TRANSACTION_ID_BASE) { + // ov has a committed parent. + assert(!ov->id_based_older || ov->name_based_older == ov->id_based_older); + + // TODO: ATOMIC OP + ov->name_based_older->name_based_older = NULL; + } + + if (ov->name_based_older == NULL) { + os_remove_name_based_chain(os, ov->name_based_chain); + } + + if (ov->id_based_older == NULL) { + os_remove_id_based_chain(os, ov->name_based_chain); + } + + os->destroy(Store, ov->obj); + // destroy objectversion ov. + + return LOG_OK; } static int @@ -377,9 +372,9 @@ tc_gc_objectversion(sql_store Store, sql rollback_objectversion(Store, ov); } - if (ov->deleted || !commit_ts) { + if (ov->deleted) { /* TODO handle savepoints */ - if (ov->ts < oldest || (ov->ts == commit_ts && commit_ts == oldest) || !commit_ts) { + if (ov->ts < oldest || (ov->ts == commit_ts && commit_ts == oldest)) { int ok = LOG_OK; objectversion_destroy(Store, ov, commit_ts, oldest); if (ok == LOG_OK) @@ -415,7 +410,7 @@ os_new(sql_allocator *sa, destroy_fptr d os->destroy = destroy; MT_lock_init(&os->ht_lock, "sa_ht_lock"); - os->graveyard = SA_ZNEW(sa, versionchain); + os->graveyard = SA_ZNEW(sa, object_node); return os; } @@ -434,17 +429,17 @@ os_destroy(objectset *os, sql_store stor if (--os->refcnt > 0) return; if (os->destroy) { - for(versionchain *n=os->name_based_h; n; n=n->next) { + for(object_node *n=os->name_based_h; n; n=n->next) { os->destroy(n->data, store); } } - versionchain *n = os->name_based_h; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list