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

Reply via email to