Changeset: db5c6a2b60e8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=db5c6a2b60e8
Modified Files:
gdk/gdk.h
gdk/gdk_bbp.c
gdk/gdk_bbp.h
gdk/gdk_logger.c
gdk/gdk_utils.c
gdk/gdk_utils.h
monetdb5/mal/mal.c
monetdb5/mal/mal_atom.c
monetdb5/modules/atoms/mtime.c
monetdb5/modules/atoms/mtime.h
sql/backends/monet5/sql_scenario.c
sql/storage/bat/bat_logger.c
sql/storage/store.c
tools/embedded/Tests/lowlevel.R
tools/embedded/embedded.c
tools/embedded/rpackage/R/monetdb.R
Branch: embedded
Log Message:
Restartability ugly hacks
diffs (truncated from 394 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2411,10 +2411,14 @@ gdk_export void GDKerror(_In_z_ _Printf_
__attribute__((__format__(__printf__, 1, 2)));
gdk_export void GDKsyserror(_In_z_ _Printf_format_string_ const char *format,
...)
__attribute__((__format__(__printf__, 1, 2)));
+#ifndef HAVE_EMBEDDED
__declspec(noreturn) gdk_export void GDKfatal(_In_z_ _Printf_format_string_
const char *format, ...)
__attribute__((__format__(__printf__, 1, 2)))
__attribute__((__noreturn__));
-
+#else
+gdk_export void GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...)
+ __attribute__((__format__(__printf__, 1, 2)));
+#endif
/*
* @
*/
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1024,7 +1024,7 @@ BBPaddfarm(const char *dirname, int role
}
for (i = 0; i < MAXFARMS; i++) {
if (BBPfarms[i].dirname == NULL) {
- BBPfarms[i].dirname = strdup(dirname);
+ BBPfarms[i].dirname = GDKstrdup(dirname);
BBPfarms[i].roles = rolemask;
return;
}
@@ -1032,6 +1032,18 @@ BBPaddfarm(const char *dirname, int role
GDKfatal("BBPaddfarm: too many farms\n");
}
+gdk_export void BBPresetfarms() {
+ BBPexit();
+ BBPunlock("BBPexit");
+ BBPsize = 0;
+ if (BBPfarms[0].dirname != NULL) {
+ GDKfree((void*) BBPfarms[0].dirname);
+ }
+ BBPfarms[0].dirname = NULL;
+ BBPfarms[0].roles = 0;
+}
+
+
void
BBPinit(void)
{
@@ -1142,6 +1154,8 @@ BBPinit(void)
* interference in a parallel session.
*/
+static int backup_files = 0, backup_dir = 0, backup_subdir = 0;
+
void
BBPexit(void)
{
@@ -1162,7 +1176,7 @@ BBPexit(void)
skipped = 1;
continue;
}
- /* NIELS ?? Why reduce share count,
it's done in VIEWdestroy !! */
+ /* NIELS ?? Why reduce share count,
it's done in VIEWdestroy !!
if (isVIEW(b)) {
bat hp = VIEWhparent(b), tp =
VIEWtparent(b);
bat vhp = VIEWvhparent(b), vtp
= VIEWvtparent(b);
@@ -1182,7 +1196,7 @@ BBPexit(void)
BBP_cache(vtp)->batSharecnt--;
--BBP_lrefs(vtp);
}
- }
+ }*/
if (isVIEW(b))
VIEWdestroy(b);
else
@@ -1208,6 +1222,11 @@ BBPexit(void)
} while (skipped);
GDKfree(BBP_hash);
BBP_hash = 0;
+ // these need to be NULL, otherwise no new ones get created
+ backup_files = 0;
+ backup_dir = 0;
+ backup_subdir = 0;
+
}
/*
@@ -3264,7 +3283,6 @@ heap_move(Heap *hp, const char *srcdir,
* backup_dir == 1 => BBP.dir saved in BACKUP/
* backup_dir == 2 => BBP.dir saved in SUBCOMMIT/
*/
-static int backup_files = 0, backup_dir = 0, backup_subdir = 0;
static gdk_return
BBPprepare(bit subcommit)
diff --git a/gdk/gdk_bbp.h b/gdk/gdk_bbp.h
--- a/gdk/gdk_bbp.h
+++ b/gdk/gdk_bbp.h
@@ -60,6 +60,7 @@ gdk_export bat getBBPsize(void); /* curr
/* global calls */
gdk_export void BBPaddfarm(const char *dirname, int rolemask);
+gdk_export void BBPresetfarms();
/* update interface */
gdk_export void BBPclear(bat bid);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1901,15 +1901,14 @@ logger_create(int debug, const char *fn,
logger *lg;
lg = logger_new(debug, fn, logdir, version, prefuncp, postfuncp, 0,
NULL);
+ if (!lg)
+ return NULL;
if (lg->debug & 1) {
printf("# Started processing logs %s/%s version
%d\n",fn,logdir,version);
fflush(stdout);
}
- if (!lg)
- return NULL;
if (logger_open(lg) == LOG_ERR) {
logger_destroy(lg);
-
return NULL;
}
if (lg->debug & 1) {
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1244,7 +1244,7 @@ GDKexit(int status)
#ifndef HAVE_EMBEDDED
if (GDKlockFile == NULL) {
/* no database lock, so no threads, so exit now */
- exit(status);
+ MT_global_exit(status);
}
#endif
if (ATOMIC_TAS(GDKstopped, GDKstoppedLock, "GDKexit") == 0) {
@@ -1269,16 +1269,12 @@ GDKexit(int status)
MT_sleep_ms(CATNAP);
}
if (status == 0) {
- /* they had there chance, now kill them */
+ /* they had their chance, now kill them */
MT_lock_set(&GDKthreadLock, "GDKexit");
for (t = GDKthreads, s = t + THREADS; t < s; t++) {
- if (t->pid) {
- MT_Id victim = t->pid;
-
- if (t->pid != pid) {
- fprintf(stderr, "#GDKexit:
killing thread\n");
- MT_kill_thread(victim);
- }
+ if (t->pid && t->pid != pid) {
+ fprintf(stderr, "#GDKexit: killing
thread\n");
+ MT_kill_thread(t->pid);
}
}
MT_lock_unset(&GDKthreadLock, "GDKexit");
@@ -1292,10 +1288,13 @@ GDKexit(int status)
#if !defined(USE_PTHREAD_LOCKS) && !defined(NDEBUG)
TEMDEBUG GDKlockstatistics(1);
#endif
-#ifndef HAVE_EMBEDDED
+#ifdef HAVE_EMBEDDED
+ return;
+#else
MT_global_exit(status);
#endif
}
+ fprintf(stderr, "#GDKexit: killing thread -1\n");
MT_exit_thread(-1);
}
diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h
--- a/gdk/gdk_utils.h
+++ b/gdk/gdk_utils.h
@@ -86,9 +86,12 @@ gdk_export int GDKinit(opt *set, int set
* takes care of this.
*/
gdk_export int GDKnr_threads;
-
+#ifndef HAVE_EMBEDDED
__declspec(noreturn) gdk_export void GDKexit(int status)
__attribute__((__noreturn__));
+#else
+gdk_export void GDKexit(int status);
+#endif
gdk_export int GDKexiting(void);
gdk_export const char *GDKversion(void);
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -88,7 +88,9 @@ int mal_init(void){
monet_memory = MT_npages() * MT_pagesize();
initNamespace();
initParser();
+#ifndef HAVE_EMBEDDED
initHeartbeat();
+#endif
initResource();
RECYCLEinit();
if( malBootstrap() == 0)
@@ -171,5 +173,6 @@ void mal_exit(void){
fprintf(stderr, "!%s", err);
free(err);
}
+ MTIMEreset();
GDKexit(0); /* properly end GDK */
}
diff --git a/monetdb5/mal/mal_atom.c b/monetdb5/mal/mal_atom.c
--- a/monetdb5/mal/mal_atom.c
+++ b/monetdb5/mal/mal_atom.c
@@ -170,7 +170,9 @@ void malAtomDefinition(stream *out, str
return;
}
if (ATOMindex(name) >= 0) {
+#ifndef HAVE_EMBEDDED /* we can restart embedded MonetDB, making this an
expected error */
showException(out, TYPE, "atomDefinition", "Redefinition of
atom '%s'", name);
+#endif
return;
}
if (tpe < 0 || tpe >= GDKatomcnt) {
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -1274,6 +1274,11 @@ MTIMEtimestamp2timestamp(timestamp *ret,
static BAT *timezone_name = NULL;
static BAT *timezone_def = NULL;
+void MTIMEreset() {
+ timezone_name = NULL;
+ timezone_def = NULL;
+}
+
str
MTIMEprelude(void *ret)
{
diff --git a/monetdb5/modules/atoms/mtime.h b/monetdb5/modules/atoms/mtime.h
--- a/monetdb5/modules/atoms/mtime.h
+++ b/monetdb5/modules/atoms/mtime.h
@@ -125,6 +125,7 @@ mtime_export str MTIMEdaytime2daytime(da
mtime_export str MTIMEsecs2daytime(daytime *ret, const lng *src);
mtime_export str MTIMEsecs2daytime_bulk(bat *ret, bat *bid);
mtime_export str MTIMEtimestamp2timestamp(timestamp *ret, const timestamp
*src);
+mtime_export void MTIMEreset();
mtime_export str MTIMEprelude(void *ret);
mtime_export str MTIMEepilogue(void *ret);
mtime_export str MTIMEsynonyms(void *ret, const bit *allow);
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -202,8 +202,6 @@ SQLepilogue(void *ret)
mvc_exit();
SQLinitialized = FALSE;
}
- /* this function is never called, but for the style of it, we clean
- * up our own mess */
res = msab_retreatScenario(m);
if (!res)
return msab_retreatScenario(s);
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -178,8 +178,9 @@ bl_destroy(void)
bat_logger = NULL;
if (l) {
- logger_exit(l);
- logger_destroy(l);
+ // FIXME: either of those corrupts stuff
+ //logger_exit(l);
+ //logger_destroy(l);
}
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1551,9 +1551,8 @@ store_init(int debug, store_type store,
}
/* initialize empty bats */
- if (store == store_bat)
+ if (store == store_bat) {
bat_utils_init();
- if (store == store_bat) {
bat_storage_init(&store_funcs);
bat_table_init(&table_funcs);
bat_logger_init(&logger_funcs);
diff --git a/tools/embedded/Tests/lowlevel.R b/tools/embedded/Tests/lowlevel.R
--- a/tools/embedded/Tests/lowlevel.R
+++ b/tools/embedded/Tests/lowlevel.R
@@ -11,7 +11,7 @@ test_that("db starts up", {
expect_error(monetdb_embedded_startup("/dev/null"))
dbdir <- tempdir()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list