changeset 21288:9316919c5932

dsync: Improve process title during initialization If something is hanging, this should make it clear what exactly it is.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 12 Dec 2016 12:53:36 +0200
parents 82b29b67b6f8
children 08eec0b1aae6
files src/doveadm/doveadm-dsync.c src/doveadm/dsync/dsync-brain.c
diffstat 2 files changed, 44 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-dsync.c	Mon Dec 12 12:42:53 2016 +0200
+++ b/src/doveadm/doveadm-dsync.c	Mon Dec 12 12:53:36 2016 +0200
@@ -14,6 +14,7 @@
 #include "str.h"
 #include "strescape.h"
 #include "var-expand.h"
+#include "process-title.h"
 #include "settings-parser.h"
 #include "imap-util.h"
 #include "master-service.h"
@@ -806,6 +807,10 @@
 
 	ioloop = io_loop_create();
 
+	if (doveadm_verbose_proctitle) {
+		process_title_set(t_strdup_printf(
+			"[dsync - connecting to %s]", server->name));
+	}
 	if (server_connection_create(server, &conn) < 0) {
 		*error_r = "Couldn't create server connection";
 		return -1;
@@ -823,6 +828,11 @@
 		str_append(cmd, "\t-U");
 	str_append_c(cmd, '\n');
 
+	if (doveadm_verbose_proctitle) {
+		process_title_set(t_strdup_printf(
+			"[dsync - running dsync-server on %s]", server->name));
+	}
+
 	ctx->tcp_conn = conn;
 	server_connection_cmd(conn, str_c(cmd), NULL,
 			      dsync_connected_callback, ctx);
--- a/src/doveadm/dsync/dsync-brain.c	Mon Dec 12 12:42:53 2016 +0200
+++ b/src/doveadm/dsync/dsync-brain.c	Mon Dec 12 12:53:36 2016 +0200
@@ -18,6 +18,11 @@
 
 #include <sys/stat.h>
 
+enum dsync_brain_title {
+	DSYNC_BRAIN_TITLE_NONE = 0,
+	DSYNC_BRAIN_TITLE_LOCKING,
+};
+
 static const char *dsync_state_names[] = {
 	"master_recv_handshake",
 	"slave_recv_handshake",
@@ -36,7 +41,9 @@
 
 static void dsync_brain_mailbox_states_dump(struct dsync_brain *brain);
 
-static const char *dsync_brain_get_proctitle(struct dsync_brain *brain)
+static const char *
+dsync_brain_get_proctitle_full(struct dsync_brain *brain,
+			       enum dsync_brain_title title)
 {
 	string_t *str = t_str_new(128);
 	const char *import_title, *export_title;
@@ -70,10 +77,22 @@
 			}
 		}
 	}
+	switch (title) {
+	case DSYNC_BRAIN_TITLE_NONE:
+		break;
+	case DSYNC_BRAIN_TITLE_LOCKING:
+		str_append(str, " locking "DSYNC_LOCK_FILENAME);
+		break;
+	}
 	str_append_c(str, ']');
 	return str_c(str);
 }
 
+static const char *dsync_brain_get_proctitle(struct dsync_brain *brain)
+{
+	return dsync_brain_get_proctitle_full(brain, DSYNC_BRAIN_TITLE_NONE);
+}
+
 static void dsync_brain_run_io(void *context)
 {
 	struct dsync_brain *brain = context;
@@ -251,6 +270,9 @@
 
 	dsync_ibc_set_io_callback(ibc, dsync_brain_run_io, brain);
 	brain->state = DSYNC_STATE_MASTER_RECV_HANDSHAKE;
+
+	if (brain->verbose_proctitle)
+		process_title_set(dsync_brain_get_proctitle(brain));
 	return brain;
 }
 
@@ -277,6 +299,8 @@
 	ibc_set.hostname = my_hostdomain();
 	dsync_ibc_send_handshake(ibc, &ibc_set);
 
+	if (brain->verbose_proctitle)
+		process_title_set(dsync_brain_get_proctitle(brain));
 	dsync_ibc_set_io_callback(ibc, dsync_brain_run_io, brain);
 	return brain;
 }
@@ -380,6 +404,8 @@
 		return -1;
 	}
 
+	if (brain->verbose_proctitle)
+		process_title_set(dsync_brain_get_proctitle_full(brain, DSYNC_BRAIN_TITLE_LOCKING));
 	brain->lock_path = p_strconcat(brain->pool, home,
 				       "/"DSYNC_LOCK_FILENAME, NULL);
 	for (;;) {
@@ -387,7 +413,7 @@
 		if (brain->lock_fd == -1) {
 			i_error("Couldn't create lock %s: %m",
 				brain->lock_path);
-			return -1;
+			break;
 		}
 
 		if (file_wait_lock(brain->lock_fd, brain->lock_path, F_WRLCK,
@@ -413,12 +439,17 @@
 			}
 		} else if (st1.st_ino == st2.st_ino) {
 			/* success */
+			if (brain->verbose_proctitle)
+				process_title_set(dsync_brain_get_proctitle(brain));
 			return 0;
 		}
 		/* file was recreated, try again */
 		i_close_fd(&brain->lock_fd);
 	}
-	i_close_fd(&brain->lock_fd);
+	if (brain->lock_fd != -1)
+		i_close_fd(&brain->lock_fd);
+	if (brain->verbose_proctitle)
+		process_title_set(dsync_brain_get_proctitle(brain));
 	return -1;
 }