Changeset: 1b15632d22ae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b15632d22ae
Modified Files:
sql/storage/objectset.c
Branch: nospare-aris
Log Message:
Commit ungoing work.
diffs (211 lines):
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -23,6 +23,7 @@ struct versionchain;// TODO: rename to o
typedef struct objectversion {
bool deleted;
ulng ts;
+ ulng tombstone; // ts of latest active transaction at the time of
funeral
sql_base *obj;
struct objectversion *name_based_older;
struct objectversion *name_based_newer;
@@ -49,6 +50,7 @@ typedef struct objectset {
versionchain *name_based_t;
versionchain *id_based_h;
versionchain *id_based_t;
+ versionchain * graveyard;
int name_based_cnt;
int id_based_cnt;
struct sql_hash *name_map;
@@ -135,16 +137,12 @@ hash_delete(sql_hash *h, void *data)
static void
node_destroy(objectset *os, versionchain *n)
{
- if (n->data && os->destroy) {
- os->destroy(n->data, NULL);
- n->data = NULL;
- }
if (!os->sa)
_DELETE(n);
}
static versionchain *
-os_remove_node(objectset *os, versionchain *n)
+os_remove_name_based_chain(objectset *os, versionchain *n)
{
assert(n);
versionchain *p = os->name_based_h;
@@ -167,10 +165,40 @@ os_remove_node(objectset *os, versioncha
os->name_based_t = p;
MT_lock_set(&os->ht_lock);
+ if (os->name_map && n)
+ hash_delete(os->name_map, n);
+ MT_lock_unset(&os->ht_lock);
+
+ node_destroy(os, n);
+ return p;
+}
+
+static versionchain *
+os_remove_id_based_chain(objectset *os, versionchain *n)
+{
+ assert(n);
+ versionchain *p = os->id_based_h;
+
+ if (p != n)
+ while (p && p->next != n)
+ p = p->next;
+ assert(p==n||(p && p->next == n));
+ if (p == n) {
+ os->id_based_h = n->next;
+ if (os->id_based_h) // i.e. non-empty os
+ os->id_based_h->prev = NULL;
+ p = NULL;
+ } else if ( p != NULL) {
+ p->next = n->next;
+ if (p->next) // node in the middle
+ p->next->prev = p;
+ }
+ if (n == os->id_based_t)
+ os->id_based_t = p;
+
+ MT_lock_set(&os->ht_lock);
if (os->id_map && n)
hash_delete(os->id_map, n);
- if (os->name_map && n)
- hash_delete(os->name_map, n);
MT_lock_unset(&os->ht_lock);
node_destroy(os, n);
@@ -269,6 +297,33 @@ os_append_id(objectset *os, objectversio
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 void
objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng
oldest)
{
@@ -350,6 +405,9 @@ 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);
+
return os;
}
@@ -360,7 +418,7 @@ os_dup(objectset *os)
return os;
}
-// TODO: Look into cohesion between os_destroy, os->destroy and and
node_destroy
+// TODO: Look into cohesion between os_destroy, os->destroy and node_destroy
void
os_destroy(objectset *os, sql_store store)
{
@@ -390,6 +448,14 @@ os_destroy(objectset *os, sql_store stor
if (os->id_map && !os->id_map->sa)
hash_destroy(os->id_map);
+ for (objectversion* tb = os->graveyard->data; tb; tb->name_based_newer)
{
+ objectversion* ov = tb;
+ tb = ov->name_based_newer;
+ // TODO destroy ov cascading allong side id direction.
+ }
+
+ node_destroy(os, os->graveyard);
+
if (!os->sa)
_DELETE(os);
}
@@ -602,6 +668,34 @@ os_add_id_based(objectset *os, struct sq
}
}
+static void
+os_clean_up(objectset *os, objectversion *ov)
+{
+ MT_lock_set(&os->ht_lock);
+ if (ov->id_based_older) {
+ ov->id_based_chain->data = ov->id_based_older;
+ ov->id_based_older->id_based_newer = NULL;
+ }
+ else {
+ if (ov->id_based_chain) {
+ // This was a newly created node, but due to
concurrency issues, it has to be destroyed again.
+ _DELETE(ov->id_based_chain);
+ }
+ }
+
+
+ if (ov->name_based_older) {
+ ov->name_based_chain->data = ov->name_based_older;
+ ov->name_based_older->name_based_newer = NULL;
+ }
+ else {
+ if (ov->name_based_chain) {
+ // This was a newly created node, but due to
concurrency issues, it has to be destroyed again.
+ _DELETE(ov->name_based_chain);
+ }
+ }
+}
+
int /*ok, error (name existed) and conflict (added before) */
os_add(objectset *os, struct sql_trans *tr, const char *name, sql_base *b)
{
@@ -611,13 +705,11 @@ os_add(objectset *os, struct sql_trans *
if (os_add_id_based(os, tr, b->id, ov)) {
// TODO clean up ov
- assert(0);
return -1;
}
if (os_add_name_based(os, tr, name, ov)) {
// TODO clean up ov
- assert(0);
return -1;
}
@@ -696,13 +788,11 @@ os_del(objectset *os, struct sql_trans *
if (os_del_id_based(os, tr, b->id, ov)) {
// TODO clean up ov
- assert(0);
return -1;
}
if (os_del_name_based(os, tr, name, ov)) {
// TODO clean up ov
- assert(0);
return -1;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list