int pool_recovery_priority = 0;
pool.info.opts.get(pool_opts_t::RECOVERY_PRIORITY, &pool_recovery_priority);
- unsigned ret = OSD_RECOVERY_PRIORITY_BASE + pool_recovery_priority;
- if (ret > OSD_RECOVERY_PRIORITY_MAX)
+ int ret = OSD_RECOVERY_PRIORITY_BASE + pool_recovery_priority;
+
+ // Clamp to valid range
+ if (ret > OSD_RECOVERY_PRIORITY_MAX) {
ret = OSD_RECOVERY_PRIORITY_MAX;
- return ret;
+ } else if (ret < OSD_RECOVERY_PRIORITY_MIN) {
+ ret = OSD_RECOVERY_PRIORITY_MIN;
+ }
+
+ static_assert(OSD_RECOVERY_PRIORITY_MIN < OSD_RECOVERY_PRIORITY_MAX, "Invalid priority range");
+ static_assert(OSD_RECOVERY_PRIORITY_MIN >= 0, "Priority range must match unsigned type");
+
+ return static_cast<unsigned>(ret);
}
unsigned PG::get_backfill_priority()
{
// a higher value -> a higher priority
- unsigned ret = OSD_BACKFILL_PRIORITY_BASE;
- if (is_undersized()) {
+ int ret = OSD_BACKFILL_PRIORITY_BASE;
+ if (acting.size() < pool.info.min_size) {
+ // inactive: no. of replicas < min_size, highest priority since it blocks IO
+ ret = OSD_BACKFILL_INACTIVE_PRIORITY_BASE + (pool.info.min_size - acting.size());
+
+ } else if (is_undersized()) {
// undersized: OSD_BACKFILL_DEGRADED_PRIORITY_BASE + num missing replicas
assert(pool.info.size > actingset.size());
ret = OSD_BACKFILL_DEGRADED_PRIORITY_BASE + (pool.info.size - actingset.size());
// degraded: baseline degraded
ret = OSD_BACKFILL_DEGRADED_PRIORITY_BASE;
}
- assert (ret < OSD_RECOVERY_PRIORITY_MAX);
- return ret;
+ // Adjust with pool's recovery priority
+ int pool_recovery_priority = 0;
+ pool.info.opts.get(pool_opts_t::RECOVERY_PRIORITY, &pool_recovery_priority);
+ ret += pool_recovery_priority;
+
+ // Clamp to valid range
+ if (ret > OSD_RECOVERY_PRIORITY_MAX) {
+ ret = OSD_RECOVERY_PRIORITY_MAX;
+ } else if (ret < OSD_RECOVERY_PRIORITY_MIN) {
+ ret = OSD_RECOVERY_PRIORITY_MIN;
+ }
+
+ return static_cast<unsigned>(ret);
}
void PG::finish_recovery(list<Context*>& tfin)
#define CEPH_OSD_FEATURE_INCOMPAT_FASTINFO CompatSet::Feature(15, "fastinfo pg attr")
-/// max recovery priority for MBackfillReserve
-#define OSD_RECOVERY_PRIORITY_MAX 255u
+/// min recovery priority for MBackfillReserve
+#define OSD_RECOVERY_PRIORITY_MIN 0
-/// base recovery priority for MBackfillReserve
-#define OSD_RECOVERY_PRIORITY_BASE 230u
+/// base backfill priority for MBackfillReserve
+#define OSD_BACKFILL_PRIORITY_BASE 100
/// base backfill priority for MBackfillReserve (degraded PG)
-#define OSD_BACKFILL_DEGRADED_PRIORITY_BASE 200u
+#define OSD_BACKFILL_DEGRADED_PRIORITY_BASE 140
+
+/// base recovery priority for MBackfillReserve
+#define OSD_RECOVERY_PRIORITY_BASE 180
+
+/// base backfill priority for MBackfillReserve (inactive PG)
+#define OSD_BACKFILL_INACTIVE_PRIORITY_BASE 220
+
+/// max recovery priority for MBackfillReserve
+#define OSD_RECOVERY_PRIORITY_MAX 255
-/// base backfill priority for MBackfillReserve
-#define OSD_BACKFILL_PRIORITY_BASE 1u
typedef hobject_t collection_list_handle_t;