Change-Id: If3d4e4d44676ef987f584db8cb462ecaed03a019
3.5 KiB
Object Versioning
Overview
Object versioning in swift is implemented by setting a flag on the
container to tell swift to version all objects in the container. The
flag is the X-Versions-Location
header on the container,
and its value is the container where the versions are stored. It is
recommended to use a different X-Versions-Location
container for each container that is being versioned.
When data is PUT
into a versioned container (a container
with the versioning flag turned on), the existing data in the file is
redirected to a new object and the data in the PUT
request
is saved as the data for the versioned object. The new object name (for
the previous version) is
<versions_container>/<length><object_name>/<timestamp>
,
where length
is the 3-character zero-padded hexadecimal
length of the <object_name>
and
<timestamp>
is the timestamp of when the previous
version was created.
A GET
to a versioned object will return the current
version of the object without having to do any request redirects or
metadata lookups.
A POST
to a versioned object will update the object
metadata as normal, but will not create a new version of the object. In
other words, new versions are only created when the content of the
object changes.
A DELETE
to a versioned object will only remove the
current version of the object. If you have 5 total versions of the
object, you must delete the object 5 times to completely remove the
object.
Note: A large object manifest file cannot be versioned, but a large object manifest may point to versioned segments.
How to Enable Object Versioning in a Swift Cluster
Set allow_versions
to True
in the container
server config.
Examples Using curl
First, create a container with the X-Versions-Location
header or add the header to an existing container. Also make sure the
container referenced by the X-Versions-Location
exists. In
this example, the name of that container is "versions":
curl -i -XPUT -H "X-Auth-Token: <token>" \
-H "X-Versions-Location: versions" http://<storage_url>/container
curl -i -XPUT -H "X-Auth-Token: <token>" http://<storage_url>/versions
Create an object (the first version):
curl -i -XPUT --data-binary 1 -H "X-Auth-Token: <token>" \
http://<storage_url>/container/myobject
Now create a new version of that object:
curl -i -XPUT --data-binary 2 -H "X-Auth-Token: <token>" \
http://<storage_url>/container/myobject
See a listing of the older versions of the object:
curl -i -H "X-Auth-Token: <token>" \
http://<storage_url>/versions?prefix=008myobject/
Now delete the current version of the object and see that the older version is gone:
curl -i -XDELETE -H "X-Auth-Token: <token>" \
http://<storage_url>/container/myobject
curl -i -H "X-Auth-Token: <token>" \
http://<storage_url>/versions?prefix=008myobject/
How to Disable Object Versioning in a Swift Cluster
If you want to disable all functionality, set
allow_versions
back to False
in the container
server config.
Disable versioning a versioned container (x is any value except empty):
curl -i -XPOST -H "X-Auth-Token: <token>" \
-H "X-Remove-Versions-Location: x" http://<storage_url>/container