]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Implement heap size display in status for all daemons.
authorKern Sibbald <kern@sibbald.com>
Thu, 10 May 2007 11:11:06 +0000 (11:11 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 10 May 2007 11:11:06 +0000 (11:11 +0000)
kes  Attempt to fix MySQL db open memory loss (not successfull).
kes  Don't set SIGKILL and SIGSTOP neither can be trapped.
kes  Eliminate memory loss in MySQL (possibly other SQLs) during
     Query. This looks like a MySQL but but by doing extra releases,
     the memory goes away.  This should fix bug #847.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4738 91ce42f0-d328-0410-95d8-f526ca767f89

19 files changed:
bacula/src/baconfig.h
bacula/src/cats/cats.h
bacula/src/cats/mysql.c
bacula/src/cats/postgresql.c
bacula/src/cats/sql_create.c
bacula/src/cats/sqlite.c
bacula/src/dird/dird.c
bacula/src/dird/job.c
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_output.c
bacula/src/dird/ua_status.c
bacula/src/filed/filed.c
bacula/src/filed/status.c
bacula/src/lib/btime.c
bacula/src/lib/signal.c
bacula/src/lib/watchdog.c
bacula/src/stored/status.c
bacula/src/stored/stored.c
bacula/technotes-2.1

index 68a3df8663c694af36708ee2d55c54dba644e8ab..dd7c223ebd82e7b4a93be8fdd17c3950853341c9 100644 (file)
@@ -83,6 +83,8 @@ void InitWinAPIWrapper();
 
 #define  OSDependentInit()    InitWinAPIWrapper()
 
+#define sbrk(x)  0
+
 
 #if defined(BUILDING_DLL)
 #  define DLL_IMP_EXP   _declspec(dllexport)
index 25254d32223a388ab2e4c6f0da70f2868875b239..c5428750ed6fa69b3605d4c6273470cb60c02594 100644 (file)
@@ -377,7 +377,6 @@ struct B_DB {
 #define sql_free_result(x)    my_mysql_free_result(x)
 #define sql_fetch_row(x)      mysql_fetch_row((x)->result)
 #define sql_query(x, y)       mysql_query((x)->db, (y))
-#define sql_close(x)          mysql_close((x)->db)
 #define sql_strerror(x)       mysql_error((x)->db)
 #define sql_num_rows(x)       mysql_num_rows((x)->result)
 #define sql_data_seek(x, i)   mysql_data_seek((x)->result, (i))
index ab993d187bdbaf4bf4a83ca0616f7241877dd281..df58a9a0806802448513037f431df54670081107 100644 (file)
@@ -92,6 +92,8 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char
             Dmsg2(100, "DB REopen %d %s\n", mdb->ref_count, db_name);
             mdb->ref_count++;
             V(mutex);
+            Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", mdb->ref_count,
+                  mdb->connected, mdb->db);
             return mdb;                  /* already open */
          }
       }
@@ -123,6 +125,8 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char
    mdb->esc_name = get_pool_memory(PM_FNAME);
    mdb->esc_path = get_pool_memory(PM_FNAME);
    qinsert(&db_list, &mdb->bq);            /* put db in list */
+   Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", mdb->ref_count,
+         mdb->connected, mdb->db);
    V(mutex);
    return mdb;
 }
@@ -143,7 +147,6 @@ db_open_database(JCR *jcr, B_DB *mdb)
       V(mutex);
       return 1;
    }
-   mdb->connected = false;
 
    if ((errstat=rwl_init(&mdb->lock)) != 0) {
       Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"),
@@ -153,8 +156,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
    }
 
    /* connect to the database */
-#ifdef HAVE_EMBEDDED_MYSQL
-   mysql_server_init(0, NULL, NULL);
+#ifdef xHAVE_EMBEDDED_MYSQL
+// mysql_server_init(0, NULL, NULL);
 #endif
    mysql_init(&(mdb->mysql));
    Dmsg0(50, "mysql_init done\n");
@@ -191,6 +194,7 @@ db_open_database(JCR *jcr, B_DB *mdb)
       return 0;
    }
 
+   mdb->connected = true;
    if (!check_tables_version(jcr, mdb)) {
       V(mutex);
       return 0;
@@ -199,8 +203,9 @@ db_open_database(JCR *jcr, B_DB *mdb)
 #ifdef HAVE_THREAD_SAFE_MYSQL
    my_thread_init();
 #endif
+   Dmsg3(100, "opendb ref=%d connected=%d db=%p\n", mdb->ref_count,
+         mdb->connected, mdb->db);
 
-   mdb->connected = true;
    V(mutex);
    return 1;
 }
@@ -213,16 +218,20 @@ db_close_database(JCR *jcr, B_DB *mdb)
    }
    db_end_transaction(jcr, mdb);
    P(mutex);
+   sql_free_result(mdb);
    mdb->ref_count--;
 #if defined(HAVE_THREAD_SAFE_MYSQL)
    my_thread_end();
 #endif
+   Dmsg3(100, "closedb ref=%d connected=%d db=%p\n", mdb->ref_count,
+         mdb->connected, mdb->db);
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
       if (mdb->connected && mdb->db) {
-         sql_close(mdb);
-#ifdef HAVE_EMBEDDED_MYSQL
-         mysql_server_end();
+         Dmsg1(100, "close db=%p\n", mdb->db);
+         mysql_close(&(mdb->mysql));
+#ifdef xHAVE_EMBEDDED_MYSQL
+//       mysql_server_end();
 #endif
       }
       rwl_destroy(&mdb->lock);
index fcaf6f48b0ad1fd0a2f2da1ce75b7882a5ddd6cc..0b0218a72de90ba799dc2753107b1ccc3aba7a49 100644 (file)
@@ -196,6 +196,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
       return 0;
    }
 
+   mdb->connected = true;
+
    if (!check_tables_version(jcr, mdb)) {
       V(mutex);
       return 0;
@@ -203,7 +205,6 @@ db_open_database(JCR *jcr, B_DB *mdb)
 
    sql_query(mdb, "SET datestyle TO 'ISO, YMD'");
 
-   mdb->connected = true;
    V(mutex);
    return 1;
 }
@@ -216,6 +217,7 @@ db_close_database(JCR *jcr, B_DB *mdb)
    }
    db_end_transaction(jcr, mdb);
    P(mutex);
+   sql_free_result(mdb);
    mdb->ref_count--;
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
@@ -468,7 +470,7 @@ int my_postgresql_query(B_DB *mdb, const char *query) {
    return mdb->status;
 }
 
-void my_postgresql_free_result (B_DB *mdb)
+void my_postgresql_free_result(B_DB *mdb)
 {
    if (mdb->result) {
       PQclear(mdb->result);
index d1017cd36ae4bc9456613edfad42d96adf0400c2..d01d0e4ec23c28daa9b9cf09f53fda85b6dd3b8a 100644 (file)
@@ -805,7 +805,7 @@ bool db_write_batch_file_records(JCR *jcr)
        "  FROM batch                                                      "
        "    JOIN Path ON (batch.Path = Path.Path)                         "
        "    JOIN Filename ON (batch.Name = Filename.Name)                 ",
-                    NULL,NULL))
+                     NULL,NULL))
    {
       Jmsg(jcr, M_FATAL, 0, "Can't fill File table %s\n", jcr->db_batch->errmsg);
       return false;
@@ -831,6 +831,7 @@ bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
    Dmsg0(dbglevel, "put_file_into_catalog\n");
 
    if (!jcr->db_batch) {
+      Dmsg2(100, "Opendb attr. Stream=%d fname=%s\n", ar->Stream, ar->fname);
       jcr->db_batch = db_init_database(jcr, 
                                       mdb->db_name, 
                                       mdb->db_user,
@@ -851,11 +852,12 @@ bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
       
       if (!sql_batch_start(jcr, jcr->db_batch)) {
          Jmsg(jcr, M_FATAL, 0, 
-             "Can't start batch mode %s", db_strerror(jcr->db_batch));
+              "Can't start batch mode %s", db_strerror(jcr->db_batch));
          return false;
       }
+      Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
+            jcr->db_batch->connected, jcr->db_batch->db);
    }
-
    B_DB *bdb = jcr->db_batch;
 
    /*
index 935f5eb0348ac19b1cc7c095899a14168527334d..856a769699b286687682bd39a620031024c2004e 100644 (file)
@@ -203,7 +203,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
       free(db_name);
       V(mutex);
       return 0;
-   }
+   }       
+   mdb->connected = true;
    free(db_name);
    if (!check_tables_version(jcr, mdb)) {
       V(mutex);
@@ -217,7 +218,6 @@ db_open_database(JCR *jcr, B_DB *mdb)
    sqlite_busy_handler(mdb->db, my_busy_handler, NULL);
 #endif
 
-   mdb->connected = true;
    V(mutex);
    return 1;
 }
@@ -230,6 +230,7 @@ db_close_database(JCR *jcr, B_DB *mdb)
    }
    db_end_transaction(jcr, mdb);
    P(mutex);
+   sql_free_result(mdb);
    mdb->ref_count--;
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
index d97b31fd334b837d6f5c9f31e9587ebea2109672..9cdab0fb86320ba800712c806228b2cf89f74837 100644 (file)
@@ -69,6 +69,7 @@ DIRRES *director;                     /* Director resource */
 int FDConnectTimeout;
 int SDConnectTimeout;
 char *configfile = NULL;
+void *start_heap;
 
 /* Globals Imported */
 extern int r_first, r_last;           /* first and last resources */
@@ -127,6 +128,7 @@ int main (int argc, char *argv[])
    char *uid = NULL;
    char *gid = NULL;
 
+   start_heap = sbrk(0);
    setlocale(LC_ALL, "");
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
@@ -866,6 +868,7 @@ static bool check_catalog()
          if (db) {
             Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db));
             Pmsg1(000, "%s", db_strerror(db));
+            db_close_database(NULL, db);
          }
          OK = false;
          continue;
index 1edfd23c25e01235a26e7281a10a41b988addf85..bd0be764f82ba27438943b1363c4582f7c2642cf 100644 (file)
@@ -1,11 +1,3 @@
-/*
- *
- *   Bacula Director Job processing routines
- *
- *     Kern Sibbald, October MM
- *
- *    Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *
+ *   Bacula Director Job processing routines
+ *
+ *     Kern Sibbald, October MM
+ *
+ *    Version $Id$
+ */
 
 #include "bacula.h"
 #include "dird.h"
@@ -122,7 +122,7 @@ bool setup_job(JCR *jcr)
    /*
     * Open database
     */
-   Dmsg0(150, "Open database\n");
+   Dmsg0(100, "Open database\n");
    jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
                             jcr->catalog->db_password, jcr->catalog->db_address,
                             jcr->catalog->db_port, jcr->catalog->db_socket,
@@ -132,6 +132,7 @@ bool setup_job(JCR *jcr)
                  jcr->catalog->db_name);
       if (jcr->db) {
          Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
+         db_close_database(jcr, jcr->db);
       }
       goto bail_out;
    }
index 917910f4b8700b06dd639304182996190e3ea04a..666bc6ef61beea34a05d6a0f0deb9be38008cf55 100644 (file)
@@ -1800,7 +1800,7 @@ bool open_db(UAContext *ua)
 
    ua->jcr->catalog = ua->catalog;
 
-   Dmsg0(150, "Open database\n");
+   Dmsg0(100, "UA Open database\n");
    ua->db = db_init_database(ua->jcr, ua->catalog->db_name, ua->catalog->db_user,
                              ua->catalog->db_password, ua->catalog->db_address,
                              ua->catalog->db_port, ua->catalog->db_socket,
index 324c53cea314d2e24924cee51817e6d6d85e33c8..7e3fb492799090b514e4d89a5085ffbee41fd17c 100644 (file)
@@ -610,9 +610,12 @@ bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool)
       jcr->pool = pool;               /* override */
    }
    if (jcr->db) {
+      Dmsg0(100, "complete_jcr close db\n");
       db_close_database(jcr, jcr->db);
       jcr->db = NULL;
    }
+
+   Dmsg0(100, "complete_jcr open db\n");
    jcr->db = jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
                       jcr->catalog->db_password, jcr->catalog->db_address,
                       jcr->catalog->db_port, jcr->catalog->db_socket,
index 0fd354c30816723609de9dde1b3dd534fc78e77e..e4993aadc33869c84c3081eafce95c32baa2c505 100644 (file)
@@ -38,7 +38,7 @@
 #include "bacula.h"
 #include "dird.h"
 
-extern void *start_sbrk;
+extern void *start_heap;
 
 static void list_scheduled_jobs(UAContext *ua);
 static void list_running_jobs(UAContext *ua);
@@ -270,8 +270,8 @@ void list_dir_status_header(UAContext *ua)
       ua->send_msg(_("Daemon started %s, %d Jobs run since started.\n"),
         dt, num_jobs_run);
    }
-   ua->send_msg(_(" Heap: sbrk=%s bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
-            edit_uint64_with_commas((uint64_t)sbrk(0)-(uint64_t)start_sbrk, b1),
+   ua->send_msg(_(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
+            edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1),
             edit_uint64_with_commas(sm_bytes, b2),
             edit_uint64_with_commas(sm_max_bytes, b3),
             edit_uint64_with_commas(sm_buffers, b4),
index 069472e3626c9ebc8074ea09f196502da238e8ba..60fa82e223d3664ba8d17d216b554dda06f76bd9 100644 (file)
@@ -47,6 +47,7 @@ static bool check_resources();
 /* Exported variables */
 CLIENT *me;                           /* my resource */
 bool no_signals = false;
+void *start_heap;
 
 
 #define CONFIG_FILE "bacula-fd.conf" /* default config file */
@@ -93,6 +94,7 @@ int main (int argc, char *argv[])
    char *uid = NULL;
    char *gid = NULL;
 
+   start_heap = sbrk(0);
    setlocale(LC_ALL, "");
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
index 4931e27110bfc4e82b0db086110f3fc72ea22f45..58d8147216fb01c66d44508d94824d107c002e45 100644 (file)
@@ -1,15 +1,7 @@
-/*
- *  Bacula File Daemon Status routines
- *
- *    Kern Sibbald, August MMI
- *
- *   Version $Id$
- *
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *  Bacula File Daemon Status routines
+ *
+ *    Kern Sibbald, August MMI
+ *
+ *   Version $Id$
+ *
+ */
 
 #include "bacula.h"
 #include "filed.h"
 
+extern void *start_heap;
+
 /* Forward referenced functions */
 static void  list_terminated_jobs(void sendit(const char *msg, int len, void *sarg), void *arg);
 static void bsock_sendit(const char *msg, int len, void *arg);
@@ -65,7 +67,7 @@ extern VSSClient *g_pVSSClient;
 void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
 {
    int sec, bps;
-   char *msg, b1[32], b2[32], b3[32], b4[32];
+   char *msg, b1[32], b2[32], b3[32], b4[32], b5[5];
    int len;
    bool found = false;
    JCR *njcr;
@@ -124,11 +126,12 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
      sendit(msg, len, arg);
    }
 #endif
-   len = Mmsg(msg, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
-         edit_uint64_with_commas(sm_bytes, b1),
-         edit_uint64_with_commas(sm_max_bytes, b2),
-         edit_uint64_with_commas(sm_buffers, b3),
-         edit_uint64_with_commas(sm_max_buffers, b4));
+   len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
+         edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1),
+         edit_uint64_with_commas(sm_bytes, b2),
+         edit_uint64_with_commas(sm_max_bytes, b3),
+         edit_uint64_with_commas(sm_buffers, b4),
+         edit_uint64_with_commas(sm_max_buffers, b5));
    sendit(msg, len, arg);
    len = Mmsg(msg, _(" Sizeof: boffset_t=%d size_t=%d debug=%d trace=%d\n"),
          sizeof(boffset_t), sizeof(size_t), debug_level, get_trace());
index f2777ea8c61b05515c922f9dc3014fdec8bc37e7..0f730cf3bf705b2f9bd63cbc96e1583080549266 100644 (file)
@@ -99,7 +99,7 @@ char *bstrftime_nc(char *dt, int maxlen, utime_t tim)
    (void)localtime_r(&ttime, &tm);
    /* NOTE! since the compiler complains about %y, I use %y and cut the century */
    strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm);
-   strcpy(dt+7, dt+9);
+   strcpy(dt+7, dt+9);             /* overlay the century */
    return dt;
 }
 
index 18b4e797e92c5dc7ebcbb86d76a5451befb0bf27..4e80e5241a4af70f1c98ad34310b090fe1cdc516 100644 (file)
@@ -305,7 +305,7 @@ void init_signals(void terminate(int sig))
 #endif
    sigaction(SIGBUS,    &sighandle, NULL);
    sigaction(SIGFPE,    &sighandle, NULL);
-   sigaction(SIGKILL,   &sighandle, NULL);
+/* sigaction(SIGKILL,   &sighandle, NULL);  cannot be trapped */
    sigaction(SIGUSR1,   &sighandle, NULL);
    sigaction(SIGSEGV,   &sighandle, NULL);
    sigaction(SIGUSR2,   &sighandle, NULL);
@@ -314,7 +314,7 @@ void init_signals(void terminate(int sig))
 #ifdef SIGSTKFLT
    sigaction(SIGSTKFLT, &sighandle, NULL);
 #endif
-   sigaction(SIGSTOP,   &sighandle, NULL);
+/* sigaction(SIGSTOP,   &sighandle, NULL); cannot be trapped */
    sigaction(SIGTSTP,   &sighandle, NULL);
    sigaction(SIGTTIN,   &sighandle, NULL);
    sigaction(SIGTTOU,   &sighandle, NULL);
index 2cd7bbfa0ec6319e2ddb178272a1293ff04e8b82..bcc41fbd4a73e7764ef6a06c2c7b4f65875e19c5 100644 (file)
@@ -1,15 +1,7 @@
-/*
- * Bacula thread watchdog routine. General routine that 
- *  allows setting a watchdog timer with a callback that is
- *  called when the timer goes off.
- *
- *  Kern Sibbald, January MMII
- *
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2007 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ * Bacula thread watchdog routine. General routine that 
+ *  allows setting a watchdog timer with a callback that is
+ *  called when the timer goes off.
+ *
+ *  Kern Sibbald, January MMII
+ *
+ */
 
 #include "bacula.h"
 #include "jcr.h"
@@ -40,7 +40,6 @@
 /* Exported globals */
 time_t watchdog_time = 0;             /* this has granularity of SLEEP_TIME */
 time_t watchdog_sleep_time = 60;      /* examine things every 60 seconds */
-void *start_sbrk;   
 
 /* Locals */
 static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -76,7 +75,6 @@ int start_watchdog(void)
    if (wd_is_init) {
       return 0;
    }
-   start_sbrk = sbrk(0);
    Dmsg0(800, "Initialising NicB-hacked watchdog thread\n");
    watchdog_time = time(NULL);
 
@@ -103,6 +101,7 @@ static void ping_watchdog()
    P(timer_mutex);
    pthread_cond_signal(&timer);
    V(timer_mutex);
+   bmicrosleep(0, 100);
 }
 
 /*
@@ -121,9 +120,8 @@ int stop_watchdog(void)
    }
 
    quit = true;                       /* notify watchdog thread to stop */
-   wd_is_init = false;
-
    ping_watchdog();
+
    stat = pthread_join(wd_tid, NULL);
 
    while (!wd_queue->empty()) {
@@ -150,6 +148,7 @@ int stop_watchdog(void)
    delete wd_inactive;
    wd_inactive = NULL;
    rwl_destroy(&lock);
+   wd_is_init = false;
 
    return stat;
 }
index 091cb6278fcb217a4641888c9eda4214989828d8..7ef13adafaf632a86f08cb97d8193885151fabe9 100644 (file)
@@ -43,6 +43,7 @@
 extern BSOCK *filed_chan;
 extern int r_first, r_last;
 extern struct s_res resources[];
+extern void *start_heap;
 
 /* Static variables */
 static char qstatus[] = ".status %127s\n";
@@ -68,7 +69,7 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
    AUTOCHANGER *changer;
    DEVICE *dev;
    char dt[MAX_TIME_LENGTH];
-   char *msg, b1[35], b2[35], b3[35], b4[35];
+   char *msg, b1[35], b2[35], b3[35], b4[35], b5[35];
    int bpb;
    int len;
 
@@ -85,11 +86,12 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
         dt, num_jobs_run, num_jobs_run == 1 ? "" : "s");
    sendit(msg, len, arg);
 
-   len = Mmsg(msg, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
-         edit_uint64_with_commas(sm_bytes, b1),
-         edit_uint64_with_commas(sm_max_bytes, b2),
-         edit_uint64_with_commas(sm_buffers, b3),
-         edit_uint64_with_commas(sm_max_buffers, b4));
+   len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
+         edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1),
+         edit_uint64_with_commas(sm_bytes, b2),
+         edit_uint64_with_commas(sm_max_bytes, b3),
+         edit_uint64_with_commas(sm_buffers, b4),
+         edit_uint64_with_commas(sm_max_buffers, b5));
    sendit(msg, len, arg);
 
    /*
index dbce1a6b66290d870f5455de5ff40ae34b4c8d78..e027ffd89d49e9ddfb5c741afd74d5f294db5444 100644 (file)
@@ -61,6 +61,7 @@ STORES *me = NULL;                    /* our Global resource */
 bool forge_on = false;                /* proceed inspite of I/O errors */
 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
+void *start_heap;
 
 
 static uint32_t VolSessionId = 0;
@@ -112,6 +113,7 @@ int main (int argc, char *argv[])
    char *uid = NULL;
    char *gid = NULL;
 
+   start_heap = sbrk(0);
    setlocale(LC_ALL, "");
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
index 6c4ceedfcf6fe7a920ea9a991e2e85c3a1525879..6bd6f7bfac91ddccc9b614316f1e90caebed5793 100644 (file)
@@ -1,6 +1,13 @@
               Technical notes on version 2.1
 
 General:
+10May07
+kes  Implement heap size display in status for all daemons.
+kes  Attempt to fix MySQL db open memory loss (not successfull).
+kes  Don't set SIGKILL and SIGSTOP neither can be trapped.
+kes  Eliminate memory loss in MySQL (possibly other SQLs) during
+     Query. This looks like a MySQL but but by doing extra releases,
+     the memory goes away.  This should fix bug #847.
 09May07 
 kes  When backup fails, cancel SD before waiting for sd termination.
 kes  If SD is waiting for FD to connect during cancel, wake up the