Skip to content

Commit 074bb1c

Browse files
StebalienKubuxu
authored andcommitted
don't make assumptions about readers in the dagmodifier
The dagmodifier *only* works because we're using a bytes.Buffer. License: MIT Signed-off-by: Steven Allen <[email protected]>
1 parent 21f4c6f commit 074bb1c

File tree

1 file changed

+24
-39
lines changed

1 file changed

+24
-39
lines changed

unixfs/mod/dagmodifier.go

+24-39
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func (dm *DagModifier) Sync() error {
202202
buflen := dm.wrBuf.Len()
203203

204204
// overwrite existing dag nodes
205-
thisc, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf)
205+
thisc, err := dm.modifyDag(dm.curNode, dm.writeStart)
206206
if err != nil {
207207
return err
208208
}
@@ -213,7 +213,7 @@ func (dm *DagModifier) Sync() error {
213213
}
214214

215215
// need to write past end of current dag
216-
if !done {
216+
if dm.wrBuf.Len() > 0 {
217217
dm.curNode, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf))
218218
if err != nil {
219219
return err
@@ -231,45 +231,38 @@ func (dm *DagModifier) Sync() error {
231231
return nil
232232
}
233233

234-
// modifyDag writes the data in 'data' over the data in 'node' starting at 'offset'
235-
// returns the new key of the passed in node and whether or not all the data in the reader
236-
// has been consumed.
237-
func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) {
234+
// modifyDag writes the data in 'dm.wrBuf' over the data in 'node' starting at 'offset'
235+
// returns the new key of the passed in node.
236+
func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) {
238237
// If we've reached a leaf node.
239238
if len(n.Links()) == 0 {
240239
switch nd0 := n.(type) {
241240
case *mdag.ProtoNode:
242241
f, err := ft.FromBytes(nd0.Data())
243242
if err != nil {
244-
return nil, false, err
243+
return nil, err
245244
}
246245

247-
n, err := data.Read(f.Data[offset:])
246+
_, err = dm.wrBuf.Read(f.Data[offset:])
248247
if err != nil && err != io.EOF {
249-
return nil, false, err
248+
return nil, err
250249
}
251250

252251
// Update newly written node..
253252
b, err := proto.Marshal(f)
254253
if err != nil {
255-
return nil, false, err
254+
return nil, err
256255
}
257256

258257
nd := new(mdag.ProtoNode)
259258
nd.SetData(b)
260259
nd.SetPrefix(&nd0.Prefix)
261260
err = dm.dagserv.Add(dm.ctx, nd)
262261
if err != nil {
263-
return nil, false, err
264-
}
265-
266-
// Hey look! we're done!
267-
var done bool
268-
if n < len(f.Data[offset:]) {
269-
done = true
262+
return nil, err
270263
}
271264

272-
return nd.Cid(), done, nil
265+
return nd.Cid(), nil
273266
case *mdag.RawNode:
274267
origData := nd0.RawData()
275268
bytes := make([]byte, len(origData))
@@ -278,9 +271,9 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
278271
copy(bytes, origData[:offset])
279272

280273
// copy in new data
281-
n, err := data.Read(bytes[offset:])
274+
n, err := dm.wrBuf.Read(bytes[offset:])
282275
if err != nil && err != io.EOF {
283-
return nil, false, err
276+
return nil, err
284277
}
285278

286279
// copy remaining data
@@ -291,59 +284,51 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
291284

292285
nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix())
293286
if err != nil {
294-
return nil, false, err
287+
return nil, err
295288
}
296289
err = dm.dagserv.Add(dm.ctx, nd)
297290
if err != nil {
298-
return nil, false, err
299-
}
300-
301-
// Hey look! we're done!
302-
var done bool
303-
if n < len(bytes[offset:]) {
304-
done = true
291+
return nil, err
305292
}
306293

307-
return nd.Cid(), done, nil
294+
return nd.Cid(), nil
308295
}
309296
}
310297

311298
node, ok := n.(*mdag.ProtoNode)
312299
if !ok {
313-
return nil, false, ErrNotUnixfs
300+
return nil, ErrNotUnixfs
314301
}
315302

316303
f, err := ft.FromBytes(node.Data())
317304
if err != nil {
318-
return nil, false, err
305+
return nil, err
319306
}
320307

321308
var cur uint64
322-
var done bool
323309
for i, bs := range f.GetBlocksizes() {
324310
// We found the correct child to write into
325311
if cur+bs > offset {
326312
child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv)
327313
if err != nil {
328-
return nil, false, err
314+
return nil, err
329315
}
330316

331-
k, sdone, err := dm.modifyDag(child, offset-cur, data)
317+
k, err := dm.modifyDag(child, offset-cur)
332318
if err != nil {
333-
return nil, false, err
319+
return nil, err
334320
}
335321

336322
node.Links()[i].Cid = k
337323

338324
// Recache serialized node
339325
_, err = node.EncodeProtobuf(true)
340326
if err != nil {
341-
return nil, false, err
327+
return nil, err
342328
}
343329

344-
if sdone {
330+
if dm.wrBuf.Len() == 0 {
345331
// No more bytes to write!
346-
done = true
347332
break
348333
}
349334
offset = cur + bs
@@ -352,7 +337,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
352337
}
353338

354339
err = dm.dagserv.Add(dm.ctx, node)
355-
return node.Cid(), done, err
340+
return node.Cid(), err
356341
}
357342

358343
// appendData appends the blocks from the given chan to the end of this dag

0 commit comments

Comments
 (0)