SOURCES: bacula-2.4.3-win32-runscript-unicode-path.patch (NEW), bacula-2.4....
paszczus
paszczus at pld-linux.org
Thu Oct 30 15:07:36 CET 2008
Author: paszczus Date: Thu Oct 30 14:07:36 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- from upstream
---- Files affected:
SOURCES:
bacula-2.4.3-win32-runscript-unicode-path.patch (NONE -> 1.1) (NEW), bacula-2.4.3-update-slots.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/bacula-2.4.3-win32-runscript-unicode-path.patch
diff -u /dev/null SOURCES/bacula-2.4.3-win32-runscript-unicode-path.patch:1.1
--- /dev/null Thu Oct 30 15:07:36 2008
+++ SOURCES/bacula-2.4.3-win32-runscript-unicode-path.patch Thu Oct 30 15:07:30 2008
@@ -0,0 +1,135 @@
+
+ This patch fixes a problem when canceling job if client looses
+ connection while being backed up
+ Apply the patch to version 2.4.3 (and previous versions) with:
+
+ cd <bacula-source>
+ patch -p0 <2.4.3-cancel-after-network-outage.patch
+ ./configure <your-options>
+ make
+ ...
+ make install
+
+
+Index: src/dird/backup.c
+===================================================================
+--- src/dird/backup.c (révision 7772)
++++ src/dird/backup.c (copie de travail)
+@@ -240,14 +240,16 @@
+ }
+ return false;
+
+-/* Come here only after starting SD thread */
++/* Come here only after starting SD thread
++ * and we don't expect any EndJob message because the
++ * the client don't have recieve the "backup" command.
++ */
+ bail_out:
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+- Dmsg1(400, "wait for sd. use=%d\n", jcr->use_count());
+- /* Cancel SD */
+- cancel_storage_daemon_job(jcr);
+- wait_for_storage_daemon_termination(jcr);
+- Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count());
++ Dmsg1(400, "wait for sd and fd. use=%d\n", jcr->use_count());
++ /* Get status from SD and FD */
++ wait_for_job_termination(jcr, false /* don't expect EndJob message*/);
++ Dmsg1(400, "after wait for sd and fd. use=%d\n", jcr->use_count());
+ return false;
+ }
+
+@@ -258,7 +260,7 @@
+ * are done, we return the job status.
+ * Also used by restore.c
+ */
+-int wait_for_job_termination(JCR *jcr)
++int wait_for_job_termination(JCR *jcr, bool expect_EndJob)
+ {
+ int32_t n = 0;
+ BSOCK *fd = jcr->file_bsock;
+@@ -270,30 +272,51 @@
+ int Encrypt = 0;
+
+ set_jcr_job_status(jcr, JS_Running);
+- /* Wait for Client to terminate */
+- while ((n = bget_dirmsg(fd)) >= 0) {
+- if (!fd_ok &&
+- (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
+- &ReadBytes, &JobBytes, &Errors, &VSS, &Encrypt) == 7 ||
+- sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles,
+- &ReadBytes, &JobBytes, &Errors) == 5)) {
+- fd_ok = true;
+- set_jcr_job_status(jcr, jcr->FDJobStatus);
+- Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus);
+- } else {
+- Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"),
+- fd->msg);
++
++
++ if (fd) {
++ /* Wait for Client to terminate
++ * In some conditions, the client isn't able to send
++ * any messages and we should not wait for ages
++ */
++ int OK=true;
++ int ret;
++ while (OK && expect_EndJob) {
++
++ /* Even if the job is canceled, we let a chance to FD to
++ * send EndJob message
++ */
++ if (job_canceled(jcr)) {
++ OK=false;
++ }
++
++ /* wait for data few minutes */
++ ret = fd->wait_data_intr(3*60, 0);
++ if (ret == 1) { /* get data */
++ n = bget_dirmsg(fd);
++ if (n >= 0 &&
++ (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
++ &ReadBytes, &JobBytes, &Errors, &VSS, &Encrypt) == 7 ||
++ sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles,
++ &ReadBytes, &JobBytes, &Errors) == 5)) {
++ fd_ok = true;
++ set_jcr_job_status(jcr, jcr->FDJobStatus);
++ OK=false; /* end of loop */
++ } else {
++ Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"),
++ fd->msg);
++ }
++ } /* else get timeout or network error */
++
++ if (is_bnet_error(fd)) {
++ Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
++ job_type_to_str(jcr->JobType), fd->bstrerror());
++ OK=false;
++ }
+ }
+- if (job_canceled(jcr)) {
+- break;
+- }
+- }
+
+- if (is_bnet_error(fd)) {
+- Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
+- job_type_to_str(jcr->JobType), fd->bstrerror());
++ fd->signal(BNET_TERMINATE); /* tell Client we are terminating */
+ }
+- fd->signal(BNET_TERMINATE); /* tell Client we are terminating */
+
+ /* Force cancel in SD if failing */
+ if (job_canceled(jcr) || !fd_ok) {
+Index: src/dird/protos.h
+===================================================================
+--- src/dird/protos.h (révision 7772)
++++ src/dird/protos.h (copie de travail)
+@@ -52,7 +52,7 @@
+ extern bool find_recycled_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr);
+
+ /* backup.c */
+-extern int wait_for_job_termination(JCR *jcr);
++extern int wait_for_job_termination(JCR *jcr, bool expect_EndJob=true);
+ extern bool do_backup_init(JCR *jcr);
+ extern bool do_backup(JCR *jcr);
+ extern void backup_cleanup(JCR *jcr, int TermCode);
================================================================
Index: SOURCES/bacula-2.4.3-update-slots.patch
diff -u /dev/null SOURCES/bacula-2.4.3-update-slots.patch:1.1
--- /dev/null Thu Oct 30 15:07:37 2008
+++ SOURCES/bacula-2.4.3-update-slots.patch Thu Oct 30 15:07:30 2008
@@ -0,0 +1,79 @@
+
+ This patch corrects a problem when removing a volume from
+ an autochanger and the slot is still empty when running
+ update slots command. #1175
+
+ Apply it to version 2.4.3 with:
+
+ cd <bacula-source>
+ patch -p0 <2.4.3-update-slots.patch
+ ./configure <your-options>
+ make
+ ...
+ make install
+
+Index: src/cats/sql_update.c
+===================================================================
+--- src/cats/sql_update.c (revision 7854)
++++ src/cats/sql_update.c (working copy)
+@@ -445,14 +445,28 @@
+ db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
+ {
+ char ed1[50], ed2[50];
+- if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0 &&
+- mr->MediaId != 0) {
+- Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
+- "Slot=%d AND StorageId=%s AND MediaId!=%s",
+- mr->Slot,
+- edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
+- Dmsg1(400, "%s\n", mdb->cmd);
+- UPDATE_DB(jcr, mdb, mdb->cmd);
++ if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0) {
++
++ if (mr->MediaId != 0) {
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s AND MediaId!=%s",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), edit_int64(mr->MediaId, ed2));
++
++ } else if (mr->VolumeName[0]) { /* We have a volume name */
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s AND VolumeName!='%s'",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), mr->VolumeName);
++
++ } else { /* used by ua_label to reset all volume with this slot */
++ Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
++ "Slot=%d AND StorageId=%s",
++ mr->Slot,
++ edit_int64(mr->StorageId, ed1), mr->VolumeName);
++ }
++ Dmsg1(100, "%s\n", mdb->cmd);
++ UPDATE_DB(jcr, mdb, mdb->cmd);
+ }
+ }
+
+Index: src/cats/sql_create.c
+===================================================================
+--- src/cats/sql_create.c (revision 7854)
++++ src/cats/sql_create.c (working copy)
+@@ -459,14 +459,13 @@
+ "WHERE MediaId=%d", dt, mr->MediaId);
+ stat = UPDATE_DB(jcr, mdb, mdb->cmd);
+ }
++ /*
++ * Make sure that if InChanger is non-zero any other identical slot
++ * has InChanger zero.
++ */
++ db_make_inchanger_unique(jcr, mdb, mr);
+ }
+
+- /*
+- * Make sure that if InChanger is non-zero any other identical slot
+- * has InChanger zero.
+- */
+- db_make_inchanger_unique(jcr, mdb, mr);
+-
+ db_unlock(mdb);
+ return stat;
+ }
================================================================
More information about the pld-cvs-commit
mailing list