Changeset: 7be417d31f51 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7be417d31f51
Modified Files:
        sql/storage/objectset.c
Branch: nospare-aris
Log Message:

Ungoing work.


diffs (279 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -56,36 +56,32 @@ os_id_key(object_node *n)
        return BATatoms[TYPE_int].atomHash(&n->data->obj->id);
 }
 
-static object_node *
-find_id(objectset *os, sqlid id)
+typedef struct id_map_node {
+       objectversion* ov;
+       struct id_map_node* next;
+} id_map_node;
+
+static objectversion *
+find_id(objectset *os, ulng tid, ulng ts, sqlid id)
 {
+       (void) tid;
+       (void) ts;
+       (void) id;
+       (void) os;
+       // TODO
        if (os) {
                MT_lock_set(&os->ht_lock);
                if ((!os->id_map || os->id_map->size*16 < os->cnt) && os->cnt > 
HASH_MIN_SIZE && os->sa) {
-                       // TODO: This leaks the old map
-                       os->id_map = hash_new(os->sa, os->cnt, 
(fkeyvalue)&os_id_key);
-                       if (os->id_map == NULL) {
-                               MT_lock_unset(&os->ht_lock);
-                               return NULL;
-                       }
-
-                       for (object_node *n = os->h; n; n = n->next ) {
-                               int key = os_id_key(n);
-
-                               if (hash_add(os->id_map, key, n) == NULL) {
-                                       MT_lock_unset(&os->ht_lock);
-                                       return NULL;
-                               }
-                       }
+                       // TODO: recreate id_map
                }
                if (os->id_map) {
                        int key = BATatoms[TYPE_int].atomHash(&id);
                        sql_hash_e *he = 
os->id_map->buckets[key&(os->id_map->size-1)];
 
                        for (; he; he = he->chain) {
-                               object_node *n = he->value;
+                               id_map_node *n = he->value;
 
-                               if (n && n->data->obj->id == id) {
+                               if (n && n->ov->obj->id == id) {
                                        MT_lock_unset(&os->ht_lock);
                                        return n;
                                }
@@ -232,7 +228,8 @@ os_append(objectset *os, objectversion *
        return os_append_node(os, n);
 }
 
-static object_node* find_name(objectset *os, const char *name);
+static objectversion* find_name(objectset *os, ulng tid, ulng ts, const char 
*name);
+
 
 static void
 objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng 
oldest)
@@ -255,13 +252,9 @@ objectversion_destroy(sqlstore *store, o
 
        objectset* os = ov->on->os;
        if (!newer) {
-               object_node *on = NULL;
-               if (os->unique)
-                       on = find_name(os, ov->obj->name);
-               else
-                       on = find_id(os, ov->obj->id);
+               object_node *on = ov->on;               
                assert(on->data == ov);
-               if (on)
+               if (on) //TODO: why check this given the above assert.
                        os_remove_node(os, on);
                if (older)
                        os_append(os, older);
@@ -395,7 +388,7 @@ find_hash_entry(sql_hash *map, const cha
 }
 
 static object_node *
-find_name(objectset *os, const char *name)
+find_data_object(objectset *os, const char *name)
 {
        if (os) {
                MT_lock_set(&os->ht_lock);
@@ -446,10 +439,10 @@ find_name(objectset *os, const char *nam
 }
 
 static objectversion*
-get_valid_object(sql_trans *tr, objectversion *ov)
+get_valid_object(ulng tid, ulng ts, objectversion *ov)
 {
        while(ov) {
-               if (ov->ts == tr->tid || ov->ts < tr->ts)
+               if (ov->ts == tid || ov->ts < ts)
                        return ov;
                else
                        ov = ov->older;
@@ -457,6 +450,16 @@ get_valid_object(sql_trans *tr, objectve
        return ov;
 }
 
+static objectversion*
+find_name(objectset *os, ulng tid, ulng ts, const char *name) {
+       object_node* n = find_data_object(os, name);
+
+       if (n)
+               return get_valid_object(tid, ts, n->data);
+
+       return NULL;
+}
+
 #if 0
 static void
 os_update_hash(objectset *os, object_node *n, /*new*/ objectversion *ov)
@@ -490,26 +493,25 @@ os_add(objectset *os, struct sql_trans *
        ov->obj = b;
        ov->older = ov->newer = NULL;
 
-       object_node *n = NULL;
+       //object_node *n = NULL;
+       objectversion *oo;
        if (os->unique)
-               n = find_name(os, name);
+               oo = find_name(os, tr->tid, tr->ts, name);
        else
-               n = find_id(os, b->id);
+               oo = find_id(os, tr->tid, tr->ts, b->id);
 
-       if (n) {
-               objectversion *co = n->data;
-               objectversion *oo = get_valid_object(tr, co);
-               ov->on = oo->on;
-               if (co != oo) { /* conflict ? */
+       if (oo) {
+               if (oo->on->data != oo) { /* conflict ? */
                        return -1;
                }
+               ov->on = oo->on;
                ov->older = oo;
 
                MT_lock_set(&os->ht_lock);
                // TODO: double check/refine locking rationale
                if (oo)
                        oo->newer = ov;
-               n->data = ov;
+               ov->on->data = ov;
                MT_lock_unset(&os->ht_lock);
                if (!os->temporary)
                        trans_add(tr, b, ov, &tc_gc_objectversion, 
&tc_commit_objectversion);
@@ -532,26 +534,24 @@ os_del(objectset *os, struct sql_trans *
        ov->obj = b;
        ov->older = ov->newer = NULL;
 
-       object_node *n = NULL;
+       objectversion *oo = NULL;
        if (os->unique)
-               n = find_name(os, name);
+               oo = find_name(os, tr->tid, tr->ts, name);
        else
-               n = find_id(os, b->id);
+               oo = find_id(os, tr->tid, tr->ts, b->id);
 
-       if (n) {
-               objectversion *co = n->data;
-               objectversion *oo = get_valid_object(tr, co);
-               ov->on = oo->on;
-               if (co != oo) { /* conflict ? */
+       if (oo) {
+               if (oo->on->data != oo) { /* conflict ? */
                        return -1;
                }
+               ov->on = oo->on;
                ov->older = oo;
 
                MT_lock_set(&os->ht_lock);
                // TODO: double check/refine locking rationale
                if (oo)
                        oo->newer = ov;
-               n->data = ov;
+               ov->on->data = ov;
                MT_lock_unset(&os->ht_lock);
                if (!os->temporary)
                        trans_add(tr, b, ov, &tc_gc_objectversion, 
&tc_commit_objectversion);
@@ -569,7 +569,7 @@ os_size(objectset *os, struct sql_trans 
        if (os) {
                for(object_node *n = os->h; n; n=n->next) {
                        objectversion *ov = n->data;
-                       if ((ov=get_valid_object(tr, ov)) && !ov->deleted)
+                       if ((ov=get_valid_object(tr->tid, tr->ts, ov)) && 
!ov->deleted)
                                cnt++;
                }
        }
@@ -585,10 +585,10 @@ os_empty(objectset *os, struct sql_trans
 int
 os_remove(objectset *os, sql_trans *tr, const char *name)
 {
-       object_node *n = find_name(os, name);
+       objectversion *ov = find_name(os, tr->tid, tr->ts, name);
 
-       if (n)
-               objectversion_destroy(tr->store, n->data, 0, 0);
+       if (ov)
+               objectversion_destroy(tr->store, ov, 0, 0);
        return LOG_OK;
 }
 
@@ -597,13 +597,11 @@ os_find_name(objectset *os, struct sql_t
 {
        if (!os)
                return NULL;
-       object_node *n = find_name(os, name);
+       objectversion *ov = find_name(os, tr->tid, tr->ts, name);
 
-       if (n) {
-                objectversion *ov = get_valid_object(tr, n->data);
-                if (ov && !ov->deleted)
-                        return ov->obj;
-       }
+       if (ov && !ov->deleted)
+               return ov->obj;
+
        return NULL;
 }
 
@@ -612,13 +610,9 @@ os_find_id(objectset *os, struct sql_tra
 {
        if (!os)
                return NULL;
-       object_node *n = find_id(os, id);
-
-       if (n) {
-                objectversion *ov = get_valid_object(tr, n->data);
-                if (ov && !ov->deleted)
+       objectversion *ov = find_id(os, tr->tid, tr->ts, id);
+       if (ov && !ov->deleted)
                         return ov->obj;
-       }
        return NULL;
 }
 
@@ -653,7 +647,7 @@ oi_next(struct os_iter *oi)
                                objectversion *ov = n->data;
                                e = oi->e = e->chain;
 
-                               ov = get_valid_object(oi->tr, ov);
+                               ov = get_valid_object(oi->tr->tid, oi->tr->ts, 
ov);
                                if (ov)
                                        b = ov->obj;
                        } else {
@@ -667,7 +661,7 @@ oi_next(struct os_iter *oi)
                        objectversion *ov = n->data;
                        n = oi->n = n->next;
 
-                       ov = get_valid_object(oi->tr, ov);
+                       ov = get_valid_object(oi->tr->tid, oi->tr->ts, ov);
                        if (ov)
                                b = ov->obj;
                }
@@ -678,12 +672,9 @@ oi_next(struct os_iter *oi)
 bool
 os_obj_intransaction(objectset *os, struct sql_trans *tr, sql_base *b)
 {
-       object_node *n = find_id(os, b->id);
-
-       if (n) {
-                objectversion *ov = get_valid_object(tr, n->data);
+       objectversion *ov = find_id(os, tr->tid, tr->ts, b->id);
                 if (ov && !ov->deleted && ov->ts == tr->tid)
                         return true;
-       }
+
        return false;
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to