Changeset: 789b96ab3237 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/789b96ab3237 Modified Files: sql/storage/bat/bat_storage.c Branch: Jul2021 Log Message:
use IS_VALID (not !IS_DELETED) for handling the candidate bits the clear_table now limits segments used both for the total count and deleted count. diffs (89 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 @@ -34,18 +34,30 @@ static int tc_gc_del( sql_store Store, s static int tr_merge_delta( sql_trans *tr, sql_delta *obat); +/* valid + * !deleted && VALID_4_READ(TS, tr) existing or newly created segment + * deleted && TS > tr->ts && OLDTS < tr->ts deleted after current transaction + */ + #define VALID_4_READ(TS,tr) \ (TS == tr->tid || (tr->parent && tr_version_of_parent(tr, TS)) || TS < tr->ts) +/* when changed, check if the old status is still valid */ +#define OLD_VALID_4_READ(TS,OLDTS,tr) \ + (OLDTS && TS != tr->tid && TS > tr->ts && OLDTS < tr->ts) + #define SEG_VALID_4_DELETE(seg,tr) \ (!seg->deleted && VALID_4_READ(seg->ts, tr)) +/* Delete (in current trans or by some other finised transaction, or re-used segment which used to be deleted */ #define SEG_IS_DELETED(seg,tr) \ - ((seg->deleted && VALID_4_READ(seg->ts, tr)) || \ - (!seg->deleted && seg->oldts && seg->ts != tr->tid && seg->ts > TRANSACTION_ID_BASE && seg->oldts < tr->ts)) - + ((seg->deleted && (VALID_4_READ(seg->ts, tr) || !OLD_VALID_4_READ(seg->ts, seg->oldts, tr))) || \ + (!seg->deleted && OLD_VALID_4_READ(seg->ts, seg->oldts, tr))) + +/* A segment is part of the current transaction is someway or is deleted by some other transaction but use to be valid */ #define SEG_IS_VALID(seg, tr) \ - (VALID_4_READ(seg->ts, tr) || (seg->deleted && seg->oldts && seg->ts > tr->ts && seg->oldts < tr->ts)) + ((!seg->deleted && VALID_4_READ(seg->ts, tr)) || \ + (seg->deleted && OLD_VALID_4_READ(seg->ts, seg->oldts, tr))) static void lock_table(sqlstore *store, sqlid id) @@ -129,7 +141,7 @@ split_segment(segments *segs, segment *o n->oldts = 0; if (o->ts == tr->tid) { - n->ts = 0; + n->ts = 1; n->deleted = true; } else { n->oldts = o->ts; @@ -499,6 +511,21 @@ count_inserts( segment *s, sql_trans *tr } static size_t +count_deletes_in_range( segment *s, sql_trans *tr, BUN start, BUN end) +{ + size_t cnt = 0; + + for(;s && s->end <= start; s = s->next) + ; + + for(;s && s->start < end; s = s->next) { + if (SEG_IS_DELETED(s, tr)) /* assume aligned s->end and end */ + cnt += s->end - s->start; + } + return cnt; +} + +static size_t count_deletes( segment *s, sql_trans *tr) { size_t cnt = 0; @@ -2322,7 +2349,9 @@ clear_table(sql_trans *tr, sql_table *t) sql_column *c = n->data; BUN sz = count_col(tr, c, 0); - sz -= count_del(tr, t, 0); + //sz -= count_del(tr, t, 0); + storage *d = tab_timestamp_storage(tr, t); + sz -= count_deletes_in_range(d->segs->h, tr, 0, sz); if ((clear_del(tr, t)) == BUN_NONE) return BUN_NONE; @@ -2988,7 +3017,7 @@ segments2cands(segment *s, sql_trans *tr continue; if (s->start >= end) break; - msk m = !(SEG_IS_DELETED(s, tr)); + msk m = (SEG_IS_VALID(s, tr)); size_t lnr = s->end-s->start; if (s->start < start) lnr -= (start - s->start); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list