Re: [EXT]Re: Why bacula-sd kaboom?

Chandler Sobel-Sorenson <[email protected]> Mon, 23 Jan 2023 11:48:52 -0700
Newsgroups gmane.comp.sysutils.backup.bacula.devel
Organization Arizona Genomics Institute
Message-ID <[email protected]>
Radosław Korzeniewski wrote on 1/23/23 9:27 AM:
> You should share what you have changed to be able to confirm if your changes caused the issue.
Yes, sure... I found this old patch code from CVS that only restores the attributes of data, since we had a chmod-mishap: bacula/patches/testing/project-restore-attributes-only.patch.

The additions to baconfig.h and dird/dird_conf.c were pretty basic.  But the code for filed/restore.c has been updated so much, maybe I put the code in a wrong place?  I put it here and changed "extract" to "rctx.extract" so it was consistent with the rest of the code:

                 /*
                  * Do not count the resource forks as regular files being restored.
                  */
                 if (rsrc_len == 0) {
                    jcr->JobFiles++;
                 }
              } else {
                 jcr->JobFiles++;
              }

+            if (jcr->replace == REPLACE_ATTR_ALWAYS   ||
+                jcr->replace == REPLACE_ATTR_IFEXISTS)
+            {
+               rctx.extract = false;        /* we just want attributes */
+            }

              if (!rctx.extract) {
                 /*
                  * set attributes now because file will not be extracted
                  */
                 if (jcr->plugin) {
                    plugin_set_attributes(jcr, attr, &rctx.bfd);

findlib/create_file.c seemed pretty straight forward too:

        case REPLACE_NEVER:
           /* Set attributes if we created this directory */
           if (attr->type == FT_DIREND && path_list_lookup(jcr, attr->ofname)) {
              break;
           }
           Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname);
           return CF_SKIP;
  
+      case REPLACE_ATTR_ALWAYS:
+         return CF_CREATED;

        case REPLACE_ALWAYS:
           break;
        }
+    } else { /* File doesn't exists anymore */
+       if (replace == REPLACE_ATTR_IFEXISTS) {
+          Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Doesn't exists anymore: %s\n"), attr->ofname);
+          return CF_SKIP;
+       }
     }
     switch (attr->type) {
     case FT_RAW:                       /* raw device to be written */


> We know why it is crashing (as explained above), but the root cause of why it ended up in this situation is unknown. You have a dozen possibilities including your changes.
That's about 10 or 11 more than I can think of!  Hopefully the code above helps narrow it down.

Many thanks


_______________________________________________
Bacula-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bacula-devel