In OBS, buckets are containers, with their names acting as globally unique identifiers, so two buckets in the OTC can't share the same name. The objects stored in these buckets however are identified by their unique IDs, which allows overloading objects with newer versions, under the same name, if versioning has been enabled for the bucket. (For more information, see Versioning and How Do I Use Versioning?)
There is no limit to the number of versions, however from experiences of running versioning in a productive environment we found that listing versioned objects can easily run into difficulties. To avoid performance issues we don't recommend to list all objects in buckets with versioning either enabled or suspended. As the OTC console depends on listing all objects as well, it is also highly recommended not to rely on it in managing versioned objects.
Some tools like OBS Browser currently also can't handle versioned objects and will only list and manipulate the current version of the object.
Right now the recommended method for managing versioned objects is using an SDK or API directly (for more information see Request Syntax for Multi-Version Objects in the Listing Objects API and Versioning for the Downloading an Object API).
A typical use case is recovering the latest historical version of an object by deleting the delete marker version. This operation is recommended to be performed either through API or SDK. This is a single operation based on the specific object ID. For more information see Versioning for the Deleting an Object API.
Another typical use case is deleting all versions of objects with a specific name (or even all objects from a bucket to delete the bucket). This operation however would need to be performed on multiple objects and thus can again run into difficulties based on the number of objects. It is recommended in this case to limit the batches of objects the operation runs on at the time and also the number of concurrency. For more information see Deleting Objects.
The best practice for mass deleting objects (regardless of versioning) is using a lifecycle rule.
To conveniently delete a large number of objects, you can configure a lifecycle rule (see Configuring a Lifecycle Rule) that will remove these objects after the specified number of days - the rule will be applied either to some of the objects based on a prefix or to all objects in the bucket. In order to configure such rule: