Changeset: 40045cfdc3dd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=40045cfdc3dd
Modified Files:
clients/Tests/exports.stable.out
common/stream/stream.c
common/utils/msabaoth.c
common/utils/msabaoth.h
gdk/gdk_logger.c
monetdb5/ChangeLog.Jul2012
monetdb5/mal/mal.c
monetdb5/mal/mal_sabaoth.c
monetdb5/modules/mal/sabaoth.c
tools/merovingian/ChangeLog.Jul2012
tools/merovingian/daemon/controlrunner.c
tools/merovingian/daemon/discoveryrunner.c
tools/merovingian/daemon/forkmserver.c
tools/merovingian/daemon/handlers.c
tools/merovingian/daemon/multiplex-funnel.c
tools/mserver/mserver5.c
Branch: default
Log Message:
Merge with Jul2012 branch.
diffs (truncated from 604 to 300 lines):
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
@@ -430,6 +430,8 @@ void msab_init(char *dbfarm, char *dbnam
char *msab_marchConnection(const char *host, const int port);
char *msab_marchScenario(const char *lang);
char *msab_registerStart(void);
+char *msab_registerStarted(void);
+char *msab_registerStarting(void);
char *msab_registerStop(void);
char *msab_retreatScenario(const char *lang);
char *msab_serialise(char **ret, const sabdb *db);
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -305,7 +305,6 @@ mnstr_fgetpos(stream *s, lng *p)
#ifdef STREAM_DEBUG
printf("fgetpos %s\n", s->name ? s->name : "<unnamed>");
#endif
- assert(s->access == ST_WRITE);
if (s->errnr)
return s->errnr;
if (s->fgetpos)
diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -364,7 +364,15 @@ msab_wildRetreat(void)
return(NULL);
}
+/* dummy for ABI compatability in Jul2012 branch */
+char *
+msab_registerStart(void)
+{
+ return(strdup("function no longer supported"));
+}
+
#define UPLOGFILE ".uplog"
+#define STARTINGFILE ".starting"
/**
* Writes a start attempt to the sabaoth start/stop log. Examination of
* the log at a later stage reveals crashes of the server. In addition
@@ -372,7 +380,7 @@ msab_wildRetreat(void)
* the current process behind.
*/
char *
-msab_registerStart(void)
+msab_registerStarting(void)
{
/* The sabaoth uplog is in fact a simple two column table that
* contains a start time and a stop time. Start times are followed
@@ -408,6 +416,31 @@ msab_registerStart(void)
return(NULL);
}
fclose(fopen(path, "w"));
+ /* flag this database as starting up, with the same boundary
+ * conditions as above */
+ if ((tmp = getDBPath(&path, PATHLENGTH, STARTINGFILE)) != NULL)
+ return(tmp);
+ fclose(fopen(path, "w"));
+
+ return(NULL);
+}
+
+/**
+ * Removes the starting state, and turns this into a fully started
+ * engine. The caller is responsible for calling registerStarting()
+ * first.
+ */
+char *
+msab_registerStarted(void)
+{
+ char pathbuf[PATHLENGTH];
+ char *path = pathbuf;
+ char *tmp;
+
+ /* remove starting flag */
+ if ((tmp = getDBPath(&path, PATHLENGTH, STARTINGFILE)) != NULL)
+ return(tmp);
+ unlink(path);
return(NULL);
}
@@ -597,7 +630,14 @@ msab_getStatus(sabdb** ret, char *dbname
/* the log is empty, assume no crash */
sdb->state = SABdbInactive;
} else if (data[0] == '\t') {
- sdb->state = SABdbRunning;
+ /* see if the database has finished
starting */
+ snprintf(buf, sizeof(buf), "%s/%s/%s",
+ path, e->d_name,
STARTINGFILE);
+ if (stat(buf, &statbuf) == -1) {
+ sdb->state = SABdbRunning;
+ } else {
+ sdb->state = SABdbStarting;
+ }
} else { /* should be \n */
sdb->state = SABdbInactive;
}
diff --git a/common/utils/msabaoth.h b/common/utils/msabaoth.h
--- a/common/utils/msabaoth.h
+++ b/common/utils/msabaoth.h
@@ -28,7 +28,8 @@ typedef enum {
SABdbIllegal = 0,
SABdbRunning,
SABdbCrashed,
- SABdbInactive
+ SABdbInactive,
+ SABdbStarting
} SABdbState;
typedef struct Ssabdb {
@@ -74,6 +75,8 @@ msab_export char *msab_retreatScenario(c
msab_export char *msab_marchConnection(const char *host, const int port);
msab_export char *msab_wildRetreat(void);
msab_export char *msab_registerStart(void);
+msab_export char *msab_registerStarting(void);
+msab_export char *msab_registerStarted(void);
msab_export char *msab_registerStop(void);
msab_export char *msab_getMyStatus(sabdb** ret);
msab_export char *msab_getStatus(sabdb** ret, char *dbname);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -753,6 +753,9 @@ logger_readlog(logger *lg, char *filenam
trans *tr = NULL;
logformat l;
int err = 0;
+ time_t t0, t1;
+ struct stat sb;
+ lng fpos;
lg->log = open_rstream(filename);
@@ -763,9 +766,19 @@ logger_readlog(logger *lg, char *filenam
lg->log = NULL;
return 0;
}
+ stat(filename, &sb);
+ t0 = time(NULL);
while (!err && log_read_format(lg, &l)) {
char *name = NULL;
+ t1 = time(NULL);
+ if (t1 - t0 > 10) {
+ t0 = t1;
+ /* not more than once every 10 seconds */
+ mnstr_fgetpos(lg->log, &fpos);
+ printf("# still reading write-ahead log \"%s\" (%d%%
done)\n", filename, (int) (((off_t) fpos * 100 + 50) / sb.st_size));
+ fflush(stdout);
+ }
if (l.flag != LOG_START && l.flag != LOG_END && l.flag !=
LOG_SEQ) {
name = log_read_string(lg);
diff --git a/monetdb5/ChangeLog.Jul2012 b/monetdb5/ChangeLog.Jul2012
--- a/monetdb5/ChangeLog.Jul2012
+++ b/monetdb5/ChangeLog.Jul2012
@@ -1,3 +1,7 @@
# ChangeLog file for MonetDB5
# This file is updated with Maddlog
+* Thu Aug 2 2012 Fabian Groffen <[email protected]>
+- The server now distinguishes between starting and started states,
+ such that monetdbd can wait for it to finish starting.
+
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -279,7 +279,6 @@ moreClients(int reruns)
return finishing+claimed;
}
void mal_exit(void){
- int t = 0;
str err;
/*
@@ -325,16 +324,14 @@ void mal_exit(void){
}
#endif
/* deregister everything that was registered, ignore errors */
- if ((err = SABAOTHwildRetreat(&t)) != MAL_SUCCEED) {
+ if ((err = msab_wildRetreat()) != NULL) {
fprintf(stderr, "!%s", err);
- if (err != M5OutOfMemory)
- GDKfree(err);
+ free(err);
}
/* the server will now be shut down */
- if ((err = SABAOTHregisterStop(&t)) != MAL_SUCCEED) {
+ if ((err = msab_registerStop()) != NULL) {
fprintf(stderr, "!%s", err);
- if (err != M5OutOfMemory)
- GDKfree(err);
+ free(err);
}
GDKexit(0); /* properly end GDK */
}
diff --git a/monetdb5/mal/mal_sabaoth.c b/monetdb5/mal/mal_sabaoth.c
--- a/monetdb5/mal/mal_sabaoth.c
+++ b/monetdb5/mal/mal_sabaoth.c
@@ -180,11 +180,8 @@ str SABAOTHgetLocalConnection(str *ret)
* Commodore Amiga age.
*/
str SABAOTHwildRetreat(int *ret) {
- str err = msab_wildRetreat();
- if (err != NULL)
- excFromMem(MAL, "sabaoth.wildretreat", err);
- (void)ret;
- return(MAL_SUCCEED);
+ *ret = 0;
+ throw(MAL, "sabaoth.wildRetreat", "function no longer supported");
}
/**
@@ -192,11 +189,8 @@ str SABAOTHwildRetreat(int *ret) {
* the log at a later stage might reveal crashes of the server.
*/
str SABAOTHregisterStart(int *ret) {
- str err = msab_registerStart();
- if (err != NULL)
- excFromMem(MAL, "sabaoth.registerstart", err);
- (void)ret;
- return(MAL_SUCCEED);
+ *ret = 0;
+ throw(MAL, "sabaoth.registerStart", "function no longer supported");
}
/**
@@ -204,11 +198,8 @@ str SABAOTHregisterStart(int *ret) {
* the log at a later stage might reveal crashes of the server.
*/
str SABAOTHregisterStop(int *ret) {
- str err = msab_registerStop();
- if (err != NULL)
- excFromMem(MAL, "sabaoth.registerstop", err);
- (void)ret;
- return(MAL_SUCCEED);
+ *ret = 0;
+ throw(MAL, "sabaoth.registerStop", "function no longer supported");
}
/**
diff --git a/monetdb5/modules/mal/sabaoth.c b/monetdb5/modules/mal/sabaoth.c
--- a/monetdb5/modules/mal/sabaoth.c
+++ b/monetdb5/modules/mal/sabaoth.c
@@ -63,7 +63,7 @@ str SABprelude(int *ret) {
str SABepilogue(int *ret) {
(void)ret;
- return(SABAOTHwildRetreat(ret));
+ return(MAL_SUCCEED);
}
str SABmarchScenario(int *ret, str *lang){
@@ -176,5 +176,6 @@ str SABgetLocalConnectionPort(int *ret)
}
str SABwildRetreat(int *ret) {
- return SABAOTHwildRetreat(ret);
+ *ret = 0;
+ throw(MAL, "sabaoth.wildRetreat", "function no longer supported");
}
diff --git a/tools/merovingian/ChangeLog.Jul2012
b/tools/merovingian/ChangeLog.Jul2012
--- a/tools/merovingian/ChangeLog.Jul2012
+++ b/tools/merovingian/ChangeLog.Jul2012
@@ -1,6 +1,12 @@
# ChangeLog file for sql/src/backends/monet5/merovingian
# This file is updated with mchangelog
+* Thu Aug 2 2012 Fabian Groffen <[email protected]>
+- Starting a server now waits for as long as the server needs to possibly
+ recover, bug #3134. In case of a long wait, the monetdbd logfile
+ gives extra information on what the server is doing to recover.
+- Fixed a crash of monetdbd when local databases were unshared, bug #3135
+
* Wed Jul 18 2012 Fabian Groffen <[email protected]>
- Resolved a problem where automatic starting of a database initiated by
multiple clients at the same time could cause failed starts. Bug #3107
diff --git a/tools/merovingian/daemon/controlrunner.c
b/tools/merovingian/daemon/controlrunner.c
--- a/tools/merovingian/daemon/controlrunner.c
+++ b/tools/merovingian/daemon/controlrunner.c
@@ -731,6 +731,10 @@ static void ctl_handle_client(
}
for (topdb = stats; stats != NULL; stats =
stats->next) {
+ /* Jul2012 HACK: don't change the
remote interface,
+ * never return SABdbStarting */
+ if (stats->state == SABdbStarting)
+ stats->state = SABdbInactive;
/* currently never fails (just crashes)
*/
msab_serialise(&sdb, stats);
len = snprintf(buf2, sizeof(buf2),
diff --git a/tools/merovingian/daemon/discoveryrunner.c
b/tools/merovingian/daemon/discoveryrunner.c
--- a/tools/merovingian/daemon/discoveryrunner.c
+++ b/tools/merovingian/daemon/discoveryrunner.c
@@ -94,7 +94,11 @@ removeRemoteDB(const char *dbname, const
/* in the future, there may be more, so keep looking */
}
prv = rdb;
- rdb = rdb->next;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list