Documentation ¶
Index ¶
- Constants
- type CollectionMetadata
- type Demultiplexer
- func (demux *Demultiplexer) BodyBSON(buf []byte) error
- func (demux *Demultiplexer) End() error
- func (demux *Demultiplexer) HeaderBSON(buf []byte) error
- func (demux *Demultiplexer) NewPrioritizer(mgr *intents.Manager) *Prioritizer
- func (demux *Demultiplexer) Open(ns string, out DemuxOut)
- func (demux *Demultiplexer) Run() error
- type DemuxOut
- type DirLike
- type Header
- type MetadataFile
- type MetadataPreludeFile
- type Multiplexer
- type MutedCollection
- type MuxIn
- type NamespaceHeader
- type Parser
- type ParserConsumer
- type Prelude
- type PreludeExplorer
- func (pe *PreludeExplorer) IsDir() bool
- func (pe *PreludeExplorer) Name() string
- func (pe *PreludeExplorer) Parent() DirLike
- func (pe *PreludeExplorer) Path() string
- func (pe *PreludeExplorer) ReadDir() ([]DirLike, error)
- func (pe *PreludeExplorer) Size() int64
- func (pe *PreludeExplorer) Stat() (DirLike, error)
- type Prioritizer
- type Reader
- type RegularCollectionReceiver
- func (receiver *RegularCollectionReceiver) Close() error
- func (receiver *RegularCollectionReceiver) End()
- func (receiver *RegularCollectionReceiver) Open() error
- func (receiver *RegularCollectionReceiver) Pos() int64
- func (receiver *RegularCollectionReceiver) Read(r []byte) (int, error)
- func (receiver *RegularCollectionReceiver) ReleaseIOBuffer()
- func (receiver *RegularCollectionReceiver) Sum64() (uint64, bool)
- func (receiver *RegularCollectionReceiver) TakeIOBuffer(ioBuf []byte)
- func (receiver *RegularCollectionReceiver) Write(buf []byte) (int, error)
- type SpecialCollectionCache
- func (cache *SpecialCollectionCache) Close() error
- func (cache *SpecialCollectionCache) End()
- func (cache *SpecialCollectionCache) Open() error
- func (cache *SpecialCollectionCache) Pos() int64
- func (cache *SpecialCollectionCache) Read(p []byte) (int, error)
- func (cache *SpecialCollectionCache) Sum64() (uint64, bool)
- func (cache *SpecialCollectionCache) Write(b []byte) (int, error)
- type Writer
Constants ¶
const ( NamespaceUnopened = iota NamespaceOpened NamespaceClosed )
const MagicNumber uint32 = 0x8199e26d
MagicNumber is four bytes that are found at the beginning of the archive that indicate that the byte stream is an archive, as opposed to anything else, including a stream of BSON documents
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CollectionMetadata ¶
type CollectionMetadata struct { Database string `bson:"db"` Collection string `bson:"collection"` Metadata string `bson:"metadata"` Size int `bson:"size"` Type string `bson:"type"` }
CollectionMetadata is a data structure that, as BSON, is found in the prelude of the archive. There is one CollectionMetadata per collection that will be in the archive. For a CollectionMetadata for collection X with Type == "timeseries", there will be no data for collection X. Instead there will be data for collection system.buckets.X. Mongorestore will restore both the timeseries view and the underlying system.buckets collection.
type Demultiplexer ¶
type Demultiplexer struct { In io.Reader // NamespaceChan is used to send a namespace to a consumer of namespaces. NamespaceChan chan string // NamespaceErrorChan is used to receive an error or nil from a namespace // consumer immediately after each namespace is sent and validated. NamespaceErrorChan chan error NamespaceStatus map[string]int IsAtlasProxy bool // contains filtered or unexported fields }
Demultiplexer implements Parser.
func CreateDemux ¶
func CreateDemux(namespaceMetadatas []*CollectionMetadata, in io.Reader, isAtlasProxy bool) *Demultiplexer
func (*Demultiplexer) BodyBSON ¶
func (demux *Demultiplexer) BodyBSON(buf []byte) error
BodyBSON is part of the ParserConsumer interface and receives BSON bodies from the parser. Its main role is to dispatch the body to the Read() function of the current DemuxOut.
func (*Demultiplexer) End ¶
func (demux *Demultiplexer) End() error
End is part of the ParserConsumer interface and receives the end of archive notification.
func (*Demultiplexer) HeaderBSON ¶
func (demux *Demultiplexer) HeaderBSON(buf []byte) error
HeaderBSON is part of the ParserConsumer interface and receives headers from parser. Its main role is to implement opens and EOFs of the embedded stream.
func (*Demultiplexer) NewPrioritizer ¶
func (demux *Demultiplexer) NewPrioritizer(mgr *intents.Manager) *Prioritizer
NewPrioritizer creates a new Prioritizer and hooks up its Namespace channels to the ones in demux
func (*Demultiplexer) Open ¶
func (demux *Demultiplexer) Open(ns string, out DemuxOut)
Open installs the DemuxOut as the handler for data for the namespace ns
func (*Demultiplexer) Run ¶
func (demux *Demultiplexer) Run() error
Run creates and runs a parser with the Demultiplexer as a consumer
type DemuxOut ¶
DemuxOut is a Demultiplexer output consumer The Write() and End() occur in the same thread as the Demultiplexer runs in.
type DirLike ¶
type DirLike interface { Name() string Path() string Size() int64 IsDir() bool Stat() (DirLike, error) ReadDir() ([]DirLike, error) Parent() DirLike }
DirLike represents the group of methods done on directories and files in dump directories, or in archives, when mongorestore is figuring out what intents to create.
type Header ¶
type Header struct { ConcurrentCollections int32 `bson:"concurrent_collections"` FormatVersion string `bson:"version"` ServerVersion string `bson:"server_version"` ToolVersion string `bson:"tool_version"` }
Header is a data structure that, as BSON, is found immediately after the magic number in the archive, before any CollectionMetadatas. It is the home of any archive level information
type MetadataFile ¶
type MetadataFile struct { *bytes.Buffer Intent *intents.Intent // contains filtered or unexported fields }
MetadataFile implements intents.file
func (*MetadataFile) Close ¶
func (md *MetadataFile) Close() error
func (*MetadataFile) Open ¶
func (md *MetadataFile) Open() error
func (*MetadataFile) Pos ¶
func (md *MetadataFile) Pos() int64
type MetadataPreludeFile ¶
type MetadataPreludeFile struct { Intent *intents.Intent Origin string Prelude *Prelude *bytes.Buffer // contains filtered or unexported fields }
MetadataPreludeFile is part of the intents.file. It allows the metadata contained in the prelude to be opened and read
func (*MetadataPreludeFile) Close ¶
func (mpf *MetadataPreludeFile) Close() error
Close is part of the intents.file interface.
func (*MetadataPreludeFile) Open ¶
func (mpf *MetadataPreludeFile) Open() error
Open is part of the intents.file interface, it finds the metadata in the prelude and creates a bytes.Buffer from it.
func (*MetadataPreludeFile) Pos ¶
func (mpf *MetadataPreludeFile) Pos() int64
type Multiplexer ¶
type Multiplexer struct { Out io.WriteCloser Control chan *MuxIn Completed chan error // contains filtered or unexported fields }
Multiplexer is what one uses to create interleaved intents in an archive
func NewMultiplexer ¶
func NewMultiplexer(out io.WriteCloser, shutdownInputs notifier) *Multiplexer
NewMultiplexer creates a Multiplexer and populates its Control/Completed chans it takes a WriteCloser, which is where in inputs will get multiplexed on to, and it takes a notifier, which should allow the multiplexer to ask for the shutdown of the inputs.
func (*Multiplexer) Run ¶
func (mux *Multiplexer) Run()
Run multiplexes until it receives an EOF on its Control chan.
type MutedCollection ¶
type MutedCollection struct { Intent *intents.Intent Demux *Demultiplexer }
MutedCollection implements both DemuxOut as well as intents.file. It serves as a way to let the demutiplexer ignore certain embedded streams
func (*MutedCollection) Close ¶
func (*MutedCollection) Close() error
Close is part of the intents.file interface, and does nothing
func (*MutedCollection) End ¶
func (*MutedCollection) End()
End is part of the DemuxOut interface and does nothing.
func (*MutedCollection) Open ¶
func (*MutedCollection) Open() error
Open is part of the intents.file interface, and does nothing
func (*MutedCollection) Read ¶
func (*MutedCollection) Read([]byte) (int, error)
Read is part of the intents.file interface, and does nothing
func (*MutedCollection) Sum64 ¶
func (*MutedCollection) Sum64() (uint64, bool)
Sum64 is part of the DemuxOut interface
type MuxIn ¶
type MuxIn struct { Intent *intents.Intent Mux *Multiplexer // contains filtered or unexported fields }
MuxIn is an implementation of the intents.file interface. They live in the intents, and are potentially owned by different threads than the thread owning the Multiplexer. They are out the intents write data to the multiplexer
func (*MuxIn) Close ¶
Close closes the chans in the MuxIn. Ultimately the multiplexer will detect that they are closed and cause a formatEOF to occur.
type NamespaceHeader ¶
type NamespaceHeader struct { Database string `bson:"db"` Collection string `bson:"collection"` EOF bool `bson:"EOF"` CRC int64 `bson:"CRC"` }
NamespaceHeader is a data structure that, as BSON, is found in archives where it indicates that either the subsequent stream of BSON belongs to this new namespace, or that the indicated namespace will have no more documents (EOF)
type Parser ¶
Parser encapsulates the small amount of state that the parser needs to keep
func (*Parser) ReadAllBlocks ¶
func (parse *Parser) ReadAllBlocks(consumer ParserConsumer) (err error)
ReadAllBlocks calls ReadBlock() until it returns an error. If the error is EOF, then nil is returned, otherwise it returns the error
func (*Parser) ReadBlock ¶
func (parse *Parser) ReadBlock(consumer ParserConsumer) (err error)
ReadBlock reads one archive block ( header + body* + terminator ) calling consumer.HeaderBSON() on the header, consumer.BodyBSON() on each piece of body, and consumer.EOF() when EOF is encountered before any data was read. It returns nil if a whole block was read, io.EOF if nothing was read, and a parserError if there was any io error in the middle of the block, if either of the consumer methods return error, or if there was any sort of parsing failure.
type ParserConsumer ¶
ParserConsumer is the interface that one needs to implement to consume data from the Parser
type Prelude ¶
type Prelude struct { Header *Header DBS []string NamespaceMetadatas []*CollectionMetadata NamespaceMetadatasByDB map[string][]*CollectionMetadata }
Prelude represents the knowledge gleaned from reading the prelude out of the archive.
func NewPrelude ¶
func NewPrelude(manager *intents.Manager, concurrentColls int, serverVersion, toolVersion string) (*Prelude, error)
NewPrelude generates a Prelude using the contents of an intent.Manager.
func (*Prelude) AddMetadata ¶
func (prelude *Prelude) AddMetadata(cm *CollectionMetadata)
AddMetadata adds a metadata data structure to a prelude and does the required bookkeeping.
func (*Prelude) NewPreludeExplorer ¶
func (prelude *Prelude) NewPreludeExplorer() (*PreludeExplorer, error)
NewPreludeExplorer creates a PreludeExplorer from a Prelude.
type PreludeExplorer ¶
type PreludeExplorer struct {
// contains filtered or unexported fields
}
PreludeExplorer implements DirLike. PreludeExplorer represent the databases, collections, and their metadata json files, of an archive, in such a way that they can be explored like a filesystem.
func (*PreludeExplorer) IsDir ¶
func (pe *PreludeExplorer) IsDir() bool
IsDir is part of the DirLike interface. All pes that are not collections are Dirs.
func (*PreludeExplorer) Name ¶
func (pe *PreludeExplorer) Name() string
Name is part of the DirLike interface. It synthesizes a filename for the given "location" the prelude.
func (*PreludeExplorer) Parent ¶
func (pe *PreludeExplorer) Parent() DirLike
Parent is part of the DirLike interface. It returns a pe without a collection, if there is one, otherwise, without a database.
func (*PreludeExplorer) Path ¶
func (pe *PreludeExplorer) Path() string
Path is part of the DirLike interface. It creates the full path for the "location" in the prelude.
func (*PreludeExplorer) ReadDir ¶
func (pe *PreludeExplorer) ReadDir() ([]DirLike, error)
ReadDir is part of the DirLIke interface. ReadDir generates a list of PreludeExplorers whose "locations" are encapsulated by the current pes "location".
"dump/oplog.bson" => &PreludeExplorer{ database: "", collection: "oplog.bson" } "dump/test/" => &PreludeExplorer{ database: "test", collection: "foo.bson" } "dump/test/foo.bson" => &PreludeExplorer{ database: "test", collection: "" } "dump/test/foo.json" => &PreludeExplorer{ database: "test", collection: "foo", isMetadata: true }
func (*PreludeExplorer) Size ¶
func (pe *PreludeExplorer) Size() int64
Size is part of the DirLike interface. It returns the size from the metadata of the prelude, if the "location" is a collection.
func (*PreludeExplorer) Stat ¶
func (pe *PreludeExplorer) Stat() (DirLike, error)
Stat is part of the DirLike interface. os.Stat returns a FileInfo, and since DirLike is similar to FileInfo, we just return the pe, here.
type Prioritizer ¶
type Prioritizer struct { NamespaceChan <-chan string NamespaceErrorChan chan<- error // contains filtered or unexported fields }
Prioritizer is a completely reactive prioritizer Intents are handed out as they arrive in the archive
func (*Prioritizer) Finish ¶
func (prioritizer *Prioritizer) Finish(*intents.Intent)
Finish is part of the IntentPrioritizer interface, and does nothing
func (*Prioritizer) Get ¶
func (prioritizer *Prioritizer) Get() *intents.Intent
Get waits for a new namespace from the NamespaceChan, and returns a Intent found for it
type Reader ¶
type Reader struct { In io.ReadCloser Demux *Demultiplexer Prelude *Prelude }
Reader is the top level object to contain information about archives in mongorestore
type RegularCollectionReceiver ¶
type RegularCollectionReceiver struct { Intent *intents.Intent Origin string Demux *Demultiplexer // contains filtered or unexported fields }
RegularCollectionReceiver implements the intents.file interface.
func (*RegularCollectionReceiver) Close ¶
func (receiver *RegularCollectionReceiver) Close() error
Close is part of the DemuxOut as well as the intents.file interface. It only closes the readLenChan, as that is what will cause the RegularCollectionReceiver.Read() to receive EOF Close will get called twice, once in the demultiplexer, and again when the restore goroutine is done with its intent.file
func (*RegularCollectionReceiver) End ¶
func (receiver *RegularCollectionReceiver) End()
End signals to any waiting readers that there is nothing more to read, then it waits on the readBufChan, which is closed by the reader-side Close() method.
func (*RegularCollectionReceiver) Open ¶
func (receiver *RegularCollectionReceiver) Open() error
Open is part of the intents.file interface. It creates the chan's in the RegularCollectionReceiver and adds the RegularCollectionReceiver to the set of RegularCollectionReceivers in the demultiplexer
func (*RegularCollectionReceiver) Pos ¶
func (receiver *RegularCollectionReceiver) Pos() int64
func (*RegularCollectionReceiver) Read ¶
func (receiver *RegularCollectionReceiver) Read(r []byte) (int, error)
Read() runs in the restoring goroutine
func (*RegularCollectionReceiver) ReleaseIOBuffer ¶
func (receiver *RegularCollectionReceiver) ReleaseIOBuffer()
func (*RegularCollectionReceiver) Sum64 ¶
func (receiver *RegularCollectionReceiver) Sum64() (uint64, bool)
func (*RegularCollectionReceiver) TakeIOBuffer ¶
func (receiver *RegularCollectionReceiver) TakeIOBuffer(ioBuf []byte)
type SpecialCollectionCache ¶
type SpecialCollectionCache struct { Intent *intents.Intent Demux *Demultiplexer // contains filtered or unexported fields }
SpecialCollectionCache implements both DemuxOut as well as intents.file
func NewSpecialCollectionCache ¶
func NewSpecialCollectionCache(intent *intents.Intent, demux *Demultiplexer) *SpecialCollectionCache
func (*SpecialCollectionCache) Close ¶
func (cache *SpecialCollectionCache) Close() error
Close is part of the intents.file interface, and does nothing
func (*SpecialCollectionCache) End ¶
func (cache *SpecialCollectionCache) End()
End indicates we've read all there is to read, so we update the intent size based on the final length.
func (*SpecialCollectionCache) Open ¶
func (cache *SpecialCollectionCache) Open() error
Open is part of the both interfaces, and it does nothing
func (*SpecialCollectionCache) Pos ¶
func (cache *SpecialCollectionCache) Pos() int64
func (*SpecialCollectionCache) Read ¶
func (cache *SpecialCollectionCache) Read(p []byte) (int, error)
func (*SpecialCollectionCache) Sum64 ¶
func (cache *SpecialCollectionCache) Sum64() (uint64, bool)
type Writer ¶
type Writer struct { Out io.WriteCloser Prelude *Prelude Mux *Multiplexer }
Writer is the top level object to contain information about archives in mongodump