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

Reply via email to