Version: v0.8.4 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Apr 26, 2021 License: Apache-2.0 Imports: 39 Imported by: 1



Package content implements repository support for content-addressable storage.



View Source
const (
	PackBlobIDPrefixRegular blob.ID = "p"
	PackBlobIDPrefixSpecial blob.ID = "q"

	FormatLogModule = "kopia/format"

Prefixes for pack blobs.

View Source
const BlobIDPrefixSession blob.ID = "s"

BlobIDPrefixSession is the prefix for blob IDs indicating active sessions. Each blob ID will consist of {sessionID}.{suffix}.


View Source
var AllIDs = IDRange{"", maxIDCharacterPlus1}

AllIDs is an IDRange that contains all valid IDs.

View Source
var AllNonPrefixedIDs = IDRange{"0", "g"}

AllNonPrefixedIDs is an IDRange that contains all valid IDs non-prefixed IDs ('0' .. 'f').

View Source
var AllPrefixedIDs = IDRange{"g", maxIDCharacterPlus1}

AllPrefixedIDs is an IDRange that contains all valid IDs prefixed IDs ('g' .. 'z').

View Source
var ErrContentNotFound = errors.New("content not found")

ErrContentNotFound is returned when content is not found.

PackBlobIDPrefixes contains all possible prefixes for pack blobs.


func CreateHashAndEncryptor

func CreateHashAndEncryptor(f *FormattingOptions) (hashing.HashFunc, encryption.Encryptor, error)

CreateHashAndEncryptor returns new hashing and encrypting functions based on the specified formatting options.

func ValidatePrefix added in v0.6.0

func ValidatePrefix(prefix ID) error

ValidatePrefix returns an error if a given prefix is invalid.


type CachingOptions

type CachingOptions struct {
	CacheDirectory            string `json:"cacheDirectory,omitempty"`
	MaxCacheSizeBytes         int64  `json:"maxCacheSize,omitempty"`
	MaxMetadataCacheSizeBytes int64  `json:"maxMetadataCacheSize,omitempty"`
	MaxListCacheDurationSec   int    `json:"maxListCacheDuration,omitempty"`
	HMACSecret                []byte `json:"-"`

CachingOptions specifies configuration of local cache.

func (*CachingOptions) CloneOrDefault added in v0.6.0

func (c *CachingOptions) CloneOrDefault() *CachingOptions

CloneOrDefault returns a clone of the caching options or empty options for nil.

type CompactOptions

type CompactOptions struct {
	MaxSmallBlobs                    int
	AllIndexes                       bool
	DropDeletedBefore                time.Time
	DropContents                     []ID
	DisableEventualConsistencySafety bool

CompactOptions provides options for compaction.

type Format

type Format struct {
	Version    byte   // format version number must be 0x01
	KeySize    byte   // size of each key in bytes
	EntrySize  uint16 // size of each entry in bytes, big-endian
	EntryCount uint32 // number of sorted (key,value) entries that follow

	Entries []struct {
		Key   []byte // key bytes (KeySize)
		Entry entry

	ExtraData []byte // extra data

Format describes a format of a single pack index. The actual structure is not used, it's purely for documentation purposes. The struct is byte-aligned.

type FormattingOptions

type FormattingOptions struct {
	Version     int    `json:"version,omitempty"`     // version number, must be "1"
	Hash        string `json:"hash,omitempty"`        // identifier of the hash algorithm used
	Encryption  string `json:"encryption,omitempty"`  // identifier of the encryption algorithm used
	HMACSecret  []byte `json:"secret,omitempty"`      // HMAC secret used to generate encryption keys
	MasterKey   []byte `json:"masterKey,omitempty"`   // master encryption key (SIV-mode encryption only)
	MaxPackSize int    `json:"maxPackSize,omitempty"` // maximum size of a pack object

FormattingOptions describes the rules for formatting contents in repository.

func (*FormattingOptions) GetEncryptionAlgorithm added in v0.5.2

func (f *FormattingOptions) GetEncryptionAlgorithm() string

GetEncryptionAlgorithm implements encryption.Parameters.

func (*FormattingOptions) GetHashFunction added in v0.5.2

func (f *FormattingOptions) GetHashFunction() string

GetHashFunction implements hashing.Parameters.

func (*FormattingOptions) GetHmacSecret added in v0.8.0

func (f *FormattingOptions) GetHmacSecret() []byte

GetHmacSecret implements hashing.Parameters.

func (*FormattingOptions) GetMasterKey added in v0.5.2

func (f *FormattingOptions) GetMasterKey() []byte

GetMasterKey implements encryption.Parameters.

type ID

type ID string

ID is an identifier of content in content-addressable storage.

func (ID) HasPrefix

func (i ID) HasPrefix() bool

HasPrefix determines if the given ID has a non-empty prefix.

func (ID) Prefix

func (i ID) Prefix() ID

Prefix returns a one-character prefix of a content ID or an empty string.

type IDRange added in v0.6.0

type IDRange struct {
	StartID ID // inclusive
	EndID   ID // exclusive

IDRange represents a range of IDs.

func PrefixRange added in v0.6.0

func PrefixRange(prefix ID) IDRange

PrefixRange returns ID range that contains all IDs with a given prefix.

func (IDRange) Contains added in v0.6.0

func (r IDRange) Contains(id ID) bool

Contains determines whether given ID is in the range.

type IndexBlobInfo

type IndexBlobInfo struct {
	Superseded []blob.Metadata

IndexBlobInfo is an information about a single index blob managed by Manager.

type IndexBlobReader added in v0.8.0

type IndexBlobReader interface {
	ParseIndexBlob(ctx context.Context, blobID blob.ID) ([]Info, error)
	DecryptBlob(ctx context.Context, blobID blob.ID) ([]byte, error)
	IndexBlobs(ctx context.Context, includeInactive bool) ([]IndexBlobInfo, error)

IndexBlobReader defines content read API.

type Info

type Info struct {
	ID               ID      `json:"contentID"`
	Length           uint32  `json:"length"`
	TimestampSeconds int64   `json:"time"`
	PackBlobID       blob.ID `json:"packFile,omitempty"`
	PackOffset       uint32  `json:"packOffset,omitempty"`
	Deleted          bool    `json:"deleted"`
	FormatVersion    byte    `json:"formatVersion"`

Info is an information about a single piece of content managed by Manager.

func (*Info) Timestamp

func (i *Info) Timestamp() time.Time

Timestamp returns the time when a content was created or deleted.

type IterateCallback

type IterateCallback func(Info) error

IterateCallback is the function type used as a callback during content iteration.

type IterateOptions

type IterateOptions struct {
	Range          IDRange
	IncludeDeleted bool
	Parallel       int

IterateOptions contains the options used for iterating over content.

type IteratePackOptions

type IteratePackOptions struct {
	IncludePacksWithOnlyDeletedContent bool
	IncludeContentInfos                bool
	Prefixes                           []blob.ID

IteratePackOptions are the options used to iterate over packs.

type IteratePacksCallback

type IteratePacksCallback func(PackInfo) error

IteratePacksCallback is the function type used as callback during pack iteration.

type ManagerOptions added in v0.6.0

type ManagerOptions struct {
	RepositoryFormatBytes []byte
	TimeNow               func() time.Time // Time provider
	// contains filtered or unexported fields

ManagerOptions are the optional parameters for manager creation.

func (*ManagerOptions) CloneOrDefault added in v0.8.0

func (o *ManagerOptions) CloneOrDefault() *ManagerOptions

CloneOrDefault returns a clone of provided ManagerOptions or default empty struct if nil.

type PackInfo

type PackInfo struct {
	PackID       blob.ID
	ContentCount int
	TotalSize    int64
	ContentInfos []Info

PackInfo contains the data for a pack.

type Reader added in v0.8.0

type Reader interface {
	ContentFormat() FormattingOptions
	GetContent(ctx context.Context, id ID) ([]byte, error)
	ContentInfo(ctx context.Context, id ID) (Info, error)
	IterateContents(ctx context.Context, opts IterateOptions, callback IterateCallback) error
	IteratePacks(ctx context.Context, opts IteratePackOptions, callback IteratePacksCallback) error
	ListActiveSessions(ctx context.Context) (map[SessionID]*SessionInfo, error)

Reader defines content read API.

type SessionID added in v0.8.0

type SessionID string

SessionID represents identifier of a session.

func SessionIDFromBlobID added in v0.8.0

func SessionIDFromBlobID(b blob.ID) SessionID

SessionIDFromBlobID returns session ID from a given blob ID or empty string if it's not a session blob ID.

type SessionInfo added in v0.8.0

type SessionInfo struct {
	ID             SessionID `json:"id"`
	StartTime      time.Time `json:"startTime"`
	CheckpointTime time.Time `json:"checkpointTime"`
	User           string    `json:"username"`
	Host           string    `json:"hostname"`

SessionInfo describes a particular session and is persisted in Session blob.

type SessionOptions added in v0.8.0

type SessionOptions struct {
	SessionUser string
	SessionHost string
	OnUpload    func(int64)

SessionOptions specifies session options.

type SharedManager added in v0.8.0

type SharedManager struct {
	Stats *Stats
	// contains filtered or unexported fields

SharedManager is responsible for read-only access to committed data.

func NewSharedManager added in v0.8.0

func NewSharedManager(ctx context.Context, st blob.Storage, f *FormattingOptions, caching *CachingOptions, opts *ManagerOptions) (*SharedManager, error)

NewSharedManager returns SharedManager that is used by SessionWriteManagers on top of a repository.

func (*SharedManager) IndexBlobs added in v0.8.0

func (sm *SharedManager) IndexBlobs(ctx context.Context, includeInactive bool) ([]IndexBlobInfo, error)

IndexBlobs returns the list of active index blobs.

func (*SharedManager) ParseIndexBlob added in v0.8.0

func (sm *SharedManager) ParseIndexBlob(ctx context.Context, blobID blob.ID) ([]Info, error)

ParseIndexBlob loads entries in a given index blob and returns them.

type Stats

type Stats struct {
	// contains filtered or unexported fields

Stats exposes statistics about content operation.

func (*Stats) DecryptedBytes

func (s *Stats) DecryptedBytes() int64

DecryptedBytes returns the approximate total number of decrypted bytes.

func (*Stats) EncryptedBytes

func (s *Stats) EncryptedBytes() int64

EncryptedBytes returns the approximate total number of decrypted bytes.

func (*Stats) HashedContent added in v0.6.0

func (s *Stats) HashedContent() (count uint32, bytes int64)

HashedContent returns the approximate hashed content count and their total size in bytes.

func (*Stats) InvalidContents

func (s *Stats) InvalidContents() uint32

InvalidContents returns the approximate count of invalid contents found.

func (*Stats) ReadContent added in v0.6.0

func (s *Stats) ReadContent() (count uint32, bytes int64)

ReadContent returns the approximate read content count and their total size in bytes.

func (*Stats) Reset

func (s *Stats) Reset()

Reset clears all content statistics.

func (*Stats) ValidContents

func (s *Stats) ValidContents() uint32

ValidContents returns the approximate count of valid contents found.

func (*Stats) WrittenContent added in v0.6.0

func (s *Stats) WrittenContent() (count uint32, bytes int64)

WrittenContent returns the approximate written content count and their total size in bytes.

type WriteManager added in v0.8.0

type WriteManager struct {
	// contains filtered or unexported fields

WriteManager builds content-addressable storage with encryption, deduplication and packaging on top of BLOB store.

func NewManager

func NewManager(ctx context.Context, st blob.Storage, f *FormattingOptions, caching *CachingOptions, options *ManagerOptions) (*WriteManager, error)

NewManager creates new content manager with given packing options and a formatter.

func NewWriteManager added in v0.8.0

func NewWriteManager(sm *SharedManager, options SessionOptions) *WriteManager

NewWriteManager returns a session write manager.

func (*WriteManager) Close added in v0.8.0

func (bm *WriteManager) Close(ctx context.Context) error

Close closes the content manager.

func (*WriteManager) CompactIndexes added in v0.8.0

func (bm *WriteManager) CompactIndexes(ctx context.Context, opt CompactOptions) error

CompactIndexes performs compaction of index blobs ensuring that # of small index blobs is below opt.maxSmallBlobs.

func (*WriteManager) ContentFormat added in v0.8.0

func (bm *WriteManager) ContentFormat() FormattingOptions

ContentFormat returns formatting options.

func (*WriteManager) ContentInfo added in v0.8.0

func (bm *WriteManager) ContentInfo(ctx context.Context, contentID ID) (Info, error)

ContentInfo returns information about a single content.

func (*WriteManager) DecryptBlob added in v0.8.0

func (bm *WriteManager) DecryptBlob(ctx context.Context, blobID blob.ID) ([]byte, error)

DecryptBlob returns the contents of an encrypted blob that can be decrypted (n,m,l).

func (*WriteManager) DeleteContent added in v0.8.0

func (bm *WriteManager) DeleteContent(ctx context.Context, contentID ID) error

DeleteContent marks the given contentID as deleted.

NOTE: To avoid race conditions only contents that cannot be possibly re-created should ever be deleted. That means that contents of such contents should include some element of randomness or a contemporaneous timestamp that will never reappear.

func (*WriteManager) DisableIndexFlush added in v0.8.0

func (bm *WriteManager) DisableIndexFlush(ctx context.Context)

DisableIndexFlush increments the counter preventing automatic index flushes.

func (*WriteManager) EnableIndexFlush added in v0.8.0

func (bm *WriteManager) EnableIndexFlush(ctx context.Context)

EnableIndexFlush decrements the counter preventing automatic index flushes. The flushes will be reenabled when the index drops to zero.

func (*WriteManager) Flush added in v0.8.0

func (bm *WriteManager) Flush(ctx context.Context) error

Flush completes writing any pending packs and writes pack indexes to the underlying storage. Any pending writes completed before Flush() has started are guaranteed to be committed to the repository before Flush() returns.

func (*WriteManager) GetContent added in v0.8.0

func (bm *WriteManager) GetContent(ctx context.Context, contentID ID) (v []byte, err error)

GetContent gets the contents of a given content. If the content is not found returns ErrContentNotFound.

func (*WriteManager) IterateContents added in v0.8.0

func (bm *WriteManager) IterateContents(ctx context.Context, opts IterateOptions, callback IterateCallback) error

IterateContents invokes the provided callback for each content starting with a specified prefix and possibly including deleted items.

func (*WriteManager) IteratePacks added in v0.8.0

func (bm *WriteManager) IteratePacks(ctx context.Context, options IteratePackOptions, callback IteratePacksCallback) error

IteratePacks invokes the provided callback for all pack blobs.

func (*WriteManager) IterateUnreferencedBlobs added in v0.8.0

func (bm *WriteManager) IterateUnreferencedBlobs(ctx context.Context, blobPrefixes []blob.ID, parallellism int, callback func(blob.Metadata) error) error

IterateUnreferencedBlobs returns the list of unreferenced storage blobs.

func (*WriteManager) ListActiveSessions added in v0.8.0

func (bm *WriteManager) ListActiveSessions(ctx context.Context) (map[SessionID]*SessionInfo, error)

ListActiveSessions returns a set of all active sessions in a given storage.

func (*WriteManager) RecoverIndexFromPackBlob added in v0.8.0

func (bm *WriteManager) RecoverIndexFromPackBlob(ctx context.Context, packFile blob.ID, packFileLength int64, commit bool) ([]Info, error)

RecoverIndexFromPackBlob attempts to recover index blob entries from a given pack file. Pack file length may be provided (if known) to reduce the number of bytes that are read from the storage.

func (*WriteManager) Refresh added in v0.8.0

func (bm *WriteManager) Refresh(ctx context.Context) (bool, error)

Refresh reloads the committed content indexes.

func (*WriteManager) Revision added in v0.8.0

func (bm *WriteManager) Revision() int64

Revision returns data revision number that changes on each write or refresh.

func (*WriteManager) RewriteContent added in v0.8.0

func (bm *WriteManager) RewriteContent(ctx context.Context, contentID ID) error

RewriteContent causes reads and re-writes a given content using the most recent format.

func (*WriteManager) SyncMetadataCache added in v0.8.0

func (bm *WriteManager) SyncMetadataCache(ctx context.Context) error

SyncMetadataCache synchronizes metadata cache with metadata blobs in storage.

func (*WriteManager) UndeleteContent added in v0.8.0

func (bm *WriteManager) UndeleteContent(ctx context.Context, contentID ID) error

UndeleteContent rewrites the content with the given ID if the content exists and is mark deleted. If the content exists and is not marked deleted, this operation is a no-op.

func (*WriteManager) WriteContent added in v0.8.0

func (bm *WriteManager) WriteContent(ctx context.Context, data []byte, prefix ID) (ID, error)

WriteContent saves a given content of data to a pack group with a provided name and returns a contentID that's based on the contents of data written.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
t or T : Toggle theme light dark auto
y or Y : Canonical URL