]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
cloud: S3 delete parts once it's been renamed
authorNorbert Bizet <norbert.bizet@baculasystems.com>
Thu, 26 Aug 2021 16:32:24 +0000 (12:32 -0400)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:03:03 +0000 (09:03 +0100)
bacula/src/stored/acquire.c
bacula/src/stored/reserve.c
bacula/src/stored/s3_driver.c
regress/tests/copy-volume-test
regress/tests/migration-jobspan-test
regress/tests/migration-volume-test

index 9421df907405c2778bc56085f9dfe40841050566..ddc461ba1a9d0ad3eb9fedb158f91eecc69d3729 100644 (file)
@@ -484,6 +484,7 @@ bool release_device(DCR *dcr)
    bool ok = true;
    char tbuf[100];
    bsteal_lock_t holder;
+   bool read_dev;
 
    dev->Lock();
    if (!obtain_device_block(dev,
@@ -499,7 +500,8 @@ bool release_device(DCR *dcr)
    /* if device is reserved, job never started, so release the reserve here */
    dcr->clear_reserved();
 
-   if (dev->can_read()) {
+   read_dev = dev->can_read();
+   if (read_dev) {
       VOLUME_CAT_INFO *vol = &dev->VolCatInfo;
       generate_plugin_event(jcr, bsdEventDeviceClose, dcr);
       dev->clear_read();              /* clear read bit */
@@ -602,6 +604,9 @@ bool release_device(DCR *dcr)
       dev->detach_dcr_from_dev(dcr);
    } else {
       free_dcr(dcr);
+      if (read_dev) {
+         dev->term(NULL);
+      }
    }
    Dmsg2(100, "Device %s released by JobId=%u\n", dev->print_name(),
          (uint32_t)jcr->JobId);
index e85e58bd6929a481c2d80aa882d5effc21e9c352..b874dee736b9c533347077c59ade5dde983091b2 100644 (file)
@@ -763,7 +763,8 @@ static int reserve_device(RCTX &rctx)
    if (rctx.store->append) {
       dcr = new_dcr(rctx.jcr, rctx.jcr->dcr, rctx.device->dev, SD_APPEND);
    } else {
-      dcr = new_dcr(rctx.jcr, rctx.jcr->read_dcr, rctx.device->dev, SD_READ);
+      DEVICE *dev = init_dev(rctx.jcr, rctx.device, /*adata*/false, /*statcollector*/0x0, /*clone*/true);
+      dcr = new_dcr(rctx.jcr, rctx.jcr->read_dcr, dev, SD_READ);
    }
    if (!dcr) {
       BSOCK *dir = rctx.jcr->dir_bsock;
index d0c57161a181aa4a9ce2f43598947c3c5bd214f0..b69136cd1cb827ad30b8935ae33d4e516ab4d79e 100644 (file)
@@ -603,6 +603,18 @@ bool s3_driver::move_cloud_part(const char *VolumeName, uint32_t apart, const ch
    if (ctx.status == S3StatusOK) {
       exists = true;
       Mmsg(err, "%s", to);
+
+      /* remove source part */
+      Dmsg3(dbglvl, "%s move sucessful trying to unlink %s", ctx.caller, cloud_fname, dest_cloud_fname);
+      ctx.caller = "S3_delete_object";
+      S3_delete_object(&s3ctx, cloud_fname, NULL, 0, &responseHandler, &ctx);
+      if (ctx.status != S3StatusOK) {
+         /* error message should have been filled within response cb */
+         return false;
+      } else {
+         Dmsg1(dbglvl, "move_cloud_part: Unlink sucessful for file %s.\n", cloud_fname);
+      }
+
       return true;
    } else if (ctx.status == S3StatusXmlParseFailure) {
       /* source doesn't exist. OK. */
index fe632ebf33f79b2c7b9abbe56b54cf0aa0626138..63772fa2aaa97a4f702417fbed9fc0436d76920a 100755 (executable)
@@ -48,7 +48,9 @@ update Volume=FileVolume001 MaxVolBytes=3000000 pool=Default
 label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Scratch drive=0
 label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Scratch drive=0
 @# 
-run job=$JobName yes
+run job=$JobName level=full yes
+wait
+run job=$JobName level=full yes
 wait
 run job=$JobName yes
 wait
index 3a05c3f1efee328c2cdf5c17d908d41d0e6ae994..c86bce46e78fe59a1decf6684213c0a97b3bf4fb 100755 (executable)
@@ -48,13 +48,13 @@ label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0
 label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0
 list volumes
 @#
-run job=$JobName yes
+run job=$JobName level=full yes
 @#run job=$JobName yes
 wait
 list volumes
 @#setdebug level=200 dir
 @# should migrate both Volumes
-run job=migrate-job yes
+run job=migrate-job level=full yes
 wait
 purge volume=FileVolume001
 purge volume=FileVolume002
@@ -66,7 +66,7 @@ wait
 @# now do a restore
 @#
 @$out ${cwd}/tmp/log2.out
-setdebug level=500 storage=File
+@#setdebug level=500 storage=File
 restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger
 unmark *
 mark *
index cff1a93a52a083c7be20c59b75b95ac35e92aa08..bda73beae3afcb661f1486854c39d067d64dee87 100755 (executable)
@@ -42,9 +42,9 @@ update Volume=FileVolume001 MaxVolBytes=3000000 pool=Default
 label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0
 label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0
 @# 
-run job=$JobName yes
+run job=$JobName level=full yes
 wait
-run job=$JobName yes
+run job=$JobName level=full yes
 wait
 update volume=FileVolume001 VolStatus=Used
 update volume=FileVolume002 VolStatus=Used