X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fstored.c;h=d878330cfb44ee5b145125442fdb39c394fc3545;hb=bc9b9b481e86991abd879d30aa03b64b4c68d578;hp=2ce820099ef11913cfb7cefdbd96e93ceea782b5;hpb=c37638750b04e222c9436d70c55d28193c58a86f;p=bacula%2Fbacula diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index 2ce820099e..d878330cfb 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -1,27 +1,14 @@ -/* - * Second generation Storage daemon. - * - * Kern Sibbald, MM - * - * It accepts a number of simple commands from the File daemon - * and acts on them. When a request to append data is made, - * it opens a data channel and accepts data from the - * File daemon. - * - * Version $Id$ - * - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-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. This program is Free Software; you can redistribute it and/or modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -38,6 +25,19 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Second generation Storage daemon. + * + * Kern Sibbald, MM + * + * It accepts a number of simple commands from the File daemon + * and acts on them. When a request to append data is made, + * it opens a data channel and accepts data from the + * File daemon. + * + * Version $Id$ + * + */ #include "bacula.h" #include "stored.h" @@ -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; @@ -81,7 +82,8 @@ PROG_COPYRIGHT "\nVersion: %s (%s)\n\n" "Usage: stored [options] [-c config_file] [config_file]\n" " -c use as configuration file\n" -" -dnn set debug level to nn\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" " -f run in foreground (for debugging)\n" " -g set groupid to group\n" " -p proceed despite I/O errors\n" @@ -90,7 +92,7 @@ PROG_COPYRIGHT " -u userid to \n" " -v verbose user messages\n" " -? print this message.\n" -"\n"), BYEAR, VERSION, BDATE); +"\n"), 2000, VERSION, BDATE); exit(1); } @@ -112,6 +114,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"); @@ -140,9 +143,13 @@ int main (int argc, char *argv[]) break; case 'd': /* debug level */ - debug_level = atoi(optarg); - if (debug_level <= 0) { - debug_level = 1; + if (*optarg == 't') { + dbg_timestamp = true; + } else { + debug_level = atoi(optarg); + if (debug_level <= 0) { + debug_level = 1; + } } break; @@ -251,7 +258,8 @@ int main (int argc, char *argv[]) */ create_volume_list(); /* do before device_init */ if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) { - Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), strerror(errno)); + berrno be; + Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), be.bstrerror()); } start_watchdog(); /* start watchdog thread */ @@ -279,6 +287,7 @@ uint32_t newVolSessionId() static int check_resources() { bool OK = true; + bool tls_needed; me = (STORES *)GetNextRes(R_STORAGE, NULL); @@ -333,19 +342,21 @@ static int check_resources() } } - if (!store->tls_certfile && store->tls_enable) { + tls_needed = store->tls_enable || store->tls_authenticate; + + if (!store->tls_certfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"), store->hdr.name, configfile); OK = false; } - if (!store->tls_keyfile && store->tls_enable) { + if (!store->tls_keyfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"), store->hdr.name, configfile); OK = false; } - if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) { + if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && tls_needed && store->tls_verify_peer) { Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s." " At least one CA certificate store is required" @@ -355,7 +366,7 @@ static int check_resources() } /* If everything is well, attempt to initialize our per-resource TLS context */ - if (OK && (store->tls_enable || store->tls_require)) { + if (OK && (tls_needed || store->tls_require)) { /* Initialize TLS context: * Args: CA certfile, CA certdir, Certfile, Keyfile, * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ @@ -378,19 +389,21 @@ static int check_resources() director->tls_enable = true; } - if (!director->tls_certfile && director->tls_enable) { + tls_needed = director->tls_enable || director->tls_authenticate; + + if (!director->tls_certfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"), director->hdr.name, configfile); OK = false; } - if (!director->tls_keyfile && director->tls_enable) { + if (!director->tls_keyfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"), director->hdr.name, configfile); OK = false; } - if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) { + if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && tls_needed && director->tls_verify_peer) { Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s." " At least one CA certificate store is required" @@ -400,7 +413,7 @@ static int check_resources() } /* If everything is well, attempt to initialize our per-resource TLS context */ - if (OK && (director->tls_enable || director->tls_require)) { + if (OK && (tls_needed || director->tls_require)) { /* Initialize TLS context: * Args: CA certfile, CA certdir, Certfile, Keyfile, * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ @@ -469,7 +482,8 @@ void *device_initialization(void *arg) /* Initialize FD start condition variable */ int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); if (errstat != 0) { - Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat)); + berrno be; + Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat)); } foreach_res(device, R_DEVICE) { @@ -481,7 +495,7 @@ void *device_initialization(void *arg) continue; } - jcr->dcr = dcr = new_dcr(jcr, dev); + jcr->dcr = dcr = new_dcr(jcr, NULL, dev); if (dev->is_autochanger()) { /* If autochanger set slot in dev sturcture */ get_autochanger_loaded_slot(dcr); @@ -510,6 +524,13 @@ void *device_initialization(void *arg) free_dcr(dcr); jcr->dcr = NULL; } +#ifdef xxx + if (jcr->dcr) { + Dmsg1(000, "free_dcr=%p\n", jcr->dcr); + free_dcr(jcr->dcr); + jcr->dcr = NULL; + } +#endif free_jcr(jcr); init_done = true; UnlockRes(); @@ -525,9 +546,11 @@ void terminate_stored(int sig) JCR *jcr; if (in_here) { /* prevent loops */ + bmicrosleep(2, 0); /* yield */ exit(1); } in_here = true; + stop_watchdog(); if (sig == SIGTERM) { /* normal shutdown request? */ /* @@ -545,15 +568,16 @@ void terminate_stored(int sig) set_jcr_job_status(jcr, JS_Canceled); fd = jcr->file_bsock; if (fd) { - fd->timed_out = true; + fd->set_timed_out(); Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId); pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL); /* ***FIXME*** wiffle through all dcrs */ - if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->dev_blocked) { + if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) { pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol); + Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId); pthread_cond_broadcast(&wait_device_release); } - if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->dev_blocked) { + if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->blocked()) { pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol); pthread_cond_broadcast(&wait_device_release); } @@ -572,7 +596,7 @@ void terminate_stored(int sig) foreach_res(device, R_DEVICE) { Dmsg1(10, "Term device %s\n", device->device_name); if (device->dev) { - free_volume(device->dev); + device->dev->clear_volhdr(); device->dev->term(); device->dev = NULL; } else { @@ -589,11 +613,10 @@ void terminate_stored(int sig) if (debug_level > 10) { print_memory_pool_stats(); } - term_reservations_lock(); term_msg(); - stop_watchdog(); cleanup_crypto(); free_volume_list(); + term_reservations_lock(); close_memory_pool(); sm_dump(false); /* dump orphaned buffers */