Changeset: 9b84e1041db3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9b84e1041db3
Modified Files:
        gdk/ChangeLog.Jan2022
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        monetdb5/ChangeLog.Jan2022
        monetdb5/mal/mal_profiler.c
        tools/merovingian/ChangeLog.Jan2022
        tools/merovingian/daemon/connections.c
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/multiplex-funnel.c
Branch: Jan2022
Log Message:

Merge with Jul2021 branch.


diffs (truncated from 639 to 300 lines):

diff --git a/gdk/ChangeLog.Jan2022 b/gdk/ChangeLog.Jan2022
--- a/gdk/ChangeLog.Jan2022
+++ b/gdk/ChangeLog.Jan2022
@@ -1,3 +1,18 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Wed Jun 22 2022 Sjoerd Mullender <[email protected]>
+- Make sure heap files of transient bats get deleted when the bat is
+  destroyed.  If the bat was a partial view (sharing the vheap but not
+  the tail), the tail file wasn't deleted.
+- Various changes were made to satisfy newer compilers.
+- The batDirtydesc and batDirtyflushed Boolean values have been deprecated
+  and are no longer used.  They were both holdovers from long ago.
+- Various race conditions (data races) have been fixed.
+
+* Thu May 19 2022 Sjoerd Mullender <[email protected]>
+- All accesses to the BACKUP directory need to be protected by the
+  same lock.  The lock already existed (GDKtmLock), but wasn't used
+  consistently.  This is now fixed.  Hopefully this makes the hot snapshot
+  code more reliable.
+
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2815,7 +2815,6 @@ PROPdestroy_nolock(BAT *b)
 
        b->tprops = NULL;
        while (p) {
-               /* only set dirty if a saved property is changed */
                n = p->next;
                VALclear(&p->v);
                GDKfree(p);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3628,7 +3628,6 @@ do_backup(const char *srcdir, const char
        char extnew[16];
        bool istail = strncmp(ext, "tail", 4) == 0;
 
-       h->dirty |= dirty;
        if (h->wasempty) {
                return GDK_SUCCEED;
        }
diff --git a/monetdb5/ChangeLog.Jan2022 b/monetdb5/ChangeLog.Jan2022
--- a/monetdb5/ChangeLog.Jan2022
+++ b/monetdb5/ChangeLog.Jan2022
@@ -1,3 +1,6 @@
 # ChangeLog file for MonetDB5
 # This file is updated with Maddlog
 
+* Wed Jun 22 2022 Sjoerd Mullender <[email protected]>
+- Various race conditions (data races) have been fixed.
+
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -36,12 +36,13 @@ static const char *myname = 0;      // avoid 
 /* The JSON rendering can be either using '\n' separators between
  * each key:value pair or as a single line.
  * The current stethoscope implementation requires the first option and
- * also the term rendering  to be set to ''
+ * also the term rendering to be set to ''
  */
 
 /* When the MAL block contains a BARRIER block we may end up with tons
  * of profiler events. To avoid this, we stop emitting the events
- * when we reached the HIGHWATERMARK. Leaving a message in the log. */
+ * when we reached the HIGHWATERMARK. Leaving a message in the log.
+ */
 #define HIGHWATERMARK 5
 
 
@@ -66,7 +67,7 @@ static void logjsonInternal(char *logbuf
        len = strlen(logbuffer);
 
        if (maleventstream) {
-       // upon request the log record is sent over the profile stream
+               // upon request the log record is sent over the profile stream
                (void) mnstr_write(maleventstream, logbuffer, 1, len);
                if (flush)
                        (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA);
@@ -170,17 +171,17 @@ logadd(struct logbuf *logbuf, const char
 
 /* JSON rendering method of performance data.
  * The eventparser may assume this layout for ease of parsing
-EXAMPLE:
-{
-"event":6        ,
-"thread":3,
-"function":"user.s3_1",
-"pc":1,
-"tag":10397,
-"state":"start",
-"usec":0,
-}
-"stmt":"X_41=0@0:void := querylog.define(\"select count(*) from 
tables;\":str,\"default_pipe\":str,30:int);",
+ EXAMPLE:
+ {
+ "event":6        ,
+ "thread":3,
+ "function":"user.s3_1",
+ "pc":1,
+ "tag":10397,
+ "state":"start",
+ "usec":0,
+ }
+ "stmt":"X_41=0@0:void := querylog.define(\"select count(*) from 
tables;\":str,\"default_pipe\":str,30:int);",
 */
 static str
 prepareProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
int start)
@@ -203,9 +204,9 @@ prepareProfilerEvent(Client cntxt, MalBl
                return NULL;
        }
 
-/* The stream of events can be complete read by the DBA,
- * all other users can only see events assigned to their account
- */
+       /* The stream of events can be complete read by the DBA,
+        * all other users can only see events assigned to their account
+        */
        if(malprofileruser!= MAL_ADMIN && malprofileruser != cntxt->user)
                return NULL;
 
diff --git a/tools/merovingian/ChangeLog.Jan2022 
b/tools/merovingian/ChangeLog.Jan2022
--- a/tools/merovingian/ChangeLog.Jan2022
+++ b/tools/merovingian/ChangeLog.Jan2022
@@ -1,3 +1,18 @@
 # ChangeLog file for sql/src/backends/monet5/merovingian
 # This file is updated with mchangelog
 
+* Thu Jun 23 2022 Sjoerd Mullender <[email protected]>
+- When multiple identical messages are written to the log, write the
+  first one, and combine subsequent ones in a single message.
+
+* Wed Jun 22 2022 Sjoerd Mullender <[email protected]>
+- Fixed a leak where the log file wasn't closed when it was reopened
+  after a log rotation (SIGHUP signal).
+- Try to deal more gracefully with "inherited" mserver5 processes.
+  This includes not complaining about an "impossible state", and allowing
+  such processes to be stopped by the monetdbd process.
+- When a transient failure occurs during processing of a new connection to
+  the monetdbd server, sleep for half a second so that if the transient
+  failure occurs again, the log file doesn't get swamped with error
+  messages.
+
diff --git a/tools/merovingian/daemon/connections.c 
b/tools/merovingian/daemon/connections.c
--- a/tools/merovingian/daemon/connections.c
+++ b/tools/merovingian/daemon/connections.c
@@ -96,13 +96,13 @@ openConnectionIP(int *socks, bool udp, c
                        }
 #if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
                        if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0)
-                                       Mfprintf(log, "fcntl FD_CLOEXEC: %s", 
strerror(e));
+                                       Mfprintf(log, "fcntl FD_CLOEXEC: %s\n", 
strerror(e));
 #endif
 
                        if (rp->ai_family == AF_INET6 &&
                                setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
                                                   (const char *) &(int){0}, 
sizeof(int)) == -1)
-                               Mfprintf(log, "setsockopt IPV6_V6ONLY: %s", 
strerror(e));
+                               Mfprintf(log, "setsockopt IPV6_V6ONLY: %s\n", 
strerror(e));
 
                        if (!udp) {
                                if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
@@ -114,12 +114,12 @@ openConnectionIP(int *socks, bool udp, c
 #ifdef SO_EXCLUSIVEADDRUSE
                                if (setsockopt(sock, SOL_SOCKET, 
SO_EXCLUSIVEADDRUSE,
                                                           (const char *) &on, 
sizeof on) < 0)
-                                       Mfprintf(log, "setsockopt 
SO_EXCLUSIVEADDRUSE: %s", strerror(e));
+                                       Mfprintf(log, "setsockopt 
SO_EXCLUSIVEADDRUSE: %s\n", strerror(e));
 #endif
 #ifdef SO_EXCLBIND
                                if (setsockopt(sock, SOL_SOCKET, SO_EXCLBIND,
                                                           (const char *) &on, 
sizeof on) < 0)
-                                       Mfprintf(log, "setsockopt SO_EXCLBIND: 
%s", strerror(e));
+                                       Mfprintf(log, "setsockopt SO_EXCLBIND: 
%s\n", strerror(e));
 #endif
                        }
 
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
@@ -676,7 +676,7 @@ static void ctl_handle_client(
                                Mfprintf(_mero_ctlout, "Start snapshot of 
database '%s' to file '%s'\n", q, dest);
                                char *e = snapshot_database_to(q, dest);
                                if (e != NULL) {
-                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
database '%s' to %s failed: %s",
+                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
database '%s' to %s failed: %s\n",
                                                origin, q, dest, getErrMsg(e));
                                        len = snprintf(buf2, sizeof(buf2), 
"%s\n", getErrMsg(e));
                                        send_client("!");
@@ -691,7 +691,7 @@ static void ctl_handle_client(
                                char *dest = NULL;
                                char *e = snapshot_default_filename(&dest, q);
                                if (e != NULL) {
-                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
database '%s': %s",
+                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
database '%s': %s\n",
                                                origin, q, getErrMsg(e));
                                        len = snprintf(buf2, sizeof(buf2), 
"%s\n", getErrMsg(e));
                                        send_client("!");
@@ -700,7 +700,7 @@ static void ctl_handle_client(
                                        Mfprintf(_mero_ctlout, "Start snapshot 
of database '%s' to file '%s'\n", q, dest);
                                        e = snapshot_database_to(q, dest);
                                        if (e != NULL) {
-                                               Mfprintf(_mero_ctlerr, "%s: 
snapshot database '%s' to %s failed: %s",
+                                               Mfprintf(_mero_ctlerr, "%s: 
snapshot database '%s' to %s failed: %s\n",
                                                        origin, q, dest, 
getErrMsg(e));
                                                len = snprintf(buf2, 
sizeof(buf2), "%s\n", getErrMsg(e));
                                                send_client("!");
@@ -750,7 +750,7 @@ static void ctl_handle_client(
                                if (wrapper)
                                        mnstr_destroy(wrapper);
                                if (e != NULL) {
-                                       Mfprintf(_mero_ctlerr, "%s: streaming 
snapshot database '%s' failed: %s",
+                                       Mfprintf(_mero_ctlerr, "%s: streaming 
snapshot database '%s' failed: %s\n",
                                                origin, q, getErrMsg(e));
                                        len = snprintf(buf2, sizeof(buf2), 
"%s\n", getErrMsg(e));
                                        send_client("!");
@@ -767,7 +767,7 @@ static void ctl_handle_client(
                                Mfprintf(_mero_ctlout, "Start restore snapshot 
of database '%s' from file '%s'\n", q, source);
                                char *e = snapshot_restore_from(q, source);
                                if (e != NULL) {
-                                       Mfprintf(_mero_ctlerr, "%s: restore  
database '%s' from snapshot %s failed: %s",
+                                       Mfprintf(_mero_ctlerr, "%s: restore  
database '%s' from snapshot %s failed: %s\n",
                                                origin, q, source, 
getErrMsg(e));
                                        len = snprintf(buf2, sizeof(buf2), 
"%s\n", getErrMsg(e));
                                        send_client("!");
@@ -797,7 +797,7 @@ static void ctl_handle_client(
                                struct snapshot *snaps = NULL;
                                char *e = snapshot_list(&nsnaps, &snaps);
                                if (e != NULL) {
-                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
list failed: %s", origin, getErrMsg(e));
+                                       Mfprintf(_mero_ctlerr, "%s: snapshot 
list failed: %s\n", origin, getErrMsg(e));
                                        len = snprintf(buf2, sizeof(buf2), 
"%s\n", getErrMsg(e));
                                        send_client("!");
                                        freeErr(e);
@@ -1175,7 +1175,7 @@ controlRunner(void *d)
 
        do {
                if ((p = malloc(sizeof(int))) == NULL) {
-                       Mfprintf(_mero_ctlerr, "malloc failed");
+                       Mfprintf(_mero_ctlerr, "malloc failed\n");
                        break;
                }
                /* limit waiting time in order to check whether we need to exit 
*/
@@ -1221,7 +1221,7 @@ controlRunner(void *d)
                        case ENOBUFS:
                        case ENOMEM:
                                /* transient failure, wait a little and 
continue */
-                               Mfprintf(_mero_ctlerr, "error during accept: 
%s",
+                               Mfprintf(_mero_ctlerr, "error during accept: 
%s\n",
                                                strerror(errno));
                                sleep_ms(500);
                                break;
@@ -1230,7 +1230,7 @@ controlRunner(void *d)
                                break;
                        default:
                                /* anything else */
-                               Mfprintf(_mero_ctlerr, "error during accept: 
%s",
+                               Mfprintf(_mero_ctlerr, "error during accept: 
%s\n",
                                                strerror(errno));
                                break;
                        }
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
@@ -393,8 +393,8 @@ forkMserver(const char *database, sabdb*
                /* fill in the rest of the dpair entry */
                pthread_mutex_lock(&_mero_topdp_lock);
 
-               dp->out = pfdo[0];
-               dp->err = pfde[0];
+               dp->input[0].fd = pfdo[0];
+               dp->input[1].fd = pfde[0];
                dp->type = MEROFUN;
                dp->pid = getpid();
                dp->flag = 0;
@@ -745,9 +745,9 @@ forkMserver(const char *database, sabdb*
                exit(1);
        } else if (pid > 0) {
                /* parent: fine, let's add the pipes for this child */
-               dp->out = pfdo[0];
+               dp->input[0].fd = pfdo[0];
                close(pfdo[1]);
-               dp->err = pfde[0];
+               dp->input[1].fd = pfde[0];
                close(pfde[1]);
                dp->type = MERODB;
                dp->pid = pid;
diff --git a/tools/merovingian/daemon/handlers.c 
b/tools/merovingian/daemon/handlers.c
--- a/tools/merovingian/daemon/handlers.c
+++ b/tools/merovingian/daemon/handlers.c
@@ -250,14 +250,14 @@ void reinitialize(void)
                                "caught SIGHUP, closing logfile\n",
                                mytime, (long long int)_mero_topdp->next->pid);
                fflush(_mero_logfile);
-               _mero_topdp->out = _mero_topdp->err = t;
+               _mero_topdp->input[0].fd = _mero_topdp->input[1].fd = t;
                FILE *f = _mero_logfile;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to