summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2010-07-19 19:29:09 +0930
committerRusty Russell <rusty@rustcorp.com.au>2010-08-18 11:46:32 +0930
commit9fbb191b78a0cef008166fbc2bdad454735b8e1c (patch)
treec016891d655a2313e5421b1d44e06e297b695259
parent1a009aff73cd3fa0e9653c35581283bd4de614e3 (diff)
downloadsamba-9fbb191b78a0cef008166fbc2bdad454735b8e1c.tar.gz
samba-9fbb191b78a0cef008166fbc2bdad454735b8e1c.tar.xz
samba-9fbb191b78a0cef008166fbc2bdad454735b8e1c.zip
logging: give a unique logging name to each forked child.
This means we can distinguish which child is logging, esp. via syslog where we have no pid. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (This used to be ctdb commit 68b3761a0874429b90731741f0531f76dcfbb081)
-rw-r--r--ctdb/client/ctdb_client.c8
-rw-r--r--ctdb/common/ctdb_logging.c2
-rw-r--r--ctdb/include/ctdb_client.h3
-rw-r--r--ctdb/lib/util/debug.c4
-rw-r--r--ctdb/lib/util/debug.h1
-rw-r--r--ctdb/server/ctdb_freeze.c1
-rw-r--r--ctdb/server/ctdb_lockwait.c1
-rw-r--r--ctdb/server/ctdb_logging.c13
-rw-r--r--ctdb/server/ctdb_monitor.c1
-rw-r--r--ctdb/server/ctdb_persistent.c1
-rw-r--r--ctdb/server/ctdb_recover.c1
-rw-r--r--ctdb/server/ctdb_recoverd.c3
-rw-r--r--ctdb/server/ctdb_traverse.c2
-rw-r--r--ctdb/server/ctdb_vacuum.c2
-rw-r--r--ctdb/server/eventscript.c3
15 files changed, 35 insertions, 11 deletions
diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c
index adba17c2c1..82b7304075 100644
--- a/ctdb/client/ctdb_client.c
+++ b/ctdb/client/ctdb_client.c
@@ -3827,9 +3827,15 @@ int ctdb_ctrl_recd_ping(struct ctdb_context *ctdb)
* to the daemon as a client process, this function can be used to change
* the ctdb context from daemon into client mode
*/
-int switch_from_server_to_client(struct ctdb_context *ctdb)
+int switch_from_server_to_client(struct ctdb_context *ctdb, const char *fmt, ...)
{
int ret;
+ va_list ap;
+
+ /* Add extra information so we can identify this in the logs */
+ va_start(ap, fmt);
+ debug_extra = talloc_append_string(NULL, talloc_vasprintf(NULL, fmt, ap), ":");
+ va_end(ap);
/* shutdown the transport */
if (ctdb->methods) {
diff --git a/ctdb/common/ctdb_logging.c b/ctdb/common/ctdb_logging.c
index 18aafa2332..de29333582 100644
--- a/ctdb/common/ctdb_logging.c
+++ b/ctdb/common/ctdb_logging.c
@@ -164,7 +164,7 @@ int32_t ctdb_control_get_log(struct ctdb_context *ctdb, TDB_DATA addr)
}
if (child == 0) {
- if (switch_from_server_to_client(ctdb) != 0) {
+ if (switch_from_server_to_client(ctdb, "log-collector") != 0) {
DEBUG(DEBUG_CRIT, (__location__ "ERROR: failed to switch log collector child into client mode.\n"));
_exit(1);
}
diff --git a/ctdb/include/ctdb_client.h b/ctdb/include/ctdb_client.h
index e9aa8d17fb..b3b0d67516 100644
--- a/ctdb/include/ctdb_client.h
+++ b/ctdb/include/ctdb_client.h
@@ -551,7 +551,8 @@ int ctdb_transaction_commit(struct ctdb_transaction_handle *h);
int ctdb_ctrl_recd_ping(struct ctdb_context *ctdb);
-int switch_from_server_to_client(struct ctdb_context *ctdb);
+int switch_from_server_to_client(struct ctdb_context *ctdb, const char *fmt,
+ ...);
int ctdb_ctrl_getscriptstatus(struct ctdb_context *ctdb,
struct timeval timeout, uint32_t destnode,
diff --git a/ctdb/lib/util/debug.c b/ctdb/lib/util/debug.c
index 1cbaa230f1..e9365d88f6 100644
--- a/ctdb/lib/util/debug.c
+++ b/ctdb/lib/util/debug.c
@@ -42,13 +42,15 @@ static void _do_debug_v(const char *format, va_list ap)
strftime(tbuf,sizeof(tbuf)-1,"%Y/%m/%d %H:%M:%S", tm);
- fprintf(stderr, "%s.%06u [%5u]: %s", tbuf, (unsigned)t.tv_usec, (unsigned)getpid(), s);
+ fprintf(stderr, "%s.%06u [%s%5u]: %s", tbuf, (unsigned)t.tv_usec,
+ debug_extra, (unsigned)getpid(), s);
fflush(stderr);
free(s);
}
/* default logging function */
void (*do_debug_v)(const char *, va_list ap) = _do_debug_v;
+const char *debug_extra = "";
void do_debug(const char *format, ...)
{
diff --git a/ctdb/lib/util/debug.h b/ctdb/lib/util/debug.h
index 11ecb19786..27490a3dbf 100644
--- a/ctdb/lib/util/debug.h
+++ b/ctdb/lib/util/debug.h
@@ -18,6 +18,7 @@
*/
void (*do_debug_v)(const char *, va_list ap);
+const char *debug_extra;
void (*do_debug_add_v)(const char *, va_list ap);
void log_ringbuffer(const char *format, ...);
void do_debug(const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
diff --git a/ctdb/server/ctdb_freeze.c b/ctdb/server/ctdb_freeze.c
index e641ef3ae6..bf4c83e88b 100644
--- a/ctdb/server/ctdb_freeze.c
+++ b/ctdb/server/ctdb_freeze.c
@@ -202,6 +202,7 @@ static struct ctdb_freeze_handle *ctdb_freeze_lock(struct ctdb_context *ctdb, ui
/* in the child */
close(fd[0]);
+ debug_extra = talloc_asprintf(NULL, "freeze_lock-%u:", priority);
ret = ctdb_lock_all_databases(ctdb, priority);
if (ret != 0) {
_exit(0);
diff --git a/ctdb/server/ctdb_lockwait.c b/ctdb/server/ctdb_lockwait.c
index afbb921439..b7ae55c6c9 100644
--- a/ctdb/server/ctdb_lockwait.c
+++ b/ctdb/server/ctdb_lockwait.c
@@ -136,6 +136,7 @@ struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
if (result->child == 0) {
char c = 0;
close(result->fd[0]);
+ debug_extra = talloc_asprintf(NULL, "chainlock-%s:", ctdb_db->db_name);
tdb_chainlock(ctdb_db->ltdb->tdb, key);
write(result->fd[1], &c, 1);
/* make sure we die when our parent dies */
diff --git a/ctdb/server/ctdb_logging.c b/ctdb/server/ctdb_logging.c
index 807bb179e0..880f844f85 100644
--- a/ctdb/server/ctdb_logging.c
+++ b/ctdb/server/ctdb_logging.c
@@ -115,6 +115,7 @@ int start_syslog_daemon(struct ctdb_context *ctdb)
return 0;
}
+ debug_extra = talloc_asprintf(NULL, "syslogd:");
talloc_free(ctdb->ev);
ctdb->ev = event_context_init(NULL);
@@ -213,15 +214,16 @@ static void ctdb_syslog_log(const char *format, va_list ap)
break;
}
- len = offsetof(struct syslog_message, message) + strlen(s) + 1;
+ len = offsetof(struct syslog_message, message) + strlen(debug_extra) + strlen(s) + 1;
msg = malloc(len);
if (msg == NULL) {
free(s);
return;
}
msg->level = level;
- msg->len = strlen(s);
- strcpy(msg->message, s);
+ msg->len = strlen(debug_extra) + strlen(s);
+ strcpy(msg->message, debug_extra);
+ strcat(msg->message, s);
if (syslogd_is_started == 0) {
syslog(msg->level, "%s", msg->message);
@@ -275,8 +277,9 @@ static void ctdb_logfile_log(const char *format, va_list ap)
strftime(tbuf,sizeof(tbuf)-1,"%Y/%m/%d %H:%M:%S", tm);
- ret = asprintf(&s2, "%s.%06u [%5u]: %s",
- tbuf, (unsigned)t.tv_usec, (unsigned)getpid(), s);
+ ret = asprintf(&s2, "%s.%06u [%s%5u]: %s",
+ tbuf, (unsigned)t.tv_usec,
+ debug_extra, (unsigned)getpid(), s);
free(s);
if (ret == -1) {
const char *errstr = "asprintf failed\n";
diff --git a/ctdb/server/ctdb_monitor.c b/ctdb/server/ctdb_monitor.c
index 3343501624..55cd4e3842 100644
--- a/ctdb/server/ctdb_monitor.c
+++ b/ctdb/server/ctdb_monitor.c
@@ -91,6 +91,7 @@ void ctdb_run_notification_script(struct ctdb_context *ctdb, const char *event)
if (child == 0) {
int ret;
+ debug_extra = talloc_asprintf(NULL, "notification-%s:", event);
ret = ctdb_run_notification_script_child(ctdb, event);
if (ret != 0) {
DEBUG(DEBUG_ERR,(__location__ " Notification script failed\n"));
diff --git a/ctdb/server/ctdb_persistent.c b/ctdb/server/ctdb_persistent.c
index d38aa8d9e7..4401bcda6b 100644
--- a/ctdb/server/ctdb_persistent.c
+++ b/ctdb/server/ctdb_persistent.c
@@ -543,6 +543,7 @@ struct childwrite_handle *ctdb_childwrite(struct ctdb_db_context *ctdb_db,
char c = 0;
close(result->fd[0]);
+ debug_extra = talloc_asprintf(NULL, "childwrite-%s:", ctdb_db->db_name);
ret = ctdb_persistent_store(state);
if (ret != 0) {
DEBUG(DEBUG_ERR, (__location__ " Failed to write persistent data\n"));
diff --git a/ctdb/server/ctdb_recover.c b/ctdb/server/ctdb_recover.c
index 22e48986f4..f61b6e7b6f 100644
--- a/ctdb/server/ctdb_recover.c
+++ b/ctdb/server/ctdb_recover.c
@@ -725,6 +725,7 @@ int32_t ctdb_control_set_recmode(struct ctdb_context *ctdb,
char cc = 0;
close(state->fd[0]);
+ debug_extra = talloc_asprintf(NULL, "set_recmode:");
/* we should not be able to get the lock on the reclock file,
as it should be held by the recovery master
*/
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c
index 82fe62ea2d..3145cd0712 100644
--- a/ctdb/server/ctdb_recoverd.c
+++ b/ctdb/server/ctdb_recoverd.c
@@ -2774,6 +2774,7 @@ static int check_recovery_lock(struct ctdb_context *ctdb)
close(state->fd[0]);
state->fd[0] = -1;
+ debug_extra = talloc_asprintf(NULL, "recovery-lock:");
if (pread(ctdb->recovery_lock_fd, &cc, 1, 0) == -1) {
DEBUG(DEBUG_CRIT,("failed read from recovery_lock_fd - %s\n", strerror(errno)));
cc = RECLOCK_FAILED;
@@ -3582,7 +3583,7 @@ int ctdb_start_recoverd(struct ctdb_context *ctdb)
srandom(getpid() ^ time(NULL));
- if (switch_from_server_to_client(ctdb) != 0) {
+ if (switch_from_server_to_client(ctdb, "recoverd") != 0) {
DEBUG(DEBUG_CRIT, (__location__ "ERROR: failed to switch recovery daemon into client mode. shutting down.\n"));
exit(1);
}
diff --git a/ctdb/server/ctdb_traverse.c b/ctdb/server/ctdb_traverse.c
index 3549007cfa..52c2f709a7 100644
--- a/ctdb/server/ctdb_traverse.c
+++ b/ctdb/server/ctdb_traverse.c
@@ -171,6 +171,8 @@ static struct ctdb_traverse_local_handle *ctdb_traverse_local(struct ctdb_db_con
if (h->child == 0) {
/* start the traverse in the child */
close(h->fd[0]);
+ debug_extra = talloc_asprintf(NULL, "traverse_local-%s:",
+ ctdb_db->db_name);
tdb_traverse_read(ctdb_db->ltdb->tdb, ctdb_traverse_local_fn, h);
_exit(0);
}
diff --git a/ctdb/server/ctdb_vacuum.c b/ctdb/server/ctdb_vacuum.c
index f1e61dbf11..375d4eff6c 100644
--- a/ctdb/server/ctdb_vacuum.c
+++ b/ctdb/server/ctdb_vacuum.c
@@ -841,7 +841,7 @@ ctdb_vacuum_event(struct event_context *ev, struct timed_event *te,
DEBUG(DEBUG_INFO,("Vacuuming child process %d for db %s started\n", getpid(), ctdb_db->db_name));
- if (switch_from_server_to_client(ctdb) != 0) {
+ if (switch_from_server_to_client(ctdb, "vacuum-%s", ctdb_db->db_name) != 0) {
DEBUG(DEBUG_CRIT, (__location__ "ERROR: failed to switch vacuum daemon into client mode. Shutting down.\n"));
_exit(1);
}
diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c
index 8011269e26..c4ffd26285 100644
--- a/ctdb/server/eventscript.c
+++ b/ctdb/server/eventscript.c
@@ -385,6 +385,9 @@ static int fork_child_for_script(struct ctdb_context *ctdb,
if (state->child == 0) {
int rt;
+ debug_extra = talloc_asprintf(NULL, "eventscript-%s-%s:",
+ current->name,
+ ctdb_eventscript_call_names[state->call]);
close(state->fd[0]);
set_close_on_exec(state->fd[1]);