Changeset: 55a55f5fc953 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/55a55f5fc953
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
gdk/gdk_logger.c
gdk/gdk_logger.h
monetdb5/optimizer/opt_emptybind.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql_statement.c
sql/backends/monet5/vaults/fits/fits.c
sql/backends/monet5/vaults/netcdf/netcdf.c
sql/backends/monet5/vaults/shp/shp.c
sql/backends/monet5/wlr.c
sql/storage/bat/bat_logger.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/sql_storage.h
sql/storage/store.c
tools/monetdbe/monetdbe.c
Branch: Jul2021
Log Message:
extended the claim and append api's too use offset BUN or offsets BAT. For
simple cases the offset is faster.
split log_tend into tend (flushing/syncing to disk unlocked) and tdone which
just marks the transaction as done in
the in memory structures of the logger.
cleanup (removed) msync calls where they became useless
small improvement of string_reader, ie use BUNappendmulti in chunks
diffs (truncated from 1174 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9208,7 +9208,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str, X_4:str):void ", "sql_analyze;", "" ]
[ "sql", "any", "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",
"SQLany_cmp;", "" ]
-[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:bat[:oid], X_5:any):int ", "mvc_append_wrap;", "" ]
+[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:oid, X_5:bat[:oid], X_6:any):int ", "mvc_append_wrap;", ""
]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord(X_0:any...):str ",
"SQLargRecord;", "" ]
[ "sql", "assert", "pattern sql.assert(X_0:bit, X_1:str):void ",
"SQLassert;", "" ]
@@ -9232,7 +9232,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", ""
]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1])
", "mvc_bind_idxbat_wrap;", "" ]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",
"mvc_bind_idxbat_wrap;", "" ]
-[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):bat[:oid] ", "mvc_claim_wrap;", "" ]
+[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ", "mvc_claim_wrap;", ""
]
[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str,
X_1:str):lng ", "mvc_clear_table_wrap;", "" ]
[ "sql", "commit", "unsafe pattern sql.commit():void ",
"SQLcommit;", "" ]
[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str,
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str,
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", ""
]
@@ -9685,7 +9685,7 @@ stdout of test 'MAL-signatures` in direc
[ "wlr", "alter_set_table", "pattern wlr.alter_set_table(X_0:str,
X_1:str, X_2:int):void ", "WLRgeneric;", "" ]
[ "wlr", "alter_table", "pattern wlr.alter_table(X_0:str, X_1:str,
X_2:int):void ", "WLRgeneric;", "" ]
[ "wlr", "alter_user", "pattern wlr.alter_user(X_0:str, X_1:str,
X_2:int, X_3:str, X_4:str):void ", "WLRgeneric;", "" ]
-[ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str,
X_3:any...):int ", "WLRappend;", "" ]
+[ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str,
X_3:oid, X_4:bat[:oid], X_5:any...):int ", "WLRappend;", "" ]
[ "wlr", "catalog", "pattern wlr.catalog(X_0:str):void ",
"WLRcatalog;", "" ]
[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str):int
", "WLRclear_table;", "" ]
[ "wlr", "comment_on", "pattern wlr.comment_on(X_0:int, X_1:str):void
", "WLRgeneric;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12509,7 +12509,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str, X_4:str):void ", "sql_analyze;", "" ]
[ "sql", "any", "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",
"SQLany_cmp;", "" ]
-[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:bat[:oid], X_5:any):int ", "mvc_append_wrap;", "" ]
+[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:oid, X_5:bat[:oid], X_6:any):int ", "mvc_append_wrap;", ""
]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord(X_0:any...):str ",
"SQLargRecord;", "" ]
[ "sql", "assert", "pattern sql.assert(X_0:bit, X_1:str):void ",
"SQLassert;", "" ]
@@ -12535,7 +12535,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", ""
]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1])
", "mvc_bind_idxbat_wrap;", "" ]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",
"mvc_bind_idxbat_wrap;", "" ]
-[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):bat[:oid] ", "mvc_claim_wrap;", "" ]
+[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ", "mvc_claim_wrap;", ""
]
[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str,
X_1:str):lng ", "mvc_clear_table_wrap;", "" ]
[ "sql", "commit", "unsafe pattern sql.commit():void ",
"SQLcommit;", "" ]
[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str,
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str,
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", ""
]
@@ -13008,7 +13008,7 @@ stdout of test 'MAL-signatures` in direc
[ "wlr", "alter_set_table", "pattern wlr.alter_set_table(X_0:str,
X_1:str, X_2:int):void ", "WLRgeneric;", "" ]
[ "wlr", "alter_table", "pattern wlr.alter_table(X_0:str, X_1:str,
X_2:int):void ", "WLRgeneric;", "" ]
[ "wlr", "alter_user", "pattern wlr.alter_user(X_0:str, X_1:str,
X_2:int, X_3:str, X_4:str):void ", "WLRgeneric;", "" ]
-[ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str,
X_3:any...):int ", "WLRappend;", "" ]
+[ "wlr", "append", "pattern wlr.append(X_0:str, X_1:str, X_2:str,
X_3:oid, X_4:bat[:oid], X_5:any...):int ", "WLRappend;", "" ]
[ "wlr", "catalog", "pattern wlr.catalog(X_0:str):void ",
"WLRcatalog;", "" ]
[ "wlr", "clear_table", "pattern wlr.clear_table(X_0:str, X_1:str):int
", "WLRclear_table;", "" ]
[ "wlr", "comment_on", "pattern wlr.comment_on(X_0:int, X_1:str):void
", "WLRgeneric;", "" ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -541,7 +541,8 @@ gdk_return log_bat_transient(logger *lg,
gdk_return log_constant(logger *lg, int type, ptr val, log_id id, lng offset,
lng cnt);
gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, log_id id);
gdk_return log_sequence(logger *lg, int seq, lng id);
-gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_return log_tdone(logger *lg, ulng commit_ts);
+gdk_return log_tend(logger *lg);
gdk_return log_tstart(logger *lg, bool flush);
gdk_return logger_activate(logger *lg);
lng logger_changes(logger *lg);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -347,14 +347,24 @@ string_reader(logger *lg, BAT *b, lng nr
/* handle strings */
if (b) {
char *t = buf;
+ /* chunked */
+#define CHUNK_SIZE 1024
+ char *strings[CHUNK_SIZE];
+ int cur = 0;
+
for(int i=0; i<nr && res == LOG_OK; i++) {
- if (BUNappend(b, t, true) != GDK_SUCCEED)
+ strings[cur++] = t;
+ if (cur == CHUNK_SIZE && BUNappendmulti(b, strings,
cur, true) != GDK_SUCCEED)
res = LOG_ERR;
+ if (cur == CHUNK_SIZE)
+ cur = 0;
/* find next */
while(*t)
t++;
t++;
}
+ if (cur && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED)
+ res = LOG_ERR;
}
GDKfree(buf);
return res;
@@ -2641,7 +2651,7 @@ new_logfile(logger *lg)
}
gdk_return
-log_tend(logger *lg, ulng commit_ts)
+log_tend(logger *lg)
{
logformat l;
gdk_return res = GDK_SUCCEED;
@@ -2657,11 +2667,6 @@ log_tend(logger *lg, ulng commit_ts)
return res;
}
- if (lg->current) {
- lg->current->last_tid = lg->tid;
- lg->current->last_ts = commit_ts;
- }
-
if (LOG_DISABLED(lg)) {
lg->end++;
return GDK_SUCCEED;
@@ -2678,6 +2683,19 @@ log_tend(logger *lg, ulng commit_ts)
return GDK_SUCCEED;
}
+gdk_return
+log_tdone(logger *lg, ulng commit_ts)
+{
+ if (lg->debug & 1)
+ fprintf(stderr, "#log_tdone %d\n", lg->tid);
+
+ if (lg->current) {
+ lg->current->last_tid = lg->tid;
+ lg->current->last_ts = commit_ts;
+ }
+ return GDK_SUCCEED;
+}
+
static gdk_return
log_sequence_(logger *lg, int seq, lng val, int flush)
{
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -69,7 +69,8 @@ gdk_export gdk_return log_delta(logger *
//gdk_export gdk_return log_batgroup_end(logger *lg, oid id);
gdk_export gdk_return log_tstart(logger *lg, bool flush);
-gdk_export gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_export gdk_return log_tend(logger *lg);
+gdk_export gdk_return log_tdone(logger *lg, ulng commit_ts);
gdk_export gdk_return log_sequence(logger *lg, int seq, lng id);
gdk_export log_bid logger_find_bat(logger *lg, log_id id);
diff --git a/monetdb5/optimizer/opt_emptybind.c
b/monetdb5/optimizer/opt_emptybind.c
--- a/monetdb5/optimizer/opt_emptybind.c
+++ b/monetdb5/optimizer/opt_emptybind.c
@@ -133,8 +133,9 @@ OPTemptybindImplementation(Client cntxt,
for(j= 0; j< etop; j++){
q= updated[j];
if(q && getModuleId(q) == sqlRef &&
isUpdateInstruction(q)){
- if (
strcmp(getVarConstant(mb,getArg(q,2)).val.sval, sch) == 0 &&
-
strcmp(getVarConstant(mb,getArg(q,3)).val.sval, tbl) == 0 ){
+ int c = getFunctionId(q) == claimRef;
/* claim has 2 results */
+ if (
strcmp(getVarConstant(mb,getArg(q,2+c)).val.sval, sch) == 0 &&
+
strcmp(getVarConstant(mb,getArg(q,3+c)).val.sval, tbl) == 0 ){
empty[getArg(p,0)] = 0;
if( p->retc == 2){
empty[getArg(p,1)] = 0;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -491,22 +491,24 @@ create_table_or_view(mvc *sql, char* sna
return MAL_SUCCEED;
}
-static BAT *
-mvc_claim_slots(sql_trans *tr, sql_table *t, size_t cnt)
+static int
+mvc_claim_slots(sql_trans *tr, sql_table *t, size_t cnt, BUN *offset, BAT
**pos)
{
sqlstore *store = tr->store;
- return store->storage_api.claim_tab(tr, t, cnt);
+ return store->storage_api.claim_tab(tr, t, cnt, offset, pos);
}
str
mvc_claim_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- bat *res = getArgReference_bat(stk, pci, 0);
+ BUN *offset = (BUN*)getArgReference_oid(stk, pci, 0);
+ bat *res = getArgReference_bat(stk, pci, 1);
mvc *m = NULL;
str msg;
- const char *sname = *getArgReference_str(stk, pci, 2);
- const char *tname = *getArgReference_str(stk, pci, 3);
- lng cnt = *(lng*)getArgReference_lng(stk, pci, 4);
+ const char *sname = *getArgReference_str(stk, pci, 3);
+ const char *tname = *getArgReference_str(stk, pci, 4);
+ lng cnt = *(lng*)getArgReference_lng(stk, pci, 5);
+ BAT *pos = NULL;
sql_schema *s;
sql_table *t;
@@ -523,9 +525,10 @@ mvc_claim_wrap(Client cntxt, MalBlkPtr m
t = mvc_bind_table(m, s, tname);
if (t == NULL)
throw(SQL, "sql.claim", SQLSTATE(42S02) "Table missing %s.%s",
sname, tname);
- BAT *pos = mvc_claim_slots(m->session->tr, t, (size_t)cnt);
- if (pos) {
- BBPkeepref(*res = pos->batCacheid);
+ if (mvc_claim_slots(m->session->tr, t, (size_t)cnt, offset, &pos) ==
LOG_OK) {
+ *res = bat_nil;
+ if (pos)
+ BBPkeepref(*res = pos->batCacheid);
return MAL_SUCCEED;
}
throw(SQL, "sql.claim", SQLSTATE(3F000) "Could not claim slots");
@@ -578,8 +581,9 @@ create_table_from_emit(Client cntxt, cha
return msg;
if (!(t = mvc_bind_table(sql, s, tname)))
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE
TABLE: could not bind table %s", tname);
- BAT *pos = mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b));
- if (!pos)
+ BUN offset;
+ BAT *pos = NULL;
+ if (mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b),
&offset, &pos) != LOG_OK)
return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: Could
not insert data");
for (i = 0; i < ncols; i++) {
BAT *b = columns[i].b;
@@ -589,7 +593,7 @@ create_table_from_emit(Client cntxt, cha
bat_destroy(pos);
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000)
"CREATE TABLE: could not bind column %s", columns[i].name);
}
- if ((msg = mvc_append_column(sql->session->tr, col, pos, b)) !=
MAL_SUCCEED) {
+ if ((msg = mvc_append_column(sql->session->tr, col, offset,
pos, b)) != MAL_SUCCEED) {
bat_destroy(pos);
return msg;
}
@@ -618,8 +622,9 @@ append_to_table_from_emit(Client cntxt,
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "APPEND
TABLE: no such schema '%s'", sname);
if (!(t = mvc_bind_table(sql, s, tname)))
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "APPEND
TABLE: could not bind table %s", tname);
- BAT *pos = mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b));
- if (!pos)
+ BUN offset;
+ BAT *pos = NULL;
+ if (mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b),
&offset, &pos) != LOG_OK)
return sql_error(sql, 02, SQLSTATE(3F000) "APPEND TABLE: Could
not append data");
for (i = 0; i < ncols; i++) {
BAT *b = columns[i].b;
@@ -629,7 +634,7 @@ append_to_table_from_emit(Client cntxt,
bat_destroy(pos);
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000)
"APPEND TABLE: could not bind column %s", columns[i].name);
}
- if ((msg = mvc_append_column(sql->session->tr, col, pos, b)) !=
MAL_SUCCEED) {
+ if ((msg = mvc_append_column(sql->session->tr, col, offset,
pos, b)) != MAL_SUCCEED) {
bat_destroy(pos);
return msg;
}
@@ -1753,10 +1758,10 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
}
str
-mvc_append_column(sql_trans *t, sql_column *c, BAT *pos, BAT *ins)
+mvc_append_column(sql_trans *t, sql_column *c, BUN offset, BAT *pos, BAT *ins)
{
sqlstore *store = t->store;
- int res = store->storage_api.append_col(t, c, pos, ins, TYPE_bat);
+ int res = store->storage_api.append_col(t, c, offset, pos, ins,
BATcount(ins), TYPE_bat);
if (res != LOG_OK) /* the conflict case should never happen, but leave
it here */
throw(SQL, "sql.append", SQLSTATE(42000) "Append failed%s", res
== LOG_CONFLICT ? " due to conflict with another transaction" : "");
return MAL_SUCCEED;
@@ -1812,14 +1817,16 @@ mvc_append_wrap(Client cntxt, MalBlkPtr
const char *sname = *getArgReference_str(stk, pci, 2);
const char *tname = *getArgReference_str(stk, pci, 3);
const char *cname = *getArgReference_str(stk, pci, 4);
- bat Pos = *getArgReference_bat(stk, pci, 5);
- ptr ins = getArgReference(stk, pci, 6);
- int tpe = getArgType(mb, pci, 6), log_res = LOG_OK;
+ BUN offset = *(BUN*)getArgReference_oid(stk, pci, 5);
+ bat Pos = *getArgReference_bat(stk, pci, 6);
+ ptr ins = getArgReference(stk, pci, 7);
+ int tpe = getArgType(mb, pci, 7), log_res = LOG_OK;
sql_schema *s;
sql_table *t;
sql_column *c;
sql_idx *i;
BAT *b = NULL, *pos = NULL;
+ BUN cnt = 1;
*res = 0;
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
@@ -1828,7 +1835,7 @@ mvc_append_wrap(Client cntxt, MalBlkPtr
return msg;
if (tpe > GDKatomcnt)
tpe = TYPE_bat;
- if ((pos = BATdescriptor(Pos)) == NULL)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list