aboutsummaryrefslogtreecommitdiff

gsrsup

gsrsup implements resumable streaming uploads to Google Cloud Storage. It’s useful for uploading a reproducible stream of data too large to fit on disk. For example, you can upload a ZFS snapshot by running

zfs send tank/fs@snapshot | gsrsup gs://bucket/object

This pipeline can be interrupted at any time; if rerun, gsrsup will seek to the appropriate place in the input stream and continue uploading from there.

gsrsup performs integrity checking on the data it uploads and will report a problem if the input stream changes between two invocations. However, the design of the Google Cloud Storage API prevents gsrsup from detecting such a change until the entire stream has been uploaded.

For safety, gsrsup treats Google Cloud Storage objects as append-only – it will never overwrite or delete them. Furthermore, it will never append to an object once its upload has completed. If you run

gsrsup gs://bucket/bash </bin/bash

twice, the second invocation will skip uploading altogether and only run the integrity-checking code.

Building

gsrsup builds using a handwritten Ninja file. Simply run ninja to create a development build. You can also run Ninja with a custom build file to request a different profile:

  • ninja -f buildconf/asan.ninja: Build with AddressSanitizer.
  • ninja -f buildconf/dbg.ninja: Build for debugging.
  • ninja -f buildconf/release.ninja: Build with optimizations.