github.com/grafana/pyroscope@v1.18.0/pkg/og/storage/tree/serialize.go (about) 1 package tree 2 3 import ( 4 "bufio" 5 "io" 6 7 "github.com/grafana/pyroscope/pkg/og/util/varint" 8 ) 9 10 type parentNode struct { 11 node *treeNode 12 parent *parentNode 13 } 14 15 // used in the cloud 16 func DeserializeNoDict(r io.Reader) (*Tree, error) { 17 t := New() 18 br := bufio.NewReader(r) // TODO if it's already a bytereader skip 19 20 parents := []*parentNode{{t.root, nil}} 21 j := 0 22 23 for len(parents) > 0 { 24 j++ 25 parent := parents[0] 26 parents = parents[1:] 27 28 nameLen, err := varint.Read(br) 29 // if err == io.EOF { 30 // return t, nil 31 // } 32 nameBuf := make([]byte, nameLen) // TODO: there are better ways to do this? 33 _, err = io.ReadAtLeast(br, nameBuf, int(nameLen)) 34 if err != nil { 35 return nil, err 36 } 37 tn := parent.node.insert(nameBuf) 38 39 tn.Self, err = varint.Read(br) 40 tn.Total = tn.Self 41 if err != nil { 42 return nil, err 43 } 44 45 pn := parent 46 for pn != nil { 47 pn.node.Total += tn.Self 48 pn = pn.parent 49 } 50 51 childrenLen, err := varint.Read(br) 52 if err != nil { 53 return nil, err 54 } 55 56 for i := uint64(0); i < childrenLen; i++ { 57 parents = append([]*parentNode{{tn, parent}}, parents...) 58 } 59 } 60 61 t.root = t.root.ChildrenNodes[0] 62 63 return t, nil 64 }