# Metabase versioning

This file describes changes between the metabase versions.

## Current

### Primary buckets
- Graveyard bucket
  - Name: `_Graveyard`
  - Key: object address 
  - Value: tombstone address
- Garbage bucket
  - Name: `_Garbage`
  - Key: object address
  - Value: dummy value
- Bucket containing IDs of objects that are candidates for moving
   to another shard.
  - Name: `_ToMoveIt`
  - Key: object address
  - Value: dummy value
- Container volume bucket
  - Name: `_ContainerSize`
  - Key: container ID
  - Value: container size in bytes as little-endian uint64
- Bucket for storing locked objects information
  - Name: `_Locked` 
  - Key: container ID
  - Value: bucket mapping objects locked to the list of corresponding LOCK objects
- Bucket containing auxilliary information. All keys are custom and are not connected to the container
  - Name: `_i`
  - Keys and values
    - `id` -> shard id as bytes
    - `version` -> metabase version as little-endian uint64
    - `phy_counter` -> shard's physical object counter as little-endian uint64
    - `logic_counter` -> shard's logical object counter as little-endian uint64

### Unique index buckets
- Buckets containing objects of REGULAR type
  - Name: container ID
  - Key: object ID
  - Value: marshalled object
- Buckets containing objects of LOCK type
  - Name: container ID + `_LOCKER`
  - Key: object ID
  - Value: marshalled object
- Buckets containing objects of STORAGEGROUP type
  - Name: container ID + `_SG`
  - Key: object ID
  - Value: marshaled object
- Buckets containing objects of TOMBSTONE type
  - Name: container ID + `_TS`
  - Key: object ID
  - Value: marshaled object
- Buckets mapping objects to the storage ID they are stored in
  - Name: container ID + `_small`
  - Key: object ID
  - Value: storage ID
- Buckets for mapping parent object to the split info
  - Name: container ID + `_root`
  - Key: object ID
  - Value: split info

### FKBT index buckets
- Buckets mapping owner to object IDs
  - Name: containerID + `_ownerid`
  - Key: owner ID as base58 string
  - Value: bucket containing object IDs as keys
- Buckets containing objects attributes indexes
  - Name: containerID + `_attr_` + attribute key
  - Key: attribute value
  - Value: bucket containing object IDs as keys

### List index buckets
- Buckets mapping payload hash to a list of object IDs
  - Name: container ID + `_payloadhash`
  - Key: payload hash
  - Value: list of object IDs
- Buckets mapping parent ID to a list of children IDs
  - Name: container ID + `_parent`
  - Key: parent ID
  - Value: list of children object IDs
- Buckets mapping split ID to a list of object IDs
  - Name: container ID + `_splitid`
  - Key: split ID
  - Value: list of object IDs

# History

## Version 2

- Container ID is encoded as 32-byte slice
- Object ID is encoded as 32-byte slice
- Object ID is encoded as 64-byte slice, container ID + object ID
- Bucket naming scheme is changed:
  - container ID + suffix -> 1-byte prefix + container ID

## Version 1

- Metabase now stores generic storage id instead of blobovnicza ID.

## Version 0

- Container ID is encoded as base58 string
- Object ID is encoded as base58 string
- Address is encoded as container ID + "/" + object ID