Disperse metadata with object data

Immutable objects are unchanging discrete object data and metadata stored to a storage system.

On such systems, object metadata is determined one time at object creation time. These systems can update metadata, but only when new object data is written. When metadata changes only when the object data changes, it is known as covariant metadata.

Covariant metadata can be stored within the same Simple object as the object data itself. With covariant metadata, the metadata is either added as a prefix or appended to object data.

Ranged reads can be used without penalty for selective reads.
Metadata prefix
For fixed-size metadata, adding a prefix is advisable as it allows no-penalty ranged reads for the first byte of content data. Metadata read would be from zero-offset (normal read).

For variable sized metadata, read-penalty on reads might exist, since the first byte must always be read to determine data offset.

Struct {
   Long metadata_length,
   Byte[] metadata,
   Byte[] content data
}; 
Appending metadata
For variable sized metadata, storing metadata at end of content data allows no-penalty object ranged reads.
Struct {
   Long content_length,
   Byte[] content data,
   Byte[] metadata,
};