Changeset: c80e7f4d832d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c80e7f4d832d
Modified Files:
        tools/merovingian/ChangeLog.Mar2025
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/merovingian.h
Branch: Mar2025
Log Message:

Implemented a crash counter in monetdbd.


diffs (64 lines):

diff --git a/tools/merovingian/ChangeLog.Mar2025 
b/tools/merovingian/ChangeLog.Mar2025
--- a/tools/merovingian/ChangeLog.Mar2025
+++ b/tools/merovingian/ChangeLog.Mar2025
@@ -1,3 +1,11 @@
 # ChangeLog file for sql/src/backends/monet5/merovingian
 # This file is updated with mchangelog
 
+* Thu May 22 2025 Sjoerd Mullender <[email protected]>
+- When mserver5 is started by monetdbd due to an implicit request
+  (application trying to connect to a database), and mserver5 crashes
+  or exits before a connection can be established, monetdbd will stop
+  trying to start the server after a few attempts.  When using an explicit
+  command to start the server (using monetdb start), monetdbd will always
+  attempt to start the server.
+
diff --git a/tools/merovingian/daemon/forkmserver.c 
b/tools/merovingian/daemon/forkmserver.c
--- a/tools/merovingian/daemon/forkmserver.c
+++ b/tools/merovingian/daemon/forkmserver.c
@@ -322,6 +322,14 @@ forkMserver(const char *database, sabdb*
                pthread_mutex_unlock(&dp->fork_lock);
                return(NO_ERR);
        case SABdbCrashed:
+               if (!force && dp->crashcount > 4) {
+                       state = (*stats)->state;
+                       msab_freeStatus(stats);
+                       freeConfFile(ckv);
+                       free(ckv);
+                       pthread_mutex_unlock(&dp->fork_lock);
+                       return newErr("too many startup failures for database 
%s: fix database and try `monetdb start %s'", database, database);
+               }
                t = localtime(&info.lastcrash);
                strftime(tstr, sizeof(tstr), "%Y-%m-%d %H:%M:%S", t);
                secondsToString(upmin, info.minuptime, 1);
@@ -809,6 +817,10 @@ forkMserver(const char *database, sabdb*
                if (dp->pid == -1) {
                        state = (*stats)->state;
 
+                       /* do this while we still have the lock */
+                       if (!force)
+                               dp->crashcount++;
+
                        pthread_mutex_unlock(&_mero_topdp_lock);
                        pthread_mutex_unlock(&dp->fork_lock);
 
@@ -851,6 +863,8 @@ forkMserver(const char *database, sabdb*
                        }
                }
 
+               dp->crashcount = 0;
+
                pthread_mutex_unlock(&_mero_topdp_lock);
                pthread_mutex_unlock(&dp->fork_lock);
 
diff --git a/tools/merovingian/daemon/merovingian.h 
b/tools/merovingian/daemon/merovingian.h
--- a/tools/merovingian/daemon/merovingian.h
+++ b/tools/merovingian/daemon/merovingian.h
@@ -51,6 +51,7 @@ typedef struct _dpair {
        } input[2];
        mtype type;       /* type of process */
        short flag;               /* flag internal to logListener */
+       short crashcount; /* number of crashes during startup */
        pid_t pid;        /* this process' id */
        char *dbname;     /* the database that this server serves */
        pthread_mutex_t fork_lock;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to