Changeset: a20703c5fa2d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a20703c5fa2d
Modified Files:
sql/include/sql_catalog.h
sql/storage/objectset.c
Branch: nospare
Log Message:
Separate objet_node into name and id based version chain types.
diffs (truncated from 798 to 300 lines):
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -223,11 +223,11 @@ typedef void *sql_store;
struct sql_trans;
struct sql_change;
struct objectset;
-struct object_node;
+struct versionchain;
struct os_iter {
struct objectset *os;
struct sql_trans *tr;
- struct object_node *n;
+ struct versionchain *n;
struct sql_hash_e *e;
const char *name;
};
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -18,32 +18,39 @@
* keep hash/map of names -> objectversion
*/
-struct object_node;
+struct versionchain;// TODO: rename to object_version_chain
typedef struct objectversion {
bool deleted;
ulng ts;
sql_base *obj;
- struct objectversion *older;
- struct objectversion *newer;
- struct object_node *on;
+ struct objectversion *name_based_older;
+ struct objectversion *name_based_newer;
+ struct versionchain *name_based_chain;
+
+ struct objectversion *id_based_older;
+ struct objectversion *id_based_newer;
+ struct versionchain *id_based_chain;
} objectversion;
-typedef struct object_node {
- struct object_node* prev;
- struct object_node* next;
+typedef struct versionchain {
+ struct versionchain* prev;
+ struct versionchain* next;
objectversion* data;
struct objectset* os;
-} object_node;
+} versionchain;
typedef struct objectset {
int refcnt;
sql_allocator *sa;
destroy_fptr destroy;
MT_Lock ht_lock; /* latch protecting ht */
- object_node *h;
- object_node *t;
- int cnt;
+ versionchain *name_based_h;
+ versionchain *name_based_t;
+ versionchain *id_based_h;
+ versionchain *id_based_t;
+ int name_based_cnt;
+ int id_based_cnt;
struct sql_hash *name_map;
struct sql_hash *id_map;
bool temporary;
@@ -51,25 +58,25 @@ typedef struct objectset {
} objectset;
static int
-os_id_key(object_node *n)
+os_id_key(versionchain *n)
{
return BATatoms[TYPE_int].atomHash(&n->data->obj->id);
}
-static object_node *
+static versionchain *
find_id(objectset *os, sqlid id)
{
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) {
+ if ((!os->id_map || os->id_map->size*16 < os->id_based_cnt) &&
os->id_based_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);
+ os->id_map = hash_new(os->sa, os->id_based_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 ) {
+ for (versionchain *n = os->id_based_h; n; n = n->next )
{
int key = os_id_key(n);
if (hash_add(os->id_map, key, n) == NULL) {
@@ -83,7 +90,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) {
- object_node *n = he->value;
+ versionchain *n = he->value;
if (n && n->data->obj->id == id) {
MT_lock_unset(&os->ht_lock);
@@ -95,7 +102,7 @@ find_id(objectset *os, sqlid id)
}
MT_lock_unset(&os->ht_lock);
// TODO: can we actually reach this point?
- for (object_node *n = os->h; n; n = n->next) {
+ for (versionchain *n = os->id_based_h; n; n = n->next) {
objectversion *ov = n->data;
/* check if ids match */
@@ -126,7 +133,7 @@ hash_delete(sql_hash *h, void *data)
}
static void
-node_destroy(objectset *os, object_node *n)
+node_destroy(objectset *os, versionchain *n)
{
if (n->data && os->destroy) {
os->destroy(n->data, NULL);
@@ -136,28 +143,28 @@ node_destroy(objectset *os, object_node
_DELETE(n);
}
-static object_node *
-os_remove_node(objectset *os, object_node *n)
+static versionchain *
+os_remove_node(objectset *os, versionchain *n)
{
assert(n);
- object_node *p = os->h;
+ versionchain *p = os->name_based_h;
if (p != n)
while (p && p->next != n)
p = p->next;
assert(p==n||(p && p->next == n));
if (p == n) {
- os->h = n->next;
- if (os->h) // i.e. non-empty os
- os->h->prev = NULL;
+ os->name_based_h = n->next;
+ if (os->name_based_h) // i.e. non-empty os
+ os->name_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->t)
- os->t = p;
+ if (n == os->name_based_t)
+ os->name_based_t = p;
MT_lock_set(&os->ht_lock);
if (os->id_map && n)
@@ -166,39 +173,34 @@ os_remove_node(objectset *os, object_nod
hash_delete(os->name_map, n);
MT_lock_unset(&os->ht_lock);
- os->cnt--;
- assert(os->cnt > 0 || os->h == NULL);
-
node_destroy(os, n);
return p;
}
-static object_node *
+static versionchain *
node_create(sql_allocator *sa, objectversion *ov)
{
- object_node *n = (sa)?SA_NEW(sa, object_node):MNEW(object_node);
+ versionchain *n = (sa)?SA_NEW(sa, versionchain):MNEW(versionchain);
if (n == NULL)
return NULL;
- *n = (object_node) {
+ *n = (versionchain) {
.data = ov,
};
- ov->on = n;
return n;
}
static objectset *
-os_append_node(objectset *os, object_node *n)
+os_append_node_name(objectset *os, versionchain *n)
{
- if (os->cnt) {
- os->t->next = n;
+ if (os->name_based_t) {
+ os->name_based_t->next = n;
} else {
- os->h = n;
+ os->name_based_h = n;
}
n->os = os;
- n->prev = os->t; // aka the double linked list.
- os->t = n;
- os->cnt++;
+ n->prev = os->name_based_t; // aka the double linked list.
+ os->name_based_t = n;
if (n->data) {
MT_lock_set(&os->ht_lock);
if (os->name_map) {
@@ -209,6 +211,37 @@ os_append_node(objectset *os, object_nod
return NULL;
}
}
+ MT_lock_unset(&os->ht_lock);
+ }
+ os->name_based_cnt++;
+ return os;
+}
+
+static objectset *
+os_append_name(objectset *os, objectversion *ov)
+{
+ versionchain *n = node_create(os->sa, ov);
+
+ if (n == NULL)
+ return NULL;
+
+ ov->name_based_chain = n;
+ return os_append_node_name(os, n);
+}
+
+static objectset *
+os_append_node_id(objectset *os, versionchain *n)
+{
+ if (os->id_based_t) {
+ os->id_based_t->next = n;
+ } else {
+ os->id_based_h = n;
+ }
+ n->os = os;
+ n->prev = os->id_based_t; // aka the double linked list.
+ os->id_based_t = n;
+ if (n->data) {
+ MT_lock_set(&os->ht_lock);
if (os->id_map) {
int key = os->id_map->key(n);
@@ -219,43 +252,47 @@ os_append_node(objectset *os, object_nod
}
MT_lock_unset(&os->ht_lock);
}
+ os->id_based_cnt++;
return os;
}
static objectset *
-os_append(objectset *os, objectversion *ov)
+os_append_id(objectset *os, objectversion *ov)
{
- object_node *n = node_create(os->sa, ov);
+ versionchain *n = node_create(os->sa, ov);
if (n == NULL)
return NULL;
- return os_append_node(os, n);
+ ov->id_based_chain = n;
+ return os_append_node_id(os, n);
}
-static object_node* find_name(objectset *os, const char *name);
+static versionchain* find_name(objectset *os, const char *name);
static void
objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng
oldest)
{
- objectversion *older = ov->older;
- objectversion *newer = ov->newer;
+ // TODO: clean this up once the add and del functions are working
+ // TODO: handle name_based_cnt s and id_based_cnt s
+ objectversion *name_based_older = ov->name_based_older;
+ objectversion *name_based_newer = ov->name_based_newer;
- if (older && commit_ts) {
- objectversion_destroy(store, older, commit_ts, oldest);
- older = NULL;
- } else if (older) {
- older->newer = newer;
+ if (name_based_older && commit_ts) {
+ objectversion_destroy(store, name_based_older, commit_ts,
oldest);
+ name_based_older = NULL;
+ } else if (name_based_older) {
+ name_based_older->name_based_newer = name_based_newer;
}
- ov->older = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list