summaryrefslogtreecommitdiff
path: root/lib/btrfsutil/graph.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-04-02 18:36:11 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-04-02 22:40:13 -0600
commit74a82894df9bdef19d321611255b7923f9f25aff (patch)
tree60537bef852eaecae4eac10c2f22348a2f0a9ff2 /lib/btrfsutil/graph.go
parent2bdf2ac12d3fc2770cd101cc30c221255a7fdff6 (diff)
btrfsutil: GraphNode: Have .MinItem and .MaxItem work on interior nodes too
Diffstat (limited to 'lib/btrfsutil/graph.go')
-rw-r--r--lib/btrfsutil/graph.go39
1 files changed, 29 insertions, 10 deletions
diff --git a/lib/btrfsutil/graph.go b/lib/btrfsutil/graph.go
index 090ccf4..fe7fe70 100644
--- a/lib/btrfsutil/graph.go
+++ b/lib/btrfsutil/graph.go
@@ -23,34 +23,52 @@ import (
)
type GraphNode struct {
+ Addr btrfsvol.LogicalAddr
Level uint8
Generation btrfsprim.Generation
Owner btrfsprim.ObjID
Items []btrfsprim.Key
}
-func (n GraphNode) MinItem() btrfsprim.Key {
- if len(n.Items) == 0 {
+func (n GraphNode) NumItems(g Graph) int {
+ switch n.Level {
+ case 0:
+ return len(n.Items)
+ default:
+ return len(g.EdgesFrom[n.Addr])
+ }
+}
+
+func (n GraphNode) MinItem(g Graph) btrfsprim.Key {
+ if n.NumItems(g) == 0 {
return btrfsprim.Key{}
}
- return n.Items[0]
+ switch n.Level {
+ case 0:
+ return n.Items[0]
+ default:
+ return g.EdgesFrom[n.Addr][0].ToKey
+ }
}
-func (n GraphNode) MaxItem() btrfsprim.Key {
- if len(n.Items) == 0 {
+func (n GraphNode) MaxItem(g Graph) btrfsprim.Key {
+ if n.NumItems(g) == 0 {
return btrfsprim.Key{}
}
- return n.Items[len(n.Items)-1]
+ switch n.Level {
+ case 0:
+ return n.Items[len(n.Items)-1]
+ default:
+ return g.EdgesFrom[n.Addr][len(g.EdgesFrom[n.Addr])-1].ToKey
+ }
}
func (n GraphNode) String() string {
if reflect.ValueOf(n).IsZero() {
return "{}"
}
- return fmt.Sprintf(`{lvl:%v, gen:%v, tree:%v, cnt:%v, min:(%v,%v,%v), max:(%v,%v,%v)}`,
- n.Level, n.Generation, n.Owner, len(n.Items),
- n.MinItem().ObjectID, n.MinItem().ItemType, n.MinItem().Offset,
- n.MaxItem().ObjectID, n.MaxItem().ItemType, n.MaxItem().Offset)
+ return fmt.Sprintf(`{lvl:%v, gen:%v, tree:%v, cnt:%v}`,
+ n.Level, n.Generation, n.Owner, len(n.Items))
}
type GraphEdge struct {
@@ -150,6 +168,7 @@ func NewGraph(ctx context.Context, sb btrfstree.Superblock) Graph {
func (g Graph) InsertNode(node *btrfstree.Node) {
nodeData := GraphNode{
+ Addr: node.Head.Addr,
Level: node.Head.Level,
Generation: node.Head.Generation,
Owner: node.Head.Owner,