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]

Reply via email to