// fillNodeRec will fill the given node with data from the dagBuilders input // source down to an indirection depth as specified by 'depth' // it returns the total dataSize of the node, and a potential error // // warning: **children** pinned indirectly, but input node IS NOT pinned. func fillNodeRec(db *h.DagBuilderHelper, node *h.UnixfsNode, depth int) error { if depth < 0 { return errors.New("attempt to fillNode at depth < 0") } // Base case if depth <= 0 { // catch accidental -1's in case error above is removed. return db.FillNodeWithData(node) } // while we have room AND we're not done for node.NumChildren() < db.Maxlinks() && !db.Done() { child := h.NewUnixfsNode() if err := fillNodeRec(db, child, depth-1); err != nil { return err } if err := node.AddChild(child, db); err != nil { return err } } return nil }
func trickleDepthInfo(node *h.UnixfsNode, maxlinks int) (int, int) { n := node.NumChildren() if n < maxlinks { return 0, 0 } return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat }
// appendFillLastChild will take in an incomplete trickledag node (uncomplete meaning, not full) and // fill it out to the specified depth with blocks from the given DagBuilderHelper func appendFillLastChild(ctx context.Context, ufsn *h.UnixfsNode, depth int, layerFill int, db *h.DagBuilderHelper) error { if ufsn.NumChildren() <= db.Maxlinks() { return nil } // Recursive step, grab last child last := ufsn.NumChildren() - 1 lastChild, err := ufsn.GetChild(ctx, last, db.GetDagServ()) if err != nil { return err } // Fill out last child (may not be full tree) nchild, err := trickleAppendRec(ctx, lastChild, db, depth-1) if err != nil { return err } // Update changed child in parent node ufsn.RemoveChild(last, db) err = ufsn.AddChild(nchild, db) if err != nil { return err } // Partially filled depth layer if layerFill != 0 { for ; layerFill < layerRepeat && !db.Done(); layerFill++ { next := h.NewUnixfsNode() err := fillTrickleRec(db, next, depth) if err != nil { return err } err = ufsn.AddChild(next, db) if err != nil { return err } } } return nil }