[libmultipath] Fix debugging output
authorHannes Reinecke <hare@suse.de>
Mon, 30 Apr 2007 07:23:46 +0000 (09:23 +0200)
committerChristophe Varoqui <cvaroqui@zezette.localdomain>
Mon, 21 May 2007 21:25:13 +0000 (23:25 +0200)
Implement a proper output function for libdevmapper which ties
into our verbosity level. This allows us for a finer grained
control about the error messages from libdevmapper and we get
better debugging output to boot.

Signed-off-by: Stefan Bader <bader@de.ibm.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/configure.c
libmultipath/debug.c
libmultipath/debug.h
libmultipath/devmapper.c
libmultipath/devmapper.h
libmultipath/log_pthread.c
libmultipath/log_pthread.h
libmultipath/structs_vec.c
libmultipath/waiter.c
multipath/main.c
multipathd/main.c

index 9632fb4..a5bad4c 100644 (file)
@@ -324,7 +324,6 @@ domap (struct multipath * mpp)
                                mpp->alias);
                        return DOMAP_RETRY;
                }
-               dm_shut_log();
 
                if (dm_map_present(mpp->alias))
                        break;
@@ -345,7 +344,6 @@ domap (struct multipath * mpp)
                }
 
                lock_multipath(mpp, 0);
-               dm_restore_log();
                break;
 
        case ACT_RELOAD:
index fa06cbd..05dfb06 100644 (file)
@@ -14,7 +14,7 @@
 #include "vector.h"
 #include "config.h"
 
-void dlog (int sink, int prio, char * fmt, ...)
+void dlog (int sink, int prio, const char * fmt, ...)
 {
        va_list ap;
        int thres;
index 74ed531..082fff1 100644 (file)
@@ -1,4 +1,4 @@
-void dlog (int sink, int prio, char * fmt, ...)
+void dlog (int sink, int prio, const char * fmt, ...)
        __attribute__((format(printf, 3, 4)));
 
 #if DAEMON
index dece079..d762cc1 100644 (file)
 #include "debug.h"
 #include "memory.h"
 #include "devmapper.h"
+#include "config.h"
+
+#if DAEMON
+#include "log_pthread.h"
+#include <sys/types.h>
+#include <time.h>
+#endif
 
 #define MAX_WAIT 5
 #define LOOPS_PER_SEC 5
 #define UUID_PREFIX_LEN 6
 
 static void
-dm_dummy_log (int level, const char *file, int line, const char *f, ...)
+dm_write_log (int level, const char *file, int line, const char *f, ...)
 {
-       return;
-}
+       va_list ap;
+       int thres;
+
+       if (level > 6)
+               level = 6;
+
+       thres = (conf) ? conf->verbosity : 0;
+       if (thres <= 3 || level > thres)
+               return;
+
+        va_start(ap, f);
+#if DAEMON
+       if (!logsink) {
+               time_t t = time(NULL);
+               struct tm *tb = localtime(&t);
+               char buff[16];
+
+               strftime(buff, sizeof(buff), "%b %d %H:%M:%S", tb);
+               buff[sizeof(buff)-1] = '\0';
+
+               fprintf(stdout, "%s | ", buff);
+               fprintf(stdout, "libdevmapper: %s(%i): ", file, line);
+               vfprintf(stdout, f, ap);
+               fprintf(stdout, "\n");
+       } else {
+               condlog(level, "libdevmapper: %s(%i): ", file, line);
+               log_safe(level + 3, f, ap);
+       }
+#else
+       fprintf(stdout, "libdevmapper: %s(%i): ", file, line);
+       vfprintf(stdout, f, ap);
+       fprintf(stdout, "\n");
+#endif
+        va_end(ap);
 
-void
-dm_restore_log (void)
-{
-       dm_log_init(NULL);
+       return;
 }
 
-void
-dm_shut_log (void)
-{
-       dm_log_init(&dm_dummy_log);
+extern void
+dm_init(void) {
+       dm_log_init(&dm_write_log);
+       dm_log_init_verbose(conf ? conf->verbosity + 3 : 0);
 }
 
 static int
@@ -764,9 +800,7 @@ dm_mapname(int major, int minor)
         * daemon uev_trigger -> uev_add_map
         */
        while (--loop) {
-               dm_shut_log();
                r = dm_task_run(dmt);
-               dm_restore_log();
 
                if (r)
                        break;
index 59afd01..8438034 100644 (file)
@@ -1,5 +1,4 @@
-void dm_shut_log(void);
-void dm_restore_log(void);
+void dm_init(void);
 int dm_prereq (char *);
 int dm_simplecmd (int, const char *);
 int dm_addmap (int, const char *, const char *, const char *,
index f98cfa4..5a82b6a 100644 (file)
@@ -12,7 +12,7 @@
 #include "log_pthread.h"
 #include "log.h"
 
-void log_safe (int prio, char * fmt, va_list ap)
+void log_safe (int prio, const char * fmt, va_list ap)
 {
        pthread_mutex_lock(logq_lock);
        //va_start(ap, fmt);
index 7c902c7..2b18f59 100644 (file)
@@ -7,7 +7,7 @@ pthread_mutex_t *logq_lock;
 pthread_mutex_t *logev_lock;
 pthread_cond_t *logev_cond;
 
-void log_safe(int prio, char * fmt, va_list ap);
+void log_safe(int prio, const char * fmt, va_list ap);
 void log_thread_start(void);
 void log_thread_stop(void);
 
index 53b7e17..a4a996a 100644 (file)
@@ -16,7 +16,6 @@
 #include "discovery.h"
 #include "waiter.h"
 
-
 /*
  * creates or updates mpp->paths reading mpp->pg
  */
@@ -118,6 +117,8 @@ remove_map (struct multipath * mpp, struct vectors * vecs,
 {
        int i;
 
+       condlog(4, "%s: remove multipath map", mpp->alias);
+
        /*
         * stop the DM event waiter thread
         */
@@ -245,8 +246,17 @@ extern int
 setup_multipath (struct vectors * vecs, struct multipath * mpp)
 {
 retry:
-       if (dm_get_info(mpp->alias, &mpp->dmi))
+       if (dm_get_info(mpp->alias, &mpp->dmi)) {
+               /* Error accessing table */
+               condlog(3, "%s: cannot access table", mpp->alias); 
+               goto out;
+       }
+
+       if (!dm_map_present(mpp->alias)) {
+               /* Table has been removed */
+               condlog(3, "%s: table does not exist", mpp->alias); 
                goto out;
+       }
 
        set_multipath_wwid(mpp);
        mpp->mpe = find_mpe(mpp->wwid);
@@ -270,6 +280,7 @@ retry:
 #endif
                        goto retry;
                }
+               condlog(0, "%s: failed to setup multipath", mpp->alias);
                goto out;
        }
 
@@ -282,7 +293,6 @@ retry:
 
        return 0;
 out:
-       condlog(0, "%s: failed to setup multipath", mpp->alias);
        remove_map(mpp, vecs, NULL, 1);
        return 1;
 }
@@ -390,18 +400,19 @@ int update_multipath (struct vectors *vecs, char *mapname)
        struct pathgroup  *pgp;
        struct path *pp;
        int i, j;
-       int r = 1;
 
        mpp = find_mp_by_alias(vecs->mpvec, mapname);
 
-       if (!mpp)
-               goto out;
+       if (!mpp) {
+               condlog(3, "%s: multipath map not found\n", mapname);
+               return 2;
+       }
 
        free_pgvec(mpp->pg, KEEP_PATHS);
        mpp->pg = NULL;
 
        if (setup_multipath(vecs, mpp))
-               goto out; /* mpp freed in setup_multipath */
+               return 1; /* mpp freed in setup_multipath */
 
        /*
         * compare checkers states with DM states
@@ -429,11 +440,8 @@ int update_multipath (struct vectors *vecs, char *mapname)
                        }
                }
        }
-       r = 0;
-out:
-       if (r)
-               condlog(0, "failed to update multipath");
-       return r;
+
+       return 0;
 }
 
 /*
index 75ed90c..d7af0d1 100644 (file)
@@ -117,15 +117,11 @@ int waiteventloop (struct event_thread *waiter)
        /* accept wait interruption */
        set = unblock_signals();
 
-       /* interruption spits messages */
-       dm_shut_log();
-
        /* wait */
        r = dm_task_run(waiter->dmt);
 
        /* wait is over : event or interrupt */
        pthread_sigmask(SIG_SETMASK, &set, NULL);
-       //dm_restore_log();
 
        if (!r) /* wait interrupted by signal */
                return -1;
@@ -157,8 +153,11 @@ int waiteventloop (struct event_thread *waiter)
                r = update_multipath(waiter->vecs, waiter->mapname);
                lock_cleanup_pop(waiter->vecs->lock);
 
-               if (r)
+               if (r) {
+                       condlog(2, "%s: event checker exit", 
+                               waiter->mapname);
                        return -1; /* stop the thread */
+               }
 
                event_nr = dm_geteventnr(waiter->mapname);
 
index 67076db..acc3137 100644 (file)
@@ -401,6 +401,7 @@ main (int argc, char *argv[])
                        conf->dev_type = DEV_DEVMAP;
 
        }
+       dm_init();
 
        if (conf->remove == FLUSH_ONE) {
                if (conf->dev_type == DEV_DEVMAP)
index f2f9a96..9975dd8 100644 (file)
@@ -225,6 +225,8 @@ ev_add_map (char * devname, struct vectors * vecs)
        int map_present;
        int r = 1;
 
+       /* libsysfs seems to forget to terminate the string... */
+       memset(dev_t, 0, BLK_DEV_SIZE);
        if (sscanf(devname, "dm-%d", &minor) == 1 &&
            !sysfs_get_dev(sysfs_path, devname, dev_t, BLK_DEV_SIZE) &&
            sscanf(dev_t, "%d:%d", &major, &minor) == 2)
@@ -1397,6 +1399,7 @@ main (int argc, char *argv[])
        int err;
        
        logsink = 1;
+       dm_init();
 
        if (getuid() != 0) {
                fprintf(stderr, "need to be root\n");