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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list