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 <steven@stebalien.com>
Steven Allen committed
Mar 7, 2018 at 18:25 UTC
d6589e5e1cda52dcda8788273e80ac58df8dc68a
1 file changed
+24
-39
unixfs/mod/dagmodifier.go
+24
-39
@@ -202,7 +202,7 @@ func (dm *DagModifier) Sync() error {
202
buflen := dm.wrBuf.Len()
203
204
// 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)
206
if err != nil {
207
return err
208
}
@@ -213,7 +213,7 @@ func (dm *DagModifier) Sync() error {
213
}
214
215
// need to write past end of current dag
216
- if !done {
216
+ if dm.wrBuf.Len() > 0 {
217
dm.curNode, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf))
218
if err != nil {
219
return err
@@ -231,28 +231,27 @@ func (dm *DagModifier) Sync() error {
231
return nil
232
}
233
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) {
237
// If we've reached a leaf node.
238
if len(n.Links()) == 0 {
239
switch nd0 := n.(type) {
240
case *mdag.ProtoNode:
241
f, err := ft.FromBytes(nd0.Data())
242
if err != nil {
244
- return nil, false, err
243
+ return nil, err
244
}
245
247
- n, err := data.Read(f.Data[offset:])
246
+ _, err = dm.wrBuf.Read(f.Data[offset:])
247
if err != nil && err != io.EOF {
249
- return nil, false, err
248
+ return nil, err
249
}
250
251
// Update newly written node..
252
b, err := proto.Marshal(f)
253
if err != nil {
255
- return nil, false, err
254
+ return nil, err
255
}
256
257
nd := new(mdag.ProtoNode)
@@ -260,16 +259,10 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
259
nd.SetPrefix(&nd0.Prefix)
260
err = dm.dagserv.Add(dm.ctx, nd)
261
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
263
}
264
272
- return nd.Cid(), done, nil
265
+ return nd.Cid(), nil
266
case *mdag.RawNode:
267
origData := nd0.RawData()
268
bytes := make([]byte, len(origData))
@@ -278,9 +271,9 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
271
copy(bytes, origData[:offset])
272
273
// copy in new data
281
- n, err := data.Read(bytes[offset:])
274
+ n, err := dm.wrBuf.Read(bytes[offset:])
275
if err != nil && err != io.EOF {
283
- return nil, false, err
276
+ return nil, err
277
}
278
279
// copy remaining data
@@ -291,46 +284,39 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
284
285
nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix())
286
if err != nil {
294
- return nil, false, err
287
+ return nil, err
288
}
289
err = dm.dagserv.Add(dm.ctx, nd)
290
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
292
}
293
307
- return nd.Cid(), done, nil
294
+ return nd.Cid(), nil
295
}
296
}
297
298
node, ok := n.(*mdag.ProtoNode)
299
if !ok {
313
- return nil, false, ErrNotUnixfs
300
+ return nil, ErrNotUnixfs
301
}
302
303
f, err := ft.FromBytes(node.Data())
304
if err != nil {
318
- return nil, false, err
305
+ return nil, err
306
}
307
308
var cur uint64
322
- var done bool
309
for i, bs := range f.GetBlocksizes() {
310
// We found the correct child to write into
311
if cur+bs > offset {
312
child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv)
313
if err != nil {
328
- return nil, false, err
314
+ return nil, err
315
}
316
331
- k, sdone, err := dm.modifyDag(child, offset-cur, data)
317
+ k, err := dm.modifyDag(child, offset-cur)
318
if err != nil {
333
- return nil, false, err
319
+ return nil, err
320
}
321
322
node.Links()[i].Cid = k
@@ -338,12 +324,11 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
324
// Recache serialized node
325
_, err = node.EncodeProtobuf(true)
326
if err != nil {
341
- return nil, false, err
327
+ return nil, err
328
}
329
344
- if sdone {
330
+ if dm.wrBuf.Len() == 0 {
331
// No more bytes to write!
346
- done = true
332
break
333
}
334
offset = cur + bs
@@ -352,7 +337,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
337
}
338
339
err = dm.dagserv.Add(dm.ctx, node)
355
- return node.Cid(), done, err
340
+ return node.Cid(), err
341
}
342
343
// appendData appends the blocks from the given chan to the end of this dag