From: Norbert Bizet Date: Thu, 26 Aug 2021 16:32:24 +0000 (-0400) Subject: cloud: S3 delete parts once it's been renamed X-Git-Tag: Release-11.3.2~379 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bcf035aa1a07b7a80fb5b30ccdde30803080c72b;p=thirdparty%2Fbacula.git cloud: S3 delete parts once it's been renamed --- diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 9421df907..ddc461ba1 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -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); diff --git a/bacula/src/stored/reserve.c b/bacula/src/stored/reserve.c index e85e58bd6..b874dee73 100644 --- a/bacula/src/stored/reserve.c +++ b/bacula/src/stored/reserve.c @@ -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; diff --git a/bacula/src/stored/s3_driver.c b/bacula/src/stored/s3_driver.c index d0c57161a..b69136cd1 100644 --- a/bacula/src/stored/s3_driver.c +++ b/bacula/src/stored/s3_driver.c @@ -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. */ diff --git a/regress/tests/copy-volume-test b/regress/tests/copy-volume-test index fe632ebf3..63772fa2a 100755 --- a/regress/tests/copy-volume-test +++ b/regress/tests/copy-volume-test @@ -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 diff --git a/regress/tests/migration-jobspan-test b/regress/tests/migration-jobspan-test index 3a05c3f1e..c86bce46e 100755 --- a/regress/tests/migration-jobspan-test +++ b/regress/tests/migration-jobspan-test @@ -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 * diff --git a/regress/tests/migration-volume-test b/regress/tests/migration-volume-test index cff1a93a5..bda73beae 100755 --- a/regress/tests/migration-volume-test +++ b/regress/tests/migration-volume-test @@ -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