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  }