From f262c7bbc72796ae36b7e40dc38ab7167d138d5b Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 15 Apr 2023 09:00:33 -0600 Subject: btrfsutil: RebuiltForrest: Add a lax-ancestor mode --- lib/btrfsutil/rebuilt_forrest_test.go | 94 ++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 24 deletions(-) (limited to 'lib/btrfsutil/rebuilt_forrest_test.go') diff --git a/lib/btrfsutil/rebuilt_forrest_test.go b/lib/btrfsutil/rebuilt_forrest_test.go index 96749c4..8bbb50a 100644 --- a/lib/btrfsutil/rebuilt_forrest_test.go +++ b/lib/btrfsutil/rebuilt_forrest_test.go @@ -106,26 +106,60 @@ func TestRebuiltTreeCycles(t *testing.T) { }, } - rfs := NewRebuiltForrest(nil, Graph{}, cbs) - - tree, err := rfs.RebuiltTree(ctx, 306) - assert.EqualError(t, err, `loop detected: [306 305 304 303 305]`) - assert.Nil(t, tree) - - assert.NotNil(t, rfs.trees[305]) - tree, err = rfs.RebuiltTree(ctx, 305) - assert.EqualError(t, err, `loop detected: [305 304 303 305]`) - assert.Nil(t, tree) - - assert.NotNil(t, rfs.trees[304]) - tree, err = rfs.RebuiltTree(ctx, 304) - assert.EqualError(t, err, `loop detected: [304 303 305 304]`) - assert.Nil(t, tree) - - assert.NotNil(t, rfs.trees[303]) - tree, err = rfs.RebuiltTree(ctx, 303) - assert.EqualError(t, err, `loop detected: [303 305 304 303]`) - assert.Nil(t, tree) + t.Run("strict", func(t *testing.T) { + t.Parallel() + rfs := NewRebuiltForrest(nil, Graph{}, cbs, false) + + tree, err := rfs.RebuiltTree(ctx, 306) + assert.EqualError(t, err, `loop detected: [306 305 304 303 305]`) + assert.Nil(t, tree) + + assert.NotNil(t, rfs.trees[305]) + tree, err = rfs.RebuiltTree(ctx, 305) + assert.EqualError(t, err, `loop detected: [305 304 303 305]`) + assert.Nil(t, tree) + + assert.NotNil(t, rfs.trees[304]) + tree, err = rfs.RebuiltTree(ctx, 304) + assert.EqualError(t, err, `loop detected: [304 303 305 304]`) + assert.Nil(t, tree) + + assert.NotNil(t, rfs.trees[303]) + tree, err = rfs.RebuiltTree(ctx, 303) + assert.EqualError(t, err, `loop detected: [303 305 304 303]`) + assert.Nil(t, tree) + }) + t.Run("lax", func(t *testing.T) { + t.Parallel() + rfs := NewRebuiltForrest(nil, Graph{}, cbs, true) + + tree, err := rfs.RebuiltTree(ctx, 306) + assert.NoError(t, err) + assert.NotNil(t, tree) + assert.True(t, tree.ancestorLoop) + assert.Equal(t, btrfsprim.ObjID(303), tree.ancestorRoot) + + assert.NotNil(t, rfs.trees[305]) + tree, err = rfs.RebuiltTree(ctx, 305) + assert.NoError(t, err) + assert.NotNil(t, tree) + assert.True(t, tree.ancestorLoop) + assert.Equal(t, btrfsprim.ObjID(303), tree.ancestorRoot) + + assert.NotNil(t, rfs.trees[304]) + tree, err = rfs.RebuiltTree(ctx, 304) + assert.NoError(t, err) + assert.NotNil(t, tree) + assert.True(t, tree.ancestorLoop) + assert.Equal(t, btrfsprim.ObjID(305), tree.ancestorRoot) + + assert.NotNil(t, rfs.trees[303]) + tree, err = rfs.RebuiltTree(ctx, 303) + assert.NoError(t, err) + assert.NotNil(t, tree) + assert.True(t, tree.ancestorLoop) + assert.Equal(t, btrfsprim.ObjID(304), tree.ancestorRoot) + }) } func TestRebuiltTreeParentErr(t *testing.T) { @@ -185,9 +219,21 @@ func TestRebuiltTreeParentErr(t *testing.T) { }, } - rfs := NewRebuiltForrest(nil, Graph{}, cbs) + t.Run("strict", func(t *testing.T) { + t.Parallel() + rfs := NewRebuiltForrest(nil, Graph{}, cbs, false) - tree, err := rfs.RebuiltTree(ctx, 305) - assert.EqualError(t, err, `failed to rebuild parent tree: 304: tree does not exist`) - assert.Nil(t, tree) + tree, err := rfs.RebuiltTree(ctx, 305) + assert.EqualError(t, err, `failed to rebuild parent tree: 304: tree does not exist`) + assert.Nil(t, tree) + }) + + t.Run("lax", func(t *testing.T) { + t.Parallel() + rfs := NewRebuiltForrest(nil, Graph{}, cbs, true) + + tree, err := rfs.RebuiltTree(ctx, 305) + assert.NoError(t, err) + assert.NotNil(t, tree) + }) } -- cgit v1.2.3-2-g168b