mirror of
https://github.com/kopia/kopia.git
synced 2026-03-15 21:01:37 -04:00
simplified pack manager
This commit is contained in:
@@ -22,8 +22,7 @@ type packManager struct {
|
||||
packIndexes packIndexes
|
||||
|
||||
blockIDToPackedObjectID map[string]ObjectID
|
||||
currentPackDataWriter ObjectWriter
|
||||
currentPackDataOffset int
|
||||
currentPackData bytes.Buffer
|
||||
currentPackIndexes packIndexes
|
||||
currentPackIndex *packIndex
|
||||
currentPackID string
|
||||
@@ -72,25 +71,20 @@ func (p *packManager) AddToPack(blockID string, data []byte) (ObjectID, error) {
|
||||
|
||||
//log.Printf("%q not found in %v", blockID, p.blockIDToPackedObjectID)
|
||||
|
||||
if p.currentPackDataWriter == nil {
|
||||
if p.currentPackIndex == nil {
|
||||
p.currentPackIndex = &packIndex{
|
||||
Items: make(map[string]string),
|
||||
}
|
||||
p.currentPackID = p.newPackID()
|
||||
p.currentPackIndexes[p.currentPackID] = p.currentPackIndex
|
||||
p.currentPackDataOffset = 0
|
||||
p.currentPackDataWriter = p.objectManager.NewWriter(WriterOptions{
|
||||
splitter: newNeverSplitter(),
|
||||
disablePacking: true,
|
||||
})
|
||||
p.currentPackData.Reset()
|
||||
}
|
||||
|
||||
offset := p.currentPackDataOffset
|
||||
p.currentPackDataOffset += len(data)
|
||||
p.currentPackDataWriter.Write(data)
|
||||
offset := p.currentPackData.Len()
|
||||
p.currentPackData.Write(data)
|
||||
p.currentPackIndex.Items[blockID] = fmt.Sprintf("%v+%v", int64(offset), int64(len(data)))
|
||||
|
||||
if p.currentPackDataOffset >= p.objectManager.format.MaxPackFileLength {
|
||||
if p.currentPackData.Len() >= p.objectManager.format.MaxPackFileLength {
|
||||
if err := p.finishCurrentPackLocked(); err != nil {
|
||||
return NullObjectID, err
|
||||
}
|
||||
@@ -120,19 +114,27 @@ func (p *packManager) finishPacking() error {
|
||||
}
|
||||
|
||||
func (p *packManager) finishCurrentPackLocked() error {
|
||||
if p.currentPackDataWriter == nil {
|
||||
if p.currentPackIndex == nil {
|
||||
return nil
|
||||
}
|
||||
w := p.currentPackDataWriter
|
||||
p.currentPackDataWriter = nil
|
||||
w := p.objectManager.NewWriter(WriterOptions{
|
||||
splitter: newNeverSplitter(),
|
||||
disablePacking: true,
|
||||
})
|
||||
defer w.Close()
|
||||
|
||||
if _, err := p.currentPackData.WriteTo(w); err != nil {
|
||||
return fmt.Errorf("unable to write pack: %v", err)
|
||||
}
|
||||
p.currentPackData.Reset()
|
||||
oid, err := w.Result(true)
|
||||
p.currentPackDataWriter = nil
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("can't save pack data: %v", err)
|
||||
}
|
||||
|
||||
p.currentPackIndex.PackObject = oid.String()
|
||||
p.currentPackIndex = nil
|
||||
|
||||
var jb bytes.Buffer
|
||||
if err := json.NewEncoder(&jb).Encode(p.currentPackIndexes); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user