Changeset: 70ff34dcd93c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70ff34dcd93c Modified Files: sql/storage/bat/bat_storage.c Branch: default Log Message:
small cleanup and initial atomics diffs (282 lines): diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -11,6 +11,8 @@ #include "bat_utils.h" #include "sql_string.h" #include "gdk_atoms.h" +#include "gdk_atoms.h" +#include "matomic.h" /* * The sql data is stored using 2 structure @@ -96,17 +98,6 @@ temp_delta(sql_delta *d, ulng tid) return d; } -static sql_delta * -get_delta(sql_delta *d, ulng tid, int type, int is_temp) -{ - if (is_temp) { - d = temp_delta(d, tid); - if (!d) - return temp_dup_delta(tid, type); - } - return d; -} - static sql_dbat * temp_dup_dbat(ulng tid) { @@ -129,85 +120,87 @@ temp_dbat(sql_dbat *d, ulng tid) return d; } -static sql_dbat * -get_dbat(sql_dbat *d, ulng tid, int is_temp) +static sql_delta * +timestamp_delta( sql_trans *tr, sql_delta *d) { - if (is_temp) { - d = temp_dbat(d, tid); - if (!d) - return temp_dup_dbat(tid); - } + while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) + d = d->next; return d; } static sql_delta * -timestamp_delta( sql_trans *tr, sql_delta *d, int type, int is_temp) +temp_col_timestamp_delta( sql_trans *tr, sql_column *c) { - assert(!is_temp); - if (is_temp) - return get_delta(d, tr->tid, type, is_temp); - while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) - d = d->next; + assert(isTempTable(c->t)); + sql_delta *d = temp_delta(c->data, tr->tid); + if (!d) { + d = temp_dup_delta(tr->tid, c->type.type->localtype); + do { + d->next = c->data; + } while(!ATOMIC_PTR_CAS(&c->data, &d->next, d)); /* set c->data = d, when c->data == d->next else d->next = c->data */ + } return d; } sql_delta * col_timestamp_delta( sql_trans *tr, sql_column *c) { - int is_temp = isTempTable(c->t); - if (is_temp) { - sql_delta *d = temp_delta(c->data, tr->tid); - if (!d) { - d = temp_dup_delta(tr->tid, c->type.type->localtype); - d->next = c->data; - c->data = d; - } - return d; + if (isTempTable(c->t)) + return temp_col_timestamp_delta(tr, c); + return timestamp_delta( tr, c->data); +} + +static sql_delta * +temp_idx_timestamp_delta( sql_trans *tr, sql_idx *i) +{ + assert(isTempTable(i->t)); + sql_delta *d = temp_delta(i->data, tr->tid); + if (!d) { + int type = oid_index(i->type)?TYPE_oid:TYPE_lng; + d = temp_dup_delta(tr->tid, type); + do { + d->next = i->data; + } while(!ATOMIC_PTR_CAS(&i->data, &d->next, d)); /* set i->data = d, when i->data == d->next else d->next = i->data */ } - return timestamp_delta( tr, c->data, c->type.type->localtype, is_temp); + return d; } static sql_delta * idx_timestamp_delta( sql_trans *tr, sql_idx *i) { - int type = oid_index(i->type)?TYPE_oid:TYPE_lng; - int is_temp = isTempTable(i->t); - if (is_temp) { - sql_delta *d = temp_delta(i->data, tr->tid); - if (!d) { - d = temp_dup_delta(tr->tid, type); - d->next = i->data; - i->data = d; - } - return d; - } - return timestamp_delta( tr, i->data, type, is_temp); + if (isTempTable(i->t)) + return temp_idx_timestamp_delta(tr, i); + return timestamp_delta( tr, i->data); } static sql_dbat * -timestamp_dbat( sql_trans *tr, sql_dbat *d, int is_temp) +timestamp_dbat( sql_trans *tr, sql_dbat *d) { - if (is_temp) - return get_dbat(d, tr->tid, is_temp); while (d->next && d->ts != tr->tid && (!tr->parent || !tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts) d = d->next; return d; } static sql_dbat * +temp_tab_timestamp_dbat( sql_trans *tr, sql_table *t) +{ + assert(isTempTable(t)); + sql_dbat *d = temp_dbat(t->data, tr->tid); + if (!d) { + d = temp_dup_dbat(tr->tid); + do { + d->next = t->data; + } while(!ATOMIC_PTR_CAS(&t->data, &d->next, d)); /* set t->data = d, when t->data == d->next else d->next = t->data */ + } + return d; +} + +static sql_dbat * tab_timestamp_dbat( sql_trans *tr, sql_table *t) { - int is_temp = isTempTable(t); - if (is_temp) { - sql_dbat *d = temp_dbat(t->data, tr->tid); - if (!d) { - d = temp_dup_dbat(tr->tid); - d->next = t->data; - t->data = d; - } - return d; - } - return timestamp_dbat( tr, t->data, is_temp); + if (isTempTable(t)) + return temp_tab_timestamp_dbat(tr, t); + return timestamp_dbat( tr, t->data); } static sql_delta* @@ -751,28 +744,28 @@ dup_bat(sql_trans *tr, sql_table *t, sql static sql_delta * bind_col_data(sql_trans *tr, sql_column *c) { - int type = c->type.type->localtype; - sql_delta *obat = get_delta(c->data, tr->tid, type, isTempTable(c->t)); + sql_delta *obat = c->data; - if (obat && obat != c->data) { - obat->next = c->data; - c->data = obat; - } + if (isTempTable(c->t)) + obat = temp_col_timestamp_delta(tr, c); + if (obat->ts == tr->tid) return obat; if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >= TRANSACTION_ID_BASE && !isTempTable(c->t)) /* abort */ return NULL; - obat = timestamp_delta(tr, c->data, type, isTempTable(c->t)); + assert(!isTempTable(c->t)); + obat = timestamp_delta(tr, c->data); sql_delta* bat = ZNEW(sql_delta); if(!bat) return NULL; bat->refcnt = 1; - if(dup_bat(tr, c->t, obat, bat, type, isNew(c)) == LOG_ERR) + if(dup_bat(tr, c->t, obat, bat, c->type.type->localtype, isNew(c)) == LOG_ERR) return NULL; bat->ts = tr->tid; - bat->next = obat; - c->data = bat; + do { + bat->next = obat; + } while(!ATOMIC_PTR_CAS(&c->data, &bat->next, bat)); return bat; } @@ -821,29 +814,28 @@ update_col(sql_trans *tr, sql_column *c, static sql_delta * bind_idx_data(sql_trans *tr, sql_idx *i) { - int type = (oid_index(i->type))?TYPE_oid:TYPE_lng; - sql_delta *obat = get_delta(i->data, tr->tid, type, isTempTable(i->t)); + sql_delta *obat = i->data; - if (obat && obat != i->data) { - obat->next = i->data; - i->data = obat; - } + if (isTempTable(i->t)) + obat = temp_idx_timestamp_delta(tr, i); + if (obat->ts == tr->tid) return obat; if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >= TRANSACTION_ID_BASE && !isTempTable(i->t)) /* abort */ return NULL; - - obat = timestamp_delta(tr, i->data, type, isTempTable(i->t)); + assert(!isTempTable(i->t)); + obat = timestamp_delta(tr, i->data); sql_delta* bat = ZNEW(sql_delta); if(!bat) return NULL; bat->refcnt = 1; - if(dup_bat(tr, i->t, obat, bat, type, isNew(i)) == LOG_ERR) + if(dup_bat(tr, i->t, obat, bat, (oid_index(i->type))?TYPE_oid:TYPE_lng, isNew(i)) == LOG_ERR) return NULL; bat->ts = tr->tid; - bat->next = obat; - i->data = bat; + do { + bat->next = obat; + } while(!ATOMIC_PTR_CAS(&i->data, &bat->next, bat)); return bat; } @@ -1152,27 +1144,27 @@ destroy_dbat(sql_dbat *bat) static sql_dbat * bind_del_data(sql_trans *tr, sql_table *t) { - sql_dbat *obat = get_dbat(t->data, tr->tid, isTempTable(t)); + sql_dbat *obat = t->data; - if (obat && obat != t->data) { - obat->next = t->data; - t->data = obat; - } + if (isTempTable(t)) + obat = temp_tab_timestamp_dbat(tr, t); if (obat->ts == tr->tid) return obat; if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >= TRANSACTION_ID_BASE && !isTempTable(t)) /* abort */ return NULL; - obat = timestamp_dbat(tr, t->data, isTempTable(t)); + assert(!isTempTable(t)); + obat = timestamp_dbat(tr, t->data); sql_dbat *bat = ZNEW(sql_dbat); if(!bat) return NULL; bat->refcnt = 1; dup_dbat(tr, obat, bat, isNew(t), isTempTable(t)); bat->ts = tr->tid; - bat->next = obat; - t->data = bat; + do { + bat->next = obat; + } while(!ATOMIC_PTR_CAS(&t->data, &bat->next, bat)); return bat; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list