From 3aebdfaec66791ab0f14df1c14d665c64fdea184 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Thu, 6 Jul 2023 21:01:38 +0800 Subject: [PATCH 1/8] doc(rfc): object versioning Signed-off-by: suyanhanx --- core/src/docs/rfcs/mod.rs | 3 + core/src/docs/rfcs/object_versioning.md | 76 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 core/src/docs/rfcs/object_versioning.md diff --git a/core/src/docs/rfcs/mod.rs b/core/src/docs/rfcs/mod.rs index d629585ee87..aca040224c4 100644 --- a/core/src/docs/rfcs/mod.rs +++ b/core/src/docs/rfcs/mod.rs @@ -142,3 +142,6 @@ pub mod rfc_2133_append_api {} #[doc = include_str!("2299_chain_based_operator_api.md")] pub mod rfc_2299_chain_based_operator_api {} + +#[doc = include_str!("object_versioning.md")] +pub mod rfc_object_versioning_api {} diff --git a/core/src/docs/rfcs/object_versioning.md b/core/src/docs/rfcs/object_versioning.md new file mode 100644 index 00000000000..8716bbb1af9 --- /dev/null +++ b/core/src/docs/rfcs/object_versioning.md @@ -0,0 +1,76 @@ +Proposal Name: object versioning +Start Date: 2023-07-06 + +# Summary + +This proposal describes the object versioning (or object version control) feature of OpenDAL. + +# Motivation + +Object versioning is a common feature in many storage services. + +With object versioning, users can: + +- Track the history of an object. +- Implement optimistic concurrency control. +- Implement a simple backup system. + +# Guide-level explanation + +When object versioning is enabled, each object will have a history of versions. Each version will have a unique version ID, which is a string that is unique for each version of an object. + +The version ID is not a timestamp. It is not guaranteed to be sequential. + +When object versioning is enabled, the following operations will be supported: + +- `stat`: Get the metadata of an object with specific version ID. +- `read`: Read a specific version of an object. +- `delete`: Delete a specific version of an object. +- `list`: List all versions of an object. + +Those operations with object version are different from the normal operations: + +- `write`: when writing an object, it will always create a new version of the object than overwrite the old version. But here it is imperceptible to the user. Because the version id is generated by the service itself, it cannot be specified by the user and user cannot override the historical version. +- `stat`: when getting the metadata of an object, it will always get the metadata of the latest version of the object if no version ID is specified. +- `read`: when reading an object, it will always read the latest version of the object if no version ID is specified. +- `delete`: when deleting an object, it will always delete the latest version of the object if no version ID is specified. And users will not be able to read this object unless they specify the version ID not to be deleted. +- `list_versions`: this `list_versions` means list all versions of an object. It's an operation on a single object, and it is different from the normal `list` which means list all objects. + +```rust +// read with version ID +let content = op.read_with("path/to/file").with_version("version_id").await?; +``` + +# Reference-level explanation + +To implement object versioning, we need to add a new `with_version` field to the `stat`, `read` and `delete` method. And we need to add a new `version_id` field to the `ObjectMeta` struct. And we need to add a new `list_versions` method to the `Accessor` trait and `Operator` struct. + +```rust +// read with version ID +let content = op.read_with("path/to/file").with_version("version_id").await?; +// list all versions of an object +let versions = op.list_versions("path/to/file").await?; +``` + +# Drawbacks + +None. + +# Rationale and alternatives + +None. + +# Prior art + +- [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) +- [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) +- [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) + +# Unresolved questions + +None. + +# Future possibilities + +None. + From db76183e6da65e6a3036e569479ad3aa0bfa1dc4 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Thu, 6 Jul 2023 21:08:55 +0800 Subject: [PATCH 2/8] update Signed-off-by: suyanhanx --- .../rfcs/{object_versioning.md => 2602_object_versioning.md} | 2 ++ core/src/docs/rfcs/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename core/src/docs/rfcs/{object_versioning.md => 2602_object_versioning.md} (96%) diff --git a/core/src/docs/rfcs/object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md similarity index 96% rename from core/src/docs/rfcs/object_versioning.md rename to core/src/docs/rfcs/2602_object_versioning.md index 8716bbb1af9..827c5ff7b0f 100644 --- a/core/src/docs/rfcs/object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -1,5 +1,7 @@ Proposal Name: object versioning Start Date: 2023-07-06 +RFC PR: https://github.com/apache/incubator-opendal/pull/2602 +Tracking Issue: (leave this empty) # Summary diff --git a/core/src/docs/rfcs/mod.rs b/core/src/docs/rfcs/mod.rs index aca040224c4..b393f497950 100644 --- a/core/src/docs/rfcs/mod.rs +++ b/core/src/docs/rfcs/mod.rs @@ -143,5 +143,5 @@ pub mod rfc_2133_append_api {} #[doc = include_str!("2299_chain_based_operator_api.md")] pub mod rfc_2299_chain_based_operator_api {} -#[doc = include_str!("object_versioning.md")] -pub mod rfc_object_versioning_api {} +#[doc = include_str!("2602_object_versioning.md")] +pub mod rfc_2602_object_versioning_api {} From c7b42043bddc93ba192fbfe87f56c8feeca5e4e8 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Fri, 7 Jul 2023 18:19:17 +0800 Subject: [PATCH 3/8] polish Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 827c5ff7b0f..28729e02440 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -36,24 +36,29 @@ Those operations with object version are different from the normal operations: - `stat`: when getting the metadata of an object, it will always get the metadata of the latest version of the object if no version ID is specified. - `read`: when reading an object, it will always read the latest version of the object if no version ID is specified. - `delete`: when deleting an object, it will always delete the latest version of the object if no version ID is specified. And users will not be able to read this object unless they specify the version ID not to be deleted. -- `list_versions`: this `list_versions` means list all versions of an object. It's an operation on a single object, and it is different from the normal `list` which means list all objects. ```rust // read with version ID -let content = op.read_with("path/to/file").with_version("version_id").await?; +let content = op.read_with("path/to/file").version("version_id").await?; ``` # Reference-level explanation -To implement object versioning, we need to add a new `with_version` field to the `stat`, `read` and `delete` method. And we need to add a new `version_id` field to the `ObjectMeta` struct. And we need to add a new `list_versions` method to the `Accessor` trait and `Operator` struct. +To implement object versioning, we need to add a new `version` field to the `stat`, `read` and `delete` method. And we need to add a new `version_id` field to the `ObjectMeta` struct. And we need to add a new `list_versions` method to the `Accessor` trait and `Operator` struct. ```rust // read with version ID -let content = op.read_with("path/to/file").with_version("version_id").await?; +let content = op.read_with("path/to/file").version("version_id").await?; // list all versions of an object let versions = op.list_versions("path/to/file").await?; ``` +## reference: + +- [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) +- [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) +- [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) + # Drawbacks None. @@ -64,9 +69,7 @@ None. # Prior art -- [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) -- [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) -- [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) +None. # Unresolved questions @@ -74,5 +77,5 @@ None. # Future possibilities -None. +Impl `list_versions`(list all versions of an object). From a5ffc8639e15c45532d638732dd8ef432dbe3106 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Fri, 7 Jul 2023 18:51:23 +0800 Subject: [PATCH 4/8] polish Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 63 +++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 28729e02440..1431d6b800f 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -9,15 +9,17 @@ This proposal describes the object versioning (or object version control) featur # Motivation -Object versioning is a common feature in many storage services. +Object versioning is a common feature in many storage services. -With object versioning, users can: +# Guide-level explanation -- Track the history of an object. -- Implement optimistic concurrency control. -- Implement a simple backup system. +What is object versioning? -# Guide-level explanation +Object versioning is a feature that allows users to keep multiple versions of an object in the same bucket. + +It's a way to preserve, retrieve, and restore every version of every object stored in a bucket. + +With object versioning, users can easily recover from both unintended user actions and application failures. When object versioning is enabled, each object will have a history of versions. Each version will have a unique version ID, which is a string that is unique for each version of an object. @@ -28,30 +30,49 @@ When object versioning is enabled, the following operations will be supported: - `stat`: Get the metadata of an object with specific version ID. - `read`: Read a specific version of an object. - `delete`: Delete a specific version of an object. -- `list`: List all versions of an object. - -Those operations with object version are different from the normal operations: -- `write`: when writing an object, it will always create a new version of the object than overwrite the old version. But here it is imperceptible to the user. Because the version id is generated by the service itself, it cannot be specified by the user and user cannot override the historical version. -- `stat`: when getting the metadata of an object, it will always get the metadata of the latest version of the object if no version ID is specified. -- `read`: when reading an object, it will always read the latest version of the object if no version ID is specified. -- `delete`: when deleting an object, it will always delete the latest version of the object if no version ID is specified. And users will not be able to read this object unless they specify the version ID not to be deleted. +Code example: ```rust +// stat with version ID +let meta = op.stat_with("path/to/file").version("version_id").await?; // read with version ID let content = op.read_with("path/to/file").version("version_id").await?; +// delete with version ID +op.delete_with("path/to/file").version("version_id").await?; ``` +With object versioning, users can: + +- Track the history of an object. +- Implement optimistic concurrency control. +- Implement a simple backup system. + # Reference-level explanation -To implement object versioning, we need to add a new `version` field to the `stat`, `read` and `delete` method. And we need to add a new `version_id` field to the `ObjectMeta` struct. And we need to add a new `list_versions` method to the `Accessor` trait and `Operator` struct. +Those operations with object version are different from the normal operations: -```rust -// read with version ID -let content = op.read_with("path/to/file").version("version_id").await?; -// list all versions of an object -let versions = op.list_versions("path/to/file").await?; -``` +- `stat`: when getting the metadata of an object, it will always get the metadata of the latest version of the object if no version ID is specified. +- `read`: when reading an object, it will always read the latest version of the object if no version ID is specified. +- `delete`: when deleting an object, it will always delete the latest version of the object if no version ID is specified. And users will not be able to read this object unless they specify the version ID not to be deleted. + +And with object versioning, when writing an object, +it will always create a new version of the object than overwrite the old version. +But here it is imperceptible to the user. +Because the version id is generated by the service itself, it cannot be specified by the user and user cannot override the historical version. + +To implement object versioning, we will do the following: + +- Add a new field `version` to `OpStat`, `OpRead` and `OpDelete` struct. +- Add a new field `version` to `ObjectMetadata` struct. +- Add a new property(setter) `version` to the return value of `stat_with`, `read_with` method. +- Add a new method `delete_with` and add a new property(setter) `version` to the return value of `delete_with` method. + +For service backend, it should support the following operations: + +- `stat`: Get the metadata of an object with specific version ID. +- `read`: Read a specific version of an object. +- `delete`: Delete a specific version of an object. ## reference: @@ -77,5 +98,5 @@ None. # Future possibilities -Impl `list_versions`(list all versions of an object). +Impl a new method `list_versions`(list all versions of an object). From b5347d5a38d2dca390b021f4846093a290f5a986 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Sun, 9 Jul 2023 16:56:39 +0800 Subject: [PATCH 5/8] update Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 68 ++++++++++++++++---- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 1431d6b800f..6c28119f567 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -1,7 +1,7 @@ -Proposal Name: object versioning +Proposal Name: object_versioning Start Date: 2023-07-06 -RFC PR: https://github.com/apache/incubator-opendal/pull/2602 -Tracking Issue: (leave this empty) +RFC PR: [apache/incubator-opendal#2602](https://github.com/apache/incubator-opendal/pull/2602) +Tracking Issue: (leave this empty, will be assigned later) # Summary @@ -9,11 +9,29 @@ This proposal describes the object versioning (or object version control) featur # Motivation -Object versioning is a common feature in many storage services. +There is a kind of storage service, which is called object storage service, +provides a simple and scalable way to store, organize, and access unstructured data. +These services store data as objects within buckets. +And an object is a file and any metadata that describes that file, a bucket is a container for objects. + +The object versioning provided by these services is a very useful feature. +It allows users to keep multiple versions of an object in the same bucket. +If users enable object versioning, each object will have a history of versions. +Each version will have a unique version ID, which is a string that is unique for each version of an object. + +(The object, bucket, +and version ID mentioned here are all concepts of object storage services, +they could be called differently in different services, +but they are the same thing.) + + + +OpenDAL provides support for some of those services, such as S3, GCS, Azure Blob Storage, etc. +Now we want to add support for object versioning to OpenDAL. # Guide-level explanation -What is object versioning? +## What is object versioning? Object versioning is a feature that allows users to keep multiple versions of an object in the same bucket. @@ -21,9 +39,22 @@ It's a way to preserve, retrieve, and restore every version of every object stor With object versioning, users can easily recover from both unintended user actions and application failures. +## How does object versioning work? + When object versioning is enabled, each object will have a history of versions. Each version will have a unique version ID, which is a string that is unique for each version of an object. -The version ID is not a timestamp. It is not guaranteed to be sequential. +The version ID is not a timestamp. +It is not guaranteed to be sequential. +Many object storage services produce object version IDs by themselves, using their own algorithms. +Users cannot specify the version ID when writing an object. + +## Will object versioning affect the existing code? + +There is no difference between whether object versioning is enabled or not when writing an object. +The storage service will always create a new version of the object than overwrite the old version when writing an object. +But here it is imperceptible to the user. + +## What operations are supported with object versioning? When object versioning is enabled, the following operations will be supported: @@ -34,17 +65,26 @@ When object versioning is enabled, the following operations will be supported: Code example: ```rust -// stat with version ID +// To get the current version ID of a file +let meta = op.stat("path/to/file").await?; +let version_id = meta.version().expect("just for example"); + +// To fetch the metadata of specific version of a file let meta = op.stat_with("path/to/file").version("version_id").await?; -// read with version ID +let version_id = meta.version().expect("just for example"); // get the version ID + +// To read an file with specific version ID let content = op.read_with("path/to/file").version("version_id").await?; -// delete with version ID + +// To delete an file with specific version ID op.delete_with("path/to/file").version("version_id").await?; ``` +## What are the benefits of object versioning? + With object versioning, users can: -- Track the history of an object. +- Track the history of a file. - Implement optimistic concurrency control. - Implement a simple backup system. @@ -52,9 +92,9 @@ With object versioning, users can: Those operations with object version are different from the normal operations: -- `stat`: when getting the metadata of an object, it will always get the metadata of the latest version of the object if no version ID is specified. -- `read`: when reading an object, it will always read the latest version of the object if no version ID is specified. -- `delete`: when deleting an object, it will always delete the latest version of the object if no version ID is specified. And users will not be able to read this object unless they specify the version ID not to be deleted. +- `stat`: when getting the metadata of a file, it will always get the metadata of the latest version of the file if no version ID is specified. And there will be a new field `version` in the metadata to indicate the version ID of the file. +- `read`: when reading a file, it will always read the latest version of the file if no version ID is specified. +- `delete`: when deleting a file, it will always delete the latest version of the file if no version ID is specified. And users will not be able to read this file without specifying the version ID, unless they specify a version not be deleted. And with object versioning, when writing an object, it will always create a new version of the object than overwrite the old version. @@ -77,6 +117,8 @@ For service backend, it should support the following operations: ## reference: - [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) +- [How does AWS S3 object versioning work?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html) +- [How to enable object versioning for a bucket in AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html) - [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) - [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) From 4c3566ff74f2e24084a5f1d2676474a931fc6b78 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Sun, 9 Jul 2023 19:47:42 +0800 Subject: [PATCH 6/8] polish Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 75 +++++++++----------- core/src/docs/rfcs/mod.rs | 2 +- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 6c28119f567..0cb79c835bb 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -1,7 +1,7 @@ -Proposal Name: object_versioning -Start Date: 2023-07-06 -RFC PR: [apache/incubator-opendal#2602](https://github.com/apache/incubator-opendal/pull/2602) -Tracking Issue: (leave this empty, will be assigned later) +- Proposal Name: object_versioning +- Start Date: 2023-07-06 +- RFC PR: [apache/incubator-opendal#2602](https://github.com/apache/incubator-opendal/pull/2602) +- Tracking Issue: (leave this empty, will be assigned later) # Summary @@ -24,38 +24,11 @@ and version ID mentioned here are all concepts of object storage services, they could be called differently in different services, but they are the same thing.) - - OpenDAL provides support for some of those services, such as S3, GCS, Azure Blob Storage, etc. Now we want to add support for object versioning to OpenDAL. # Guide-level explanation -## What is object versioning? - -Object versioning is a feature that allows users to keep multiple versions of an object in the same bucket. - -It's a way to preserve, retrieve, and restore every version of every object stored in a bucket. - -With object versioning, users can easily recover from both unintended user actions and application failures. - -## How does object versioning work? - -When object versioning is enabled, each object will have a history of versions. Each version will have a unique version ID, which is a string that is unique for each version of an object. - -The version ID is not a timestamp. -It is not guaranteed to be sequential. -Many object storage services produce object version IDs by themselves, using their own algorithms. -Users cannot specify the version ID when writing an object. - -## Will object versioning affect the existing code? - -There is no difference between whether object versioning is enabled or not when writing an object. -The storage service will always create a new version of the object than overwrite the old version when writing an object. -But here it is imperceptible to the user. - -## What operations are supported with object versioning? - When object versioning is enabled, the following operations will be supported: - `stat`: Get the metadata of an object with specific version ID. @@ -80,14 +53,6 @@ let content = op.read_with("path/to/file").version("version_id").await?; op.delete_with("path/to/file").version("version_id").await?; ``` -## What are the benefits of object versioning? - -With object versioning, users can: - -- Track the history of a file. -- Implement optimistic concurrency control. -- Implement a simple backup system. - # Reference-level explanation Those operations with object version are different from the normal operations: @@ -128,7 +93,37 @@ None. # Rationale and alternatives -None. +## What is object versioning? + +Object versioning is a feature that allows users to keep multiple versions of an object in the same bucket. + +It's a way to preserve, retrieve, and restore every version of every object stored in a bucket. + +With object versioning, users can easily recover from both unintended user actions and application failures. + +## How does object versioning work? + +When object versioning is enabled, each object will have a history of versions. Each version will have a unique version ID, which is a string that is unique for each version of an object. + +The version ID is not a timestamp. +It is not guaranteed to be sequential. +Many object storage services produce object version IDs by themselves, using their own algorithms. +Users cannot specify the version ID when writing an object. + +## Will object versioning affect the existing code? + +There is no difference between whether object versioning is enabled or not when writing an object. +The storage service will always create a new version of the object than overwrite the old version when writing an object. +But here it is imperceptible to the user. + +## What are the benefits of object versioning? + +With object versioning, users can: + +- Track the history of a file. +- Implement optimistic concurrency control. +- Implement a simple backup system. + # Prior art diff --git a/core/src/docs/rfcs/mod.rs b/core/src/docs/rfcs/mod.rs index b393f497950..7513cc3c90e 100644 --- a/core/src/docs/rfcs/mod.rs +++ b/core/src/docs/rfcs/mod.rs @@ -144,4 +144,4 @@ pub mod rfc_2133_append_api {} pub mod rfc_2299_chain_based_operator_api {} #[doc = include_str!("2602_object_versioning.md")] -pub mod rfc_2602_object_versioning_api {} +pub mod rfc_2602_object_versioning {} From 1ef56e73bd3316503e8e20bb7846d0a8c23ce0a4 Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Sun, 9 Jul 2023 19:49:26 +0800 Subject: [PATCH 7/8] create tracking issue Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 0cb79c835bb..369bdd9b98e 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -1,7 +1,7 @@ - Proposal Name: object_versioning - Start Date: 2023-07-06 - RFC PR: [apache/incubator-opendal#2602](https://github.com/apache/incubator-opendal/pull/2602) -- Tracking Issue: (leave this empty, will be assigned later) +- Tracking Issue: [apache/incubator-opendal#2611](https://github.com/apache/incubator-opendal/issues/2611) # Summary From 997d0410954edcb2bd013f4fb9328d60b6eecc5d Mon Sep 17 00:00:00 2001 From: suyanhanx Date: Sun, 9 Jul 2023 19:50:40 +0800 Subject: [PATCH 8/8] polish Signed-off-by: suyanhanx --- core/src/docs/rfcs/2602_object_versioning.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/src/docs/rfcs/2602_object_versioning.md b/core/src/docs/rfcs/2602_object_versioning.md index 369bdd9b98e..ec5267159eb 100644 --- a/core/src/docs/rfcs/2602_object_versioning.md +++ b/core/src/docs/rfcs/2602_object_versioning.md @@ -79,14 +79,6 @@ For service backend, it should support the following operations: - `read`: Read a specific version of an object. - `delete`: Delete a specific version of an object. -## reference: - -- [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) -- [How does AWS S3 object versioning work?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html) -- [How to enable object versioning for a bucket in AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html) -- [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) -- [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) - # Drawbacks None. @@ -124,6 +116,13 @@ With object versioning, users can: - Implement optimistic concurrency control. - Implement a simple backup system. +## reference + +- [AWS S3 Object Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) +- [How does AWS S3 object versioning work?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html) +- [How to enable object versioning for a bucket in AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html) +- [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning) +- [Azure Blob Storage Object Versioning](https://docs.microsoft.com/en-us/azure/storage/blobs/versioning-overview) # Prior art