diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index eddf221f4..61f480e9e 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -63,7 +63,12 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { // TODO: this is currently VERY inneficient // each write that happens at an offset other than the current one causes a // flush to disk, and dag rewrite - if uint64(offset) != dm.curWrOff { + if offset == int64(dm.writeStart) && dm.wrBuf != nil { + // If we would overwrite the previous write + if len(b) >= dm.wrBuf.Len() { + dm.wrBuf.Reset() + } + } else if uint64(offset) != dm.curWrOff { size, err := dm.Size() if err != nil { return 0, err @@ -242,6 +247,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) var cur uint64 var done bool for i, bs := range f.GetBlocksizes() { + // We found the correct child to write into if cur+bs > offset { child, err := node.Links[i].GetNode(dm.dagserv) if err != nil { @@ -256,6 +262,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) node.Links[i].Hash = mh.Multihash(k) if sdone { + // No more bytes to write! done = true break } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index e6b51315f..90c6d99e5 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -314,7 +314,6 @@ func TestMultiWriteCoal(t *testing.T) { u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { - log.Error(i) n, err := dagmod.WriteAt(data[:i+1], 0) if err != nil { fmt.Println("FAIL AT ", i)