Changeset: d2c8343012b8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d2c8343012b8
Removed Files:
sql/storage/bat/nop_logger.c
sql/storage/bat/nop_logger.h
Modified Files:
gdk/gdk_bbp.c
gdk/gdk_logger.c
gdk/gdk_logger.h
gdk/gdk_tm.c
monetdb5/mal/mal.c
monetdb5/mal/mal_authorize.c
monetdb5/mal/mal_profiler.c
monetdb5/mal/mal_session.c
monetdb5/modules/mal/mal_mapi.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_scenario.c
sql/storage/bat/Makefile.ag
sql/storage/store.c
tools/mserver/mserver5.c
Branch: default
Log Message:
Made in-memory mode working.
For now, start server with flag --in-memory and the client with
-d:inmemory -p50000 -hlocalhost. This may change.
diffs (truncated from 1132 to 300 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1043,6 +1043,13 @@ BBPaddfarm(const char *dirname, int role
struct stat st;
int i;
+ if (dirname == NULL) {
+ assert(BBPfarms[0].dirname == NULL);
+ assert(rolemask & 1);
+ assert(BBPfarms[0].roles == 0);
+ BBPfarms[0].roles = rolemask;
+ return GDK_SUCCEED;
+ }
if (strchr(dirname, '\n') != NULL) {
GDKerror("BBPaddfarm: no newline allowed in directory name\n");
return GDK_FAIL;
@@ -1118,12 +1125,7 @@ BBPinit(void)
unsigned bbpversion = 0;
int i;
- if (GDKinmemory()) {
- if (BBPaddfarm(".", 1 << PERSISTENT) != GDK_SUCCEED ||
- BBPaddfarm(".", 1 << TRANSIENT) != GDK_SUCCEED) {
- return GDK_FAIL;
- }
- } else {
+ if (!GDKinmemory()) {
str bbpdirstr, backupbbpdirstr;
if (!(bbpdirstr = GDKfilepath(0, BATDIR, "BBP", "dir"))) {
@@ -1195,7 +1197,9 @@ BBPinit(void)
memset(BBP, 0, sizeof(BBP));
ATOMIC_SET(&BBPsize, 1);
- if (!GDKinmemory()) {
+ if (GDKinmemory()) {
+ bbpversion = GDKLIBRARY;
+ } else {
bbpversion = BBPheader(fp);
if (bbpversion == 0)
return GDK_FAIL;
@@ -2350,7 +2354,7 @@ decref(bat i, bool logical, bool release
* if they have been made cold or are not dirty */
if (BBP_refs(i) > 0 ||
(BBP_lrefs(i) > 0 &&
- (b == NULL || BATdirty(b) || !(BBP_status(i) & BBPPERSISTENT)))) {
+ (b == NULL || BATdirty(b) || !(BBP_status(i) & BBPPERSISTENT) ||
GDKinmemory()))) {
/* bat cannot be swapped out */
} else if (b ? b->batSharecnt == 0 : (BBP_status(i) & BBPTMP)) {
/* bat will be unloaded now. set the UNLOADING bit
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -187,6 +187,7 @@ logbat_new(int tt, BUN size, role_t role
static int
log_read_format(logger *l, logformat *data)
{
+ assert(!l->inmemory);
return mnstr_read(l->log, &data->flag, 1, 1) == 1 &&
mnstr_readLng(l->log, &data->nr) == 1 &&
mnstr_readInt(l->log, &data->tid) == 1;
@@ -195,6 +196,7 @@ log_read_format(logger *l, logformat *da
static gdk_return
log_write_format(logger *l, logformat *data)
{
+ assert(!l->inmemory);
if (mnstr_write(l->log, &data->flag, 1, 1) == 1 &&
mnstr_writeLng(l->log, data->nr) &&
mnstr_writeInt(l->log, data->tid))
@@ -210,6 +212,7 @@ log_read_string(logger *l)
ssize_t nr;
char *buf;
+ assert(!l->inmemory);
if (mnstr_readInt(l->log, &len) != 1) {
fprintf(stderr, "!ERROR: log_read_string: read failed\n");
//MK This leads to non-repeatable log structure?
@@ -239,6 +242,7 @@ log_write_string(logger *l, const char *
{
size_t len = strlen(n) + 1; /* log including EOS */
+ assert(!l->inmemory);
assert(len > 1);
assert(len <= INT_MAX);
if (!mnstr_writeInt(l->log, (int) len) ||
@@ -312,6 +316,7 @@ log_read_seq(logger *lg, logformat *l)
lng val;
BUN p;
+ assert(!lg->inmemory);
assert(l->nr <= (lng) INT_MAX);
if (mnstr_readLng(lg->log, &val) != 1) {
fprintf(stderr, "!ERROR: log_read_seq: read failed\n");
@@ -339,6 +344,7 @@ static gdk_return
log_write_id(logger *l, char tpe, oid id)
{
lng lid = id;
+ assert(!l->inmemory);
assert(lid >= 0);
if (mnstr_writeChr(l->log, tpe) &&
mnstr_writeLng(l->log, lid))
@@ -352,6 +358,7 @@ log_read_id(logger *lg, char *tpe, oid *
{
lng lid;
+ assert(!lg->inmemory);
if (mnstr_readChr(lg->log, tpe) != 1 ||
mnstr_readLng(lg->log, &lid) != 1) {
fprintf(stderr, "!ERROR: log_read_id: read failed\n");
@@ -368,6 +375,7 @@ fltRead(void *dst, stream *s, size_t cnt
flt *ptr;
size_t i;
+ assert(!GDKinmemory());
if ((ptr = BATatoms[TYPE_flt].atomRead(dst, s, cnt)) == NULL)
return NULL;
for (i = 0; i < cnt; i++)
@@ -382,6 +390,7 @@ dblRead(void *dst, stream *s, size_t cnt
dbl *ptr;
size_t i;
+ assert(!GDKinmemory());
if ((ptr = BATatoms[TYPE_dbl].atomRead(dst, s, cnt)) == NULL)
return NULL;
for (i = 0; i < cnt; i++)
@@ -396,6 +405,7 @@ mbrRead(void *dst, stream *s, size_t cnt
/* an MBR consists of 4 flt values; here we don't care about
* anything else, we just need to convert the old NIL to NaN
* for all those values */
+ assert(!GDKinmemory());
return fltRead(dst, s, cnt * 4);
}
#endif
@@ -408,6 +418,7 @@ log_read_updates(logger *lg, trans *tr,
log_return res = LOG_OK;
int ht = -1, tt = -1, tseq = 0;
+ assert(!lg->inmemory);
if (lg->debug & 1)
fprintf(stderr, "#logger found log_read_updates %s %s " LLFMT
"\n", name, l->flag == LOG_INSERT ? "insert" : "update", l->nr);
@@ -637,6 +648,7 @@ static log_return
log_read_destroy(logger *lg, trans *tr, char *name, char tpe, oid id)
{
(void) lg;
+ assert(!lg->inmemory);
if (tr_grow(tr) == GDK_SUCCEED) {
tr->changes[tr->nr].type = LOG_DESTROY;
tr->changes[tr->nr].tpe = tpe;
@@ -684,7 +696,7 @@ log_read_create(logger *lg, trans *tr, c
int ht, tt;
char *ha, *ta;
-
+ assert(!lg->inmemory);
if (lg->debug & 1)
fprintf(stderr, "#log_read_create %s\n", name);
@@ -750,6 +762,8 @@ static log_return
log_read_use(logger *lg, trans *tr, logformat *l, char *name, char tpe, oid id)
{
(void) lg;
+
+ assert(!lg->inmemory);
if (tr_grow(tr) != GDK_SUCCEED)
return LOG_ERR;
tr->changes[tr->nr].type = LOG_USE;
@@ -960,6 +974,10 @@ logger_open(logger *lg)
char id[BUFSIZ];
char *filename;
+ if (lg->inmemory) {
+ lg->end = 0;
+ return GDK_SUCCEED;
+ }
snprintf(id, sizeof(id), LLFMT, lg->id);
filename = GDKfilepath(BBPselectfarm(PERSISTENT, 0, offheap), lg->dir,
LOGFILE, id);
@@ -982,7 +1000,8 @@ logger_open(logger *lg)
static void
logger_close(logger *lg)
{
- close_stream(lg->log);
+ if (!lg->inmemory)
+ close_stream(lg->log);
lg->log = NULL;
}
@@ -997,6 +1016,7 @@ logger_readlog(logger *lg, char *filenam
int dbg = GDKdebug;
int fd;
+ assert(!lg->inmemory);
GDKdebug &= ~(CHECKMASK|PROPMASK);
if (lg->debug & 1) {
@@ -1224,6 +1244,7 @@ logger_readlogs(logger *lg, FILE *fp, ch
char id[BUFSIZ];
int len;
+ assert(!lg->inmemory);
if (lg->debug & 1) {
fprintf(stderr, "#logger_readlogs logger id is " LLFMT "\n",
lg->id);
}
@@ -1295,6 +1316,7 @@ check_version(logger *lg, FILE *fp)
{
int version = 0;
+ assert(!lg->inmemory);
if (fscanf(fp, "%6d", &version) != 1) {
GDKerror("Could not read the version number from the file
'%s/log'.\n",
lg->dir);
@@ -1560,14 +1582,16 @@ logger_load(int debug, const char *fn, c
bool needcommit = false;
int dbg = GDKdebug;
- if(!(filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL)))
- goto error;
- snprintf(filename, FILENAME_MAX, "%s", filenamestr);
- len = snprintf(bak, sizeof(bak), "%s.bak", filename);
- GDKfree(filenamestr);
- if (len == -1 || len >= FILENAME_MAX) {
- GDKerror("Logger filename path is too large\n");
- goto error;
+ if (!lg->inmemory) {
+ if ((filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL))
== NULL)
+ goto error;
+ snprintf(filename, FILENAME_MAX, "%s", filenamestr);
+ len = snprintf(bak, sizeof(bak), "%s.bak", filename);
+ GDKfree(filenamestr);
+ if (len == -1 || len >= FILENAME_MAX) {
+ GDKerror("Logger filename path is too large\n");
+ goto error;
+ }
}
lg->catalog_bid = NULL;
@@ -1583,17 +1607,19 @@ logger_load(int debug, const char *fn, c
lg->seqs_val = NULL;
lg->dseqs = NULL;
- /* try to open logfile backup, or failing that, the file
- * itself. we need to know whether this file exists when
- * checking the database consistency later on */
- if ((fp = fopen(bak, "r")) != NULL) {
- fclose(fp);
- fp = NULL;
- if (GDKunlink(farmid, lg->dir, LOGFILE, NULL) != GDK_SUCCEED ||
- GDKmove(farmid, lg->dir, LOGFILE, "bak", lg->dir, LOGFILE,
NULL) != GDK_SUCCEED)
- goto error;
+ if (!lg->inmemory) {
+ /* try to open logfile backup, or failing that, the file
+ * itself. we need to know whether this file exists when
+ * checking the database consistency later on */
+ if ((fp = fopen(bak, "r")) != NULL) {
+ fclose(fp);
+ fp = NULL;
+ if (GDKunlink(farmid, lg->dir, LOGFILE, NULL) !=
GDK_SUCCEED ||
+ GDKmove(farmid, lg->dir, LOGFILE, "bak", lg->dir,
LOGFILE, NULL) != GDK_SUCCEED)
+ goto error;
+ }
+ fp = fopen(filename, "r");
}
- fp = fopen(filename, "r");
stpconcat(bak, fn, "_catalog", NULL);
bid = BBPindex(bak);
@@ -1661,41 +1687,43 @@ logger_load(int debug, const char *fn, c
goto error;
}
- if (GDKcreatedir(filename) != GDK_SUCCEED) {
- GDKerror("logger_load: cannot create directory for log
file %s\n",
- filename);
- goto error;
- }
- if ((fp = fopen(filename, "w")) == NULL) {
- GDKerror("logger_load: cannot create log file %s\n",
- filename);
- goto error;
- }
- lg->id ++;
- if (fprintf(fp, "%06d\n\n" LLFMT "\n", lg->version, lg->id) <
0) {
- fclose(fp);
- remove(filename);
- GDKerror("logger_load: writing log file %s failed",
- filename);
- goto error;
+ if (!lg->inmemory) {
+ if (GDKcreatedir(filename) != GDK_SUCCEED) {
+ GDKerror("logger_load: cannot create directory
for log file %s\n",
+ filename);
+ goto error;
+ }
+ if ((fp = fopen(filename, "w")) == NULL) {
+ GDKerror("logger_load: cannot create log file
%s\n",
+ filename);
+ goto error;
+ }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list