Changeset: b0a5e4e46c57 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b0a5e4e46c57
Branch: manti
Log Message:
merged from default
diffs (truncated from 526 to 300 lines):
diff --git a/monetdb5/modules/mal/pp_algebra.c
b/monetdb5/modules/mal/pp_algebra.c
--- a/monetdb5/modules/mal/pp_algebra.c
+++ b/monetdb5/modules/mal/pp_algebra.c
@@ -1619,7 +1619,8 @@ LALGgroup(Client ctx, bat *rid, bat *uid
MT_lock_set(&b->theaplock);
if ((ATOMvarsized(u->ttype) && !VIEWvtparent(b)) ||
(ATOMvarsized(u->ttype) && BATcount(b) && u->tvheap->parentid !=
u->batCacheid && u->tvheap->parentid != b->tvheap->parentid) ||
- (ATOMvarsized(u->ttype) && u->twidth != b->twidth)) {
+ (ATOMvarsized(u->ttype) && u->twidth != b->twidth) ||
+ (ATOMvarsized(u->ttype) && BATcount(b) && BATcount(u) == 0 &&
u->tvheap->parentid == u->batCacheid && BBPquickdesc(VIEWvtparent(b))->batRole
!= PERSISTENT)) {
local_storage = true;
MT_lock_unset(&b->theaplock);
MT_lock_unset(&u->theaplock);
@@ -1906,7 +1907,8 @@ LALGderive(Client ctx, bat *rid, bat *ui
MT_lock_set(&b->theaplock);
if ((ATOMvarsized(u->ttype) && !VIEWvtparent(b)) ||
(ATOMvarsized(u->ttype) && BATcount(b) && u->tvheap->parentid !=
u->batCacheid && u->tvheap->parentid != b->tvheap->parentid) ||
- (ATOMvarsized(u->ttype) && u->twidth != b->twidth)) {
+ (ATOMvarsized(u->ttype) && u->twidth != b->twidth) ||
+ (ATOMvarsized(u->ttype) && BATcount(b) && BATcount(u) == 0 &&
u->tvheap->parentid == u->batCacheid && BBPquickdesc(VIEWvtparent(b))->batRole
!= PERSISTENT)) {
local_storage = true;
MT_lock_unset(&b->theaplock);
MT_lock_unset(&u->theaplock);
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
@@ -232,6 +232,7 @@ split_segment(segments *segs, segment *o
{
assert(tr);
if (o->start == start && o->end == start+cnt) {
+ assert(deleted);
assert(o->deleted != deleted || o->ts < TRANSACTION_ID_BASE);
o->oldts = o->ts;
o->ts = tr->tid;
@@ -454,11 +455,11 @@ segments2cs(sql_trans *tr, segments *seg
return LOG_OK;
}
-/* TODO return LOG_OK/ERR */
static void
merge_segments(storage *s, sql_trans *tr, sql_change *change, ulng commit_ts,
ulng oldest)
{
- sqlstore* store = tr->store;
+ if (commit_ts == oldest && !tr->parent) /* we are the only active
transaction */
+ oldest++;
segment *cur = s->segs->h, *seg = NULL;
for (; cur; cur = ATOMIC_PTR_GET(&cur->next)) {
if (cur->ts == tr->tid) {
@@ -467,46 +468,24 @@ merge_segments(storage *s, sql_trans *tr
cur->ts = commit_ts;
cur->cnr = 0;
}
- if (!seg) {
- /* first segment */
- seg = cur;
- }
- else if (seg->ts < TRANSACTION_ID_BASE) {
- /* possible merge since both deleted flags are equal */
- if (seg->deleted == cur->deleted && cur->ts <
TRANSACTION_ID_BASE) {
- int merge = 1;
- node *n = store->active->h;
- for (int i = 0; i < store->active->cnt; i++, n
= n->next) {
- sql_trans* other =
((sql_trans*)n->data);
- ulng active = other->ts;
- if(other->active == 2)
- continue; /* pretend that
another recently committed transaction is no longer active */
- if (active == tr->ts)
- continue; /* pretend that
committing transaction has already committed and is no longer active */
- if (seg->ts < active && cur->ts <
active)
- break;
- if (seg->ts > active && cur->ts >
active)
- continue;
-
- assert((active > seg->ts && active <
cur->ts) || (active < seg->ts && active > cur->ts));
- /* cannot safely merge since there is
an active transaction between the segments */
- merge = false;
- break;
- }
- /* merge segments */
- if (merge) {
- seg->end = cur->end;
- ATOMIC_PTR_SET(&seg->next,
ATOMIC_PTR_GET(&cur->next));
- if (cur == s->segs->t)
- s->segs->t = seg;
- if (commit_ts == oldest) {
- _DELETE(cur);
- } else
- mark4destroy(cur, change,
commit_ts);
- cur = seg;
- continue;
- }
- }
+ /* possible merge since both deleted flags are equal */
+ if (seg && seg->deleted == cur->deleted &&
+ ((seg->ts < oldest && cur->ts < oldest) ||
+ (seg->ts == cur->ts && cur->ts == tr->tid) ||
+ (seg->ts == cur->ts && cur->ts == tr->ts) ||
+ (seg->ts == cur->ts && cur->ts == commit_ts))) {
+ /* merge segments */
+ seg->end = cur->end;
+ ATOMIC_PTR_SET(&seg->next, ATOMIC_PTR_GET(&cur->next));
+ if (cur == s->segs->t)
+ s->segs->t = seg;
+ if (commit_ts == oldest) {
+ _DELETE(cur);
+ } else
+ mark4destroy(cur, change, commit_ts);
+ cur = seg;
+ seg = NULL;
+ continue;
}
seg = cur;
}
@@ -3024,7 +3003,6 @@ col_stats(sql_trans *tr, sql_column *c,
*unique_est = bi.unique_est;
if (*unique_est == 0)
*unique_est =
bat_guess_uniques(b, NULL, NULL);
- //printf("estimates %s %s %f\n",
c->base.name, c->type.type->base.name, *unique_est);
} else if (d->cs.st == ST_DICT && (off =
bind_col_no_view(tr, c, QUICK))) {
/* for dict, check the offsets bat for
uniqueness */
MT_lock_set(&off->theaplock);
@@ -4831,7 +4809,7 @@ claim_segmentsV2(sql_trans *tr, sql_tabl
if (ATOMIC_GET(&s->segs->deleted) != 0)
for (segment *seg = s->segs->h, *p = NULL; seg && cnt && ok == LOG_OK;
p = seg, seg = ATOMIC_PTR_GET(&seg->next)) {
if (seg->deleted && seg->ts < oldest && seg->end > seg->start)
{ /* reuse old deleted or rolled back append */
- if ((seg->end - seg->start) >= cnt) {
+ if ((seg->end - seg->start) > cnt) {
/* if previous is claimed before we could
simply adjust the end/start */
if (p && p->ts == tr->tid && p->cnr == tr->cnr
&& !p->deleted) {
slot = p->end;
@@ -4926,7 +4904,7 @@ claim_segments(sql_trans *tr, sql_table
for (segment *seg = s->segs->h, *p = NULL; seg && ok == LOG_OK; p =
seg, seg = ATOMIC_PTR_GET(&seg->next)) {
if (seg->deleted && seg->ts < oldest && (seg->end-seg->start)
>= cnt) { /* reuse old deleted or rolled back append */
- if ((seg->end - seg->start) >= cnt) {
+ if ((seg->end - seg->start) > cnt) {
/* if previous is claimed before we could
simply adjust the end/start */
if (p && p->ts == tr->tid && p->cnr == tr->cnr
&& !p->deleted) {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -63,16 +63,9 @@ store_oldest(sqlstore *store, sql_trans
{
ulng oldest = (ulng) ATOMIC_GET(&store->oldest);
- if (tr && tr->ts == oldest) {
- ulng noldest = 0;
- for (node *n = store->active->h; n; n = n->next) {
- sql_trans *otr = n->data;
- /* go over all active transactions as transaction
timestamps change in the commit */
- if (otr != tr && otr->active == 1 && (!noldest ||
otr->ts < noldest))
- noldest = otr->ts;
- }
- if (noldest)
- oldest = noldest;
+ if (tr && oldest == tr->ts && store->active->h &&
store->active->h->next) {
+ sql_trans *otr = store->active->h->next->data;
+ oldest = otr->ts;
}
return oldest;
}
@@ -2537,7 +2530,7 @@ store_manager(sqlstore *store)
MT_lock_unset(&store->flush);
store_lock(store);
if (ATOMIC_GET(&store->nr_active) == 0) {
- ulng oldest = store_timestamp(store)+1;
+ ulng oldest = store_get_timestamp(store)+1;
store_pending_changes(store, oldest, NULL);
}
store_unlock(store);
@@ -4533,8 +4526,6 @@ sql_trans_commit(sql_trans *tr)
}
n = next;
}
- tr->active = 2; /* small hack enabling to signal that this
transaction has committed */
- tr->ts = commit_ts; /* fix profiler output */
store_unlock(store);
/* flush the log structure */
if (log) {
diff --git a/sql/test/concurrent/Tests/smart-segment-merge.test
b/sql/test/concurrent/Tests/smart-segment-merge.test
--- a/sql/test/concurrent/Tests/smart-segment-merge.test
+++ b/sql/test/concurrent/Tests/smart-segment-merge.test
@@ -98,7 +98,7 @@ commit
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-4
+5
query T nosort
SELECT listagg(k) FROM test
@@ -118,7 +118,7 @@ commit
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-1
+3
query T nosort
SELECT listagg(k) FROM test
@@ -141,7 +141,7 @@ DELETE FROM Test WHERE k = 5
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-3
+4
@connection(id=2)
statement ok
@@ -170,7 +170,7 @@ DELETE FROM Test WHERE k = 6
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-3
+5
query T nosort
SELECT listagg(k) FROM test
@@ -221,7 +221,7 @@ INSERT INTO TEST VALUES (17)
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-4
+5
query T nosort
SELECT listagg(k) FROM test
@@ -240,7 +240,7 @@ commit
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-4
+5
query T nosort
SELECT listagg(k) FROM test
@@ -254,7 +254,7 @@ INSERT INTO TEST VALUES (18)
query I nosort
SELECT segments FROM sys.deltas('sys', 'test')
----
-1
+3
query T nosort
SELECT listagg(k) FROM test
diff --git a/sql/test/pg_regress/Tests/float4.test
b/sql/test/pg_regress/Tests/float4.test
--- a/sql/test/pg_regress/Tests/float4.test
+++ b/sql/test/pg_regress/Tests/float4.test
@@ -86,9 +86,9 @@ query TR rowsort
SELECT '' AS five, FLOAT4_TBL.* FROM FLOAT4_TBL
----
(empty)
--0.000
+-34.840
(empty)
--34.840
+0.000
(empty)
0.000
(empty)
@@ -104,9 +104,9 @@ query TR rowsort
SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3'
----
(empty)
--0.000
+-34.840
(empty)
--34.840
+0.000
(empty)
0.000
(empty)
@@ -126,9 +126,9 @@ query TR rowsort
SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1
----
(empty)
--0.000
+-34.840
(empty)
--34.840
+0.000
(empty)
0.000
(empty)
@@ -140,9 +140,9 @@ query TR rowsort
SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3'
----
(empty)
--0.000
+-34.840
(empty)
--34.840
+0.000
(empty)
0.000
(empty)
@@ -154,9 +154,9 @@ query TR rowsort
SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1
----
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]