Skip to content

Commit 75889fa

Browse files
authored
Merge pull request #26 from sapcc/segment-expiration-headers
Add expiration header support for segments
2 parents 286c869 + a699d9f commit 75889fa

File tree

12 files changed

+235
-39
lines changed

12 files changed

+235
-39
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ Changes:
1313

1414
Bugfixes:
1515
- When using a Swift source, pseudo-directories are now recognized and transferred correctly.
16+
- When uploading a segmented object to the target, expiration dates are now also applied to the segments.
17+
If you used an older version of swift-http-import to transfer files with expiration dates using segmented uploading,
18+
you will have to clean up those segments manually once the objects themselves have expired.
1619

1720
# v2.4.0 (2018-06-14)
1821

pkg/objects/file.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,11 @@ func (f File) uploadLargeObject(body io.Reader, hdr schwift.ObjectHeaders, clean
278278
DeleteSegments: cleanupOldSegments,
279279
})
280280
if err == nil {
281-
err = lo.Append(body, int64(f.Job.Segmenting.SegmentSize))
281+
XDeleteAtHeader := schwift.NewObjectHeaders()
282+
if hdr.ExpiresAt().Exists() {
283+
XDeleteAtHeader.ExpiresAt().Set(hdr.ExpiresAt().Get())
284+
}
285+
err = lo.Append(body, int64(f.Job.Segmenting.SegmentSize), XDeleteAtHeader.ToOpts())
282286
}
283287
if err == nil {
284288
err = lo.WriteManifest(hdr.ToOpts())

tests.sh

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,10 @@ step 'Test 7: Object expiration'
367367
upload_file_from_stdin expires.txt -H 'X-Delete-At: 2000000000' <<-EOF
368368
This will expire soon.
369369
EOF
370+
upload_file_from_stdin expires-with-segments.txt -H 'X-Delete-At: 2000000000' <<-EOF
371+
This will expire soon.
372+
This will expire soon.
373+
EOF
370374

371375
if [ "$1" = http ]; then
372376
echo ">> Test skipped (works only with Swift source)."
@@ -377,21 +381,42 @@ mirror <<-EOF
377381
jobs:
378382
- from: ${SOURCE_SPEC}
379383
to: { container: ${CONTAINER_BASE}-test7 }
380-
only: 'expires.txt'
384+
only: 'expires.*txt'
381385
expiration:
382386
delay_seconds: 42
387+
segmenting:
388+
container: ${CONTAINER_BASE}-test7-segments
389+
min_bytes: 30
390+
segment_bytes: 30
383391
EOF
384392

385393
expect test7 <<-EOF
394+
>> expires-with-segments.txt
395+
This will expire soon.
396+
This will expire soon.
386397
>> expires.txt
387398
This will expire soon.
388399
EOF
389400

390-
EXPIRY_TIMESTAMP="$(swift stat ${CONTAINER_BASE}-test7 expires.txt | awk '/X-Delete-At:/ { print $2 }')"
391-
if [ "${EXPIRY_TIMESTAMP}" != 2000000042 ]; then
392-
echo -e "\e[1;31m>>\e[0;31m Expected file to expire at timestamp 2000000042, but expires at timestamp '${EXPIRY_TIMESTAMP}' instead.\e[0m"
401+
for OBJECT_NAME in expires.txt expires-with-segments.txt; do
402+
EXPIRY_TIMESTAMP="$(swift stat ${CONTAINER_BASE}-test7 ${OBJECT_NAME} | awk '/X-Delete-At:/ { print $2 }')"
403+
if [ "${EXPIRY_TIMESTAMP}" != 2000000042 ]; then
404+
echo -e "\e[1;31m>>\e[0;31m Expected file \"${OBJECT_NAME}\" to expire at timestamp 2000000042, but expires at timestamp '${EXPIRY_TIMESTAMP}' instead.\e[0m"
405+
exit 1
406+
fi
407+
done
408+
409+
# also check that expiration dates are applied to the segments as well
410+
swift list ${CONTAINER_BASE}-test7-segments | while read OBJECT_NAME; do
411+
EXPIRY_TIMESTAMP="$(swift stat ${CONTAINER_BASE}-test7-segments ${OBJECT_NAME} | awk '/X-Delete-At:/ { print $2 }')"
412+
if [ "${EXPIRY_TIMESTAMP}" != 2000000042 ]; then
413+
echo -e "\e[1;31m>>\e[0;31m Expected segment '${OBJECT_NAME}' to expire at timestamp 2000000042, but expires at timestamp '${EXPIRY_TIMESTAMP}' instead.\e[0m"
414+
exit 1
415+
fi
416+
done || (
417+
echo -e "\e[1;31m>>\e[0;31m Expected object 'expires-with-segments.txt' to be an SLO, but it's not segmented.\e[0m"
393418
exit 1
394-
fi
419+
)
395420

396421
fi # end of: if [ "$1" = http ]
397422

@@ -415,6 +440,7 @@ mirror <<-EOF
415440
segment_bytes: 20 # less than job.segmenting.min_bytes, but also more
416441
# than the smallest files (to exercise all code paths)
417442
to: { container: ${CONTAINER_BASE}-test8 }
443+
except: 'expires-with-segments.txt'
418444
segmenting:
419445
container: ${CONTAINER_BASE}-test8-segments
420446
min_bytes: 30

vendor/github.com/majewsky/schwift/Makefile

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/README.md

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/container.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/largeobject.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/object.go

Lines changed: 62 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/object_test.go

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/majewsky/schwift/request.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)