| 71 | typedef std::map<DataMovementReason, int> DmReasonPriorityMapping; |
| 72 | typedef std::map<int, DataMovementReason> PriorityDmReasonMapping; |
| 73 | std::pair<const DmReasonPriorityMapping*, const PriorityDmReasonMapping*> buildPriorityMappings() { |
| 74 | static DmReasonPriorityMapping reasonPriority{ |
| 75 | { DataMovementReason::INVALID, -1 }, |
| 76 | { DataMovementReason::RECOVER_MOVE, SERVER_KNOBS->PRIORITY_RECOVER_MOVE }, |
| 77 | { DataMovementReason::REBALANCE_UNDERUTILIZED_TEAM, SERVER_KNOBS->PRIORITY_REBALANCE_UNDERUTILIZED_TEAM }, |
| 78 | { DataMovementReason::REBALANCE_OVERUTILIZED_TEAM, SERVER_KNOBS->PRIORITY_REBALANCE_OVERUTILIZED_TEAM }, |
| 79 | { DataMovementReason::REBALANCE_READ_OVERUTIL_TEAM, SERVER_KNOBS->PRIORITY_REBALANCE_READ_OVERUTIL_TEAM }, |
| 80 | { DataMovementReason::REBALANCE_READ_UNDERUTIL_TEAM, SERVER_KNOBS->PRIORITY_REBALANCE_READ_UNDERUTIL_TEAM }, |
| 81 | { DataMovementReason::PERPETUAL_STORAGE_WIGGLE, SERVER_KNOBS->PRIORITY_PERPETUAL_STORAGE_WIGGLE }, |
| 82 | { DataMovementReason::TEAM_HEALTHY, SERVER_KNOBS->PRIORITY_TEAM_HEALTHY }, |
| 83 | { DataMovementReason::TEAM_CONTAINS_UNDESIRED_SERVER, SERVER_KNOBS->PRIORITY_TEAM_CONTAINS_UNDESIRED_SERVER }, |
| 84 | { DataMovementReason::TEAM_REDUNDANT, SERVER_KNOBS->PRIORITY_TEAM_REDUNDANT }, |
| 85 | { DataMovementReason::MERGE_SHARD, SERVER_KNOBS->PRIORITY_MERGE_SHARD }, |
| 86 | { DataMovementReason::POPULATE_REGION, SERVER_KNOBS->PRIORITY_POPULATE_REGION }, |
| 87 | { DataMovementReason::TEAM_UNHEALTHY, SERVER_KNOBS->PRIORITY_TEAM_UNHEALTHY }, |
| 88 | { DataMovementReason::TEAM_2_LEFT, SERVER_KNOBS->PRIORITY_TEAM_2_LEFT }, |
| 89 | { DataMovementReason::TEAM_1_LEFT, SERVER_KNOBS->PRIORITY_TEAM_1_LEFT }, |
| 90 | { DataMovementReason::TEAM_FAILED, SERVER_KNOBS->PRIORITY_TEAM_FAILED }, |
| 91 | { DataMovementReason::TEAM_0_LEFT, SERVER_KNOBS->PRIORITY_TEAM_0_LEFT }, |
| 92 | { DataMovementReason::SPLIT_SHARD, SERVER_KNOBS->PRIORITY_SPLIT_SHARD } |
| 93 | }; |
| 94 | |
| 95 | static PriorityDmReasonMapping priorityReason; |
| 96 | if (priorityReason.empty()) { // only build once |
| 97 | for (const auto& [r, p] : reasonPriority) { |
| 98 | priorityReason[p] = r; |
| 99 | } |
| 100 | // Don't allow 2 priorities value being the same. |
| 101 | if (priorityReason.size() != reasonPriority.size()) { |
| 102 | TraceEvent(SevError, "DuplicateDataMovementPriority").log(); |
| 103 | ASSERT(false); |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | return std::make_pair(&reasonPriority, &priorityReason); |
| 108 | } |
| 109 | |
| 110 | int dataMovementPriority(DataMovementReason reason) { |
| 111 | auto [reasonPriority, _] = buildPriorityMappings(); |
no test coverage detected