Changeset: 56f9405a2eee for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=56f9405a2eee
Modified Files:
sql/include/sql_catalog.h
sql/storage/objectset.c
Branch: nospare
Log Message:
Backed out changeset a20703c5fa2d
diffs (truncated from 799 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 versionchain;
+struct object_node;
struct os_iter {
struct objectset *os;
struct sql_trans *tr;
- struct versionchain *n;
+ struct object_node *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,39 +18,32 @@
* keep hash/map of names -> objectversion
*/
-struct versionchain;// TODO: rename to object_version_chain
+struct object_node;
typedef struct objectversion {
bool deleted;
ulng ts;
sql_base *obj;
- 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;
+ struct objectversion *older;
+ struct objectversion *newer;
+ struct object_node *on;
} 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;
- int name_based_cnt;
- int id_based_cnt;
+ object_node *h;
+ object_node *t;
+ int cnt;
struct sql_hash *name_map;
struct sql_hash *id_map;
bool temporary;
@@ -58,25 +51,25 @@ 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) {
MT_lock_set(&os->ht_lock);
- if ((!os->id_map || os->id_map->size*16 < os->id_based_cnt) &&
os->id_based_cnt > HASH_MIN_SIZE && os->sa) {
+ 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->id_based_cnt,
(fkeyvalue)&os_id_key);
+ 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 (versionchain *n = os->id_based_h; n; n = n->next )
{
+ 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) {
@@ -90,7 +83,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);
@@ -102,7 +95,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->h; n; n = n->next) {
objectversion *ov = n->data;
/* check if ids match */
@@ -133,7 +126,7 @@ hash_delete(sql_hash *h, void *data)
}
static void
-node_destroy(objectset *os, versionchain *n)
+node_destroy(objectset *os, object_node *n)
{
if (n->data && os->destroy) {
os->destroy(n->data, NULL);
@@ -143,28 +136,28 @@ node_destroy(objectset *os, versionchain
_DELETE(n);
}
-static versionchain *
-os_remove_node(objectset *os, versionchain *n)
+static object_node *
+os_remove_node(objectset *os, object_node *n)
{
assert(n);
- versionchain *p = os->name_based_h;
+ object_node *p = os->h;
if (p != n)
while (p && p->next != n)
p = p->next;
assert(p==n||(p && p->next == n));
if (p == n) {
- os->name_based_h = n->next;
- if (os->name_based_h) // i.e. non-empty os
- os->name_based_h->prev = NULL;
+ os->h = n->next;
+ if (os->h) // i.e. non-empty os
+ os->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->name_based_t)
- os->name_based_t = p;
+ if (n == os->t)
+ os->t = p;
MT_lock_set(&os->ht_lock);
if (os->id_map && n)
@@ -173,34 +166,39 @@ os_remove_node(objectset *os, versioncha
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 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,
};
+ ov->on = n;
return n;
}
static objectset *
-os_append_node_name(objectset *os, versionchain *n)
+os_append_node(objectset *os, object_node *n)
{
- if (os->name_based_t) {
- os->name_based_t->next = n;
+ if (os->cnt) {
+ os->t->next = n;
} else {
- os->name_based_h = n;
+ os->h = n;
}
n->os = os;
- n->prev = os->name_based_t; // aka the double linked list.
- os->name_based_t = n;
+ n->prev = os->t; // aka the double linked list.
+ os->t = n;
+ os->cnt++;
if (n->data) {
MT_lock_set(&os->ht_lock);
if (os->name_map) {
@@ -211,37 +209,6 @@ os_append_node_name(objectset *os, versi
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);
@@ -252,47 +219,43 @@ os_append_node_id(objectset *os, version
}
MT_lock_unset(&os->ht_lock);
}
- os->id_based_cnt++;
return os;
}
static objectset *
-os_append_id(objectset *os, objectversion *ov)
+os_append(objectset *os, objectversion *ov)
{
- versionchain *n = node_create(os->sa, ov);
+ object_node *n = node_create(os->sa, ov);
if (n == NULL)
return NULL;
- ov->id_based_chain = n;
- return os_append_node_id(os, n);
+ return os_append_node(os, n);
}
-static versionchain* find_name(objectset *os, const char *name);
+static object_node* find_name(objectset *os, const char *name);
static void
objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng
oldest)
{
- // 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;
+ objectversion *older = ov->older;
+ objectversion *newer = ov->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;
+ if (older && commit_ts) {
+ objectversion_destroy(store, older, commit_ts, oldest);
+ older = NULL;
+ } else if (older) {
+ older->newer = newer;
}
- ov->name_based_older = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list