Skip to content

Commit

Permalink
Update compressed domain tree format in control plane
Browse files Browse the repository at this point in the history
Signed-off-by: Kris Jacque <[email protected]>
  • Loading branch information
kjacque committed Feb 8, 2025
1 parent ee576f6 commit 99fb369
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/control/server/mgmt_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1356,7 +1356,7 @@ func TestServer_MgmtSvc_PoolExtend(t *testing.T) {
missingSB.harness.instances[0].(*EngineInstance)._superblock = nil
notAP := newTestMgmtSvc(t, log)
mockRanks := []uint32{1}
mockFaultDomains := []uint32{1, 1, 1, 1}
mockFaultDomains := []uint32{0, 1, 1, 1, 1}

for name, tc := range map[string]struct {
nilReq bool
Expand Down
23 changes: 22 additions & 1 deletion src/control/system/membership.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//
// (C) Copyright 2020-2024 Intel Corporation.
// (C) Copyright 2025 Hewlett Packard Enterprise Development LP
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
Expand Down Expand Up @@ -611,6 +612,7 @@ func (m *Membership) OnEvent(_ context.Context, evt *events.RASEvent) {

// CompressedFaultDomainTree returns the tree of fault domains of joined
// members in a compressed format.
// The first uint32 is a bitmask providing metadata about the tree.
// Each domain is represented as a tuple: (level, ID, number of children)
// Except for the rank, which is represented as: (rank)
// The order of items is a breadth-first traversal of the tree.
Expand All @@ -625,7 +627,26 @@ func (m *Membership) CompressedFaultDomainTree(ranks ...uint32) ([]uint32, error
return nil, err
}

return compressTree(subtree), nil
md := getCompressedTreeMetadata(tree)
return append([]uint32{md}, compressTree(subtree)...), nil
}

const (
DomTreeMetadataHasFaultDom uint32 = (1 << iota)
DomTreeMetadataHasPerfDom
)

func getCompressedTreeMetadata(tree *FaultDomainTree) uint32 {
var md uint32

// TODO DAOS-6353: Properly detect when fault and perf domain are requested.
// Currently any depth greater than the minimum must indicate a performance domain.
minDepth := 2 // domain + rank
if tree.Depth() > minDepth {
md |= DomTreeMetadataHasPerfDom
}

return md
}

func getFaultDomainSubtree(tree *FaultDomainTree, ranks ...uint32) (*FaultDomainTree, error) {
Expand Down
31 changes: 31 additions & 0 deletions src/control/system/membership_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//
// (C) Copyright 2020-2024 Intel Corporation.
// (C) Copyright 2025 Hewlett Packard Enterprise Development LP
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
Expand Down Expand Up @@ -1075,6 +1076,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
"root only": {
tree: NewFaultDomainTree(),
expResult: []uint32{
0, // metadata
0,
ExpFaultDomainID(0),
0,
Expand All @@ -1085,6 +1087,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
MustCreateFaultDomain("one", "two", "three"),
),
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
3,
ExpFaultDomainID(0),
1,
Expand All @@ -1108,6 +1111,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
MustCreateFaultDomainFromString("/rack2/pdu4"),
),
expResult: []uint32{
0, // metadata
2, // root
ExpFaultDomainID(0),
3,
Expand Down Expand Up @@ -1142,6 +1146,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
rankDomain("/one/two/three", 5),
),
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
4,
ExpFaultDomainID(0),
1,
Expand All @@ -1167,6 +1172,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
rankDomain("/rack2/pdu4", 5),
),
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
3,
ExpFaultDomainID(0), // root
3,
Expand Down Expand Up @@ -1208,6 +1214,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
rankDomain(fmt.Sprintf("/top/%s2/bottom", RankFaultDomainPrefix), 1),
),
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
4,
ExpFaultDomainID(0), // root
1,
Expand All @@ -1223,6 +1230,28 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
1, // rank
},
},
"request one rank with node only": {
tree: NewFaultDomainTree(
rankDomain("/node0", 0),
rankDomain("/node1", 1),
rankDomain("/node2", 2),
rankDomain("/node3", 3),
rankDomain("/node3", 4),
rankDomain("/node4", 5),
),
inputRanks: []uint32{4},
expResult: []uint32{
0, // metadata
2,
ExpFaultDomainID(0), // root
1,
1,
ExpFaultDomainID(7), // node3
1,
// ranks
4,
},
},
"request one rank": {
tree: NewFaultDomainTree(
rankDomain("/rack0/pdu0", 0),
Expand All @@ -1234,6 +1263,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
),
inputRanks: []uint32{4},
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
3,
ExpFaultDomainID(0), // root
1,
Expand All @@ -1258,6 +1288,7 @@ func TestSystem_Membership_CompressedFaultDomainTree(t *testing.T) {
),
inputRanks: []uint32{4, 0, 5, 3},
expResult: []uint32{
DomTreeMetadataHasPerfDom, // metadata
3,
ExpFaultDomainID(0), // root
3,
Expand Down

0 comments on commit 99fb369

Please sign in to comment.