Version: v0.12.1 Latest Latest

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

Go to latest
Published: Oct 1, 2022 License: Apache-2.0 Imports: 47 Imported by: 4



Package content implements repository support for content-addressable storage.



View Source
const (
	DefaultMetadataCacheSweepAge = 24 * time.Hour
	DefaultDataCacheSweepAge     = 10 * time.Minute
	DefaultIndexCacheSweepAge    = 1 * time.Hour

constants below specify how long to prevent cache entries from expiring.

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

	NoCompression compression.HeaderID = 0

	FormatLogModule = "kopia/format"

	DefaultIndexVersion = 2

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
const LegacyIndexBlobPrefix = "n"

LegacyIndexBlobPrefix is the prefix for all legacy (v0) index blobs.

View Source
const TextLogBlobPrefix = "_log_"

TextLogBlobPrefix is a prefix given to text logs stored in repositor.


View Source
var EmptyID = index.EmptyID

EmptyID is an empty content ID.

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 DecryptBLOB added in v0.12.0

func DecryptBLOB(c crypter, payload gather.Bytes, blobID blob.ID, output *gather.WriteBuffer) error

DecryptBLOB decrypts the provided data using provided blobID to derive initialization vector.

func EncryptBLOB added in v0.12.0

func EncryptBLOB(c crypter, payload gather.Bytes, prefix blob.ID, sessionID SessionID, output *gather.WriteBuffer) (blob.ID, error)

EncryptBLOB encrypts the given data using crypter-defined key and returns a name that should be used to save the blob in thre repository.

func IDsToStrings added in v0.10.6

func IDsToStrings(input []ID) []string

IDsToStrings converts the IDs to strings.

func WriteLegacyIndexPoisonBlob added in v0.12.0

func WriteLegacyIndexPoisonBlob(ctx context.Context, st blob.Storage) error

WriteLegacyIndexPoisonBlob writes a "poison blob" that will prevent old kopia clients that have not been upgraded from being able to open the repository after its format has been upgraded.


type CachingOptions

type CachingOptions struct {
	CacheDirectory            string          `json:"cacheDirectory,omitempty"`
	MaxCacheSizeBytes         int64           `json:"maxCacheSize,omitempty"`
	MaxMetadataCacheSizeBytes int64           `json:"maxMetadataCacheSize,omitempty"`
	MaxListCacheDuration      DurationSeconds `json:"maxListCacheDuration,omitempty"`
	MinMetadataSweepAge       DurationSeconds `json:"minMetadataSweepAge,omitempty"`
	MinContentSweepAge        DurationSeconds `json:"minContentSweepAge,omitempty"`
	MinIndexSweepAge          DurationSeconds `json:"minIndexSweepAge,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 DurationSeconds added in v0.9.7

type DurationSeconds float64

DurationSeconds represents the duration in seconds.

func (DurationSeconds) DurationOrDefault added in v0.9.7

func (s DurationSeconds) DurationOrDefault(def time.Duration) time.Duration

DurationOrDefault returns the duration or the provided default if not set or zero.

type ID

type ID = index.ID

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

func IDFromHash added in v0.11.0

func IDFromHash(prefix IDPrefix, hash []byte) (ID, error)

IDFromHash creates and validates content ID from a prefix and hash.

func IDsFromStrings added in v0.10.6

func IDsFromStrings(str []string) ([]ID, error)

IDsFromStrings converts strings to IDs.

func ParseID added in v0.11.0

func ParseID(s string) (ID, error)

ParseID parses the provided string as content ID.

type IDPrefix added in v0.11.0

type IDPrefix = index.IDPrefix

IDPrefix represents a content ID prefix (empty string or single character between 'g' and 'z').

type IDRange added in v0.6.0

type IDRange = index.IDRange

IDRange represents a range of IDs.

type IndexBlobInfo

type IndexBlobInfo struct {
	Superseded []blob.Metadata

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

type IndexFormattingOptions added in v0.12.0

type IndexFormattingOptions interface {
	GetMutableParameters() (format.MutableParameters, error)

IndexFormattingOptions provides options for formatting index blobs.

type Info

type Info = index.Info

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

func ParseIndexBlob added in v0.9.0

func ParseIndexBlob(ctx context.Context, blobID blob.ID, encrypted gather.Bytes, crypter crypter) ([]Info, error)

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

type InfoStruct added in v0.9.0

type InfoStruct = index.InfoStruct

InfoStruct is an implementation of Info based on a structure.

func ToInfoStruct added in v0.9.0

func ToInfoStruct(i Info) *InfoStruct

ToInfoStruct converts the provided Info to *InfoStruct.

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 {
	TimeNow            func() time.Time // Time provider
	DisableInternalLog bool
	RetentionMode      string
	RetentionPeriod    time.Duration

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 {
	SupportsContentCompression() (bool, error)
	ContentFormat() format.Provider
	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)
	EpochManager() (*epoch.Manager, bool, 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, prov format.Provider, caching *CachingOptions, opts *ManagerOptions) (*SharedManager, error)

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

func (*SharedManager) AlsoLogToContentLog added in v0.9.5

func (sm *SharedManager) AlsoLogToContentLog(ctx context.Context) context.Context

AlsoLogToContentLog wraps the provided content so that all logs are also sent to internal content log.

func (*SharedManager) CompactIndexes added in v0.9.0

func (sm *SharedManager) CompactIndexes(ctx context.Context, opt CompactOptions) error

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

func (*SharedManager) EpochManager added in v0.9.0

func (sm *SharedManager) EpochManager() (*epoch.Manager, bool, error)

EpochManager returns the epoch manager.

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) PrepareUpgradeToIndexBlobManagerV1 added in v0.9.0

func (sm *SharedManager) PrepareUpgradeToIndexBlobManagerV1(ctx context.Context, params epoch.Parameters) error

PrepareUpgradeToIndexBlobManagerV1 prepares the repository for migrating to IndexBlobManagerV1.

func (*SharedManager) Refresh added in v0.9.0

func (sm *SharedManager) Refresh(ctx context.Context) error

Refresh reloads the committed content indexes.

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 NewManagerForTesting added in v0.9.0

func NewManagerForTesting(ctx context.Context, st blob.Storage, f format.Provider, caching *CachingOptions, options *ManagerOptions) (*WriteManager, error)

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

func NewWriteManager added in v0.8.0

func NewWriteManager(ctx context.Context, sm *SharedManager, options SessionOptions, writeManagerID string) *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) ContentFormat added in v0.8.0

func (bm *WriteManager) ContentFormat() format.Provider

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) 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) DisableIndexRefresh added in v0.9.0

func (bm *WriteManager) DisableIndexRefresh()

DisableIndexRefresh disables index refresh for the remainder of this session.

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) MetadataCache added in v0.10.7

func (bm *WriteManager) MetadataCache() cache.ContentCache

MetadataCache returns an instance of metadata cache.

func (*WriteManager) PrefetchContents added in v0.10.6

func (bm *WriteManager) PrefetchContents(ctx context.Context, contentIDs []ID, hint string) []ID

PrefetchContents fetches the provided content IDs into the cache. Note that due to cache configuration, it's not guaranteed that all contents will actually be added to the cache.

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) 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. TODO(jkowalski): this will currently always re-encrypt and re-compress data, perhaps consider a pass-through mode that preserves encrypted/compressed bits.

func (*WriteManager) SupportsContentCompression added in v0.9.0

func (bm *WriteManager) SupportsContentCompression() (bool, error)

SupportsContentCompression returns true if content manager supports content-compression.

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 gather.Bytes, prefix index.IDPrefix, comp compression.HeaderID) (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.


Path Synopsis
Package index manages content indices.
Package index manages content indices.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL