// expandSparse grows the file with zero blocks of 4096 // A small blocksize is chosen to aid in deduplication func (dm *DagModifier) expandSparse(size int64) error { r := io.LimitReader(zeroReader{}, size) spl := chunk.NewSizeSplitter(r, 4096) blks, errs := chunk.Chan(spl) nnode, err := dm.appendData(dm.curNode, blks, errs) if err != nil { return err } _, err = dm.dagserv.Add(nnode) if err != nil { return err } dm.curNode = nnode return nil }
// Sync writes changes to this dag to disk func (dm *DagModifier) Sync() error { // No buffer? Nothing to do if dm.wrBuf == nil { return nil } // If we have an active reader, kill it if dm.read != nil { dm.read = nil dm.readCancel() } // Number of bytes we're going to write buflen := dm.wrBuf.Len() // Grab key for unpinning after mod operation curk, err := dm.curNode.Key() if err != nil { return err } // overwrite existing dag nodes thisk, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) if err != nil { return err } nd, err := dm.dagserv.Get(dm.ctx, thisk) if err != nil { return err } dm.curNode = nd // need to write past end of current dag if !done { blks, errs := chunk.Chan(dm.splitter(dm.wrBuf)) nd, err = dm.appendData(dm.curNode, blks, errs) if err != nil { return err } thisk, err = dm.dagserv.Add(nd) if err != nil { return err } dm.curNode = nd } // Finalize correct pinning, and flush pinner dm.mp.PinWithMode(thisk, pin.Recursive) dm.mp.RemovePinWithMode(curk, pin.Recursive) err = dm.mp.Flush() if err != nil { return err } dm.writeStart += uint64(buflen) dm.wrBuf = nil return nil }