Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b280331
DAOS-18487 object: control EC rebuild resource consumption
gnailzenh Jan 24, 2026
987dc5c
DAOS-18487 object: degraded buffer size only impact resource control
gnailzenh Jan 26, 2026
ce3be6a
DAOS-18487 object: amplify credits also for data from parity shard
gnailzenh Jan 28, 2026
15c7624
DAOS-18487 object: try to wake up more ULTs
gnailzenh Jan 29, 2026
dfbc931
Merge branch 'b2_6' into b2_6_ec_res
gnailzenh Jan 29, 2026
9664eb4
DAOS-18487 object: reduce the default resource limit
gnailzenh Feb 3, 2026
eca00de
Merge branch 'b2_6' into b2_6_ec_res
gnailzenh Feb 6, 2026
804c04b
DAOS-18487 object: RPC fanout should also be considered for enumeration
gnailzenh Feb 6, 2026
e71527e
Merge branch 'release/2.6' into liang/b2_6_ec_res
mchaarawi Feb 6, 2026
fae69cc
Merge remote-tracking branch 'origin/release/2.6' into liang/b2_6_ec_res
mchaarawi Feb 9, 2026
9286cab
Merge branch 'b2_6' into b2_6_ec_res
gnailzenh Feb 12, 2026
9088346
DAOS-18487 object: add resource bucket for rebuild
gnailzenh Feb 12, 2026
ead4a63
DAOS-18487 object: forget to unlock
gnailzenh Feb 13, 2026
df4493c
AOS-18487 object: shared resouce waiters may miss the wakeup
gnailzenh Feb 16, 2026
4b731ad
DAOS-18487 object: fix a ref-leak in migrate_fini_one_ult
gnailzenh Feb 24, 2026
0fc4f6b
DAOS-18487 object: code reorgnization
gnailzenh Feb 22, 2026
a0ee62f
DAOS-18487 object: code cleanup
gnailzenh Feb 23, 2026
20114f7
DAOS-18487 object: clang fix
gnailzenh Feb 23, 2026
3a6fef6
Merge branch 'b2_6' into b2_6_ec_res
gnailzenh Feb 25, 2026
fab844f
DAOS-18487 rebuild: remove obsolete comment
gnailzenh Mar 2, 2026
8355557
DAOS-18487 rebuild: fix a bug for shared resource
gnailzenh Mar 4, 2026
acf7116
DAOS-18487 rebuild: seperate TLS and resource counter
gnailzenh Mar 4, 2026
6793e84
Merge branch 'release/2.6' into liang/b2_6_ec_res
mchaarawi Mar 9, 2026
ce8e979
Fix some bugs during reviewing
wangshilong Mar 11, 2026
0888265
DAOS-18487 rebuild: fix a bug for starveling
gnailzenh Mar 11, 2026
efb1d04
DAOS-18487 rebuild: code cleanup
gnailzenh Mar 12, 2026
cee8171
DAOS-18487 rebuild: add a few assertions
gnailzenh Mar 12, 2026
0251bb9
Add watchdog to detect rebuild hang
wangshilong Mar 12, 2026
2928aa2
codes cleanup
wangshilong Mar 12, 2026
7d6c31b
DAOS-18487 rebuild: integer overflow
gnailzenh Mar 12, 2026
457e593
DAOS-18487 rebuild: code cleanup
gnailzenh Mar 16, 2026
6db4489
DAOS-18487 rebuild: remove the false assertion
gnailzenh Mar 16, 2026
a7c58ff
Fix to reset eventual if reused
wangshilong Mar 17, 2026
028f1d4
improve watchdog
wangshilong Mar 17, 2026
e9d5c79
Merge branch 'release/2.6' of github.com:daos-stack/daos into liang/b…
wangshilong Mar 17, 2026
f76fb1f
DAOS-18544 object: reserved targets for GX object
gnailzenh Feb 21, 2026
ae3fd2b
DAOS-17444 placement: improve layout computation performance
gnailzenh Mar 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 50 additions & 9 deletions src/object/obj_class.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
* (C) Copyright 2016-2023 Intel Corporation.
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
* (C) Copyright 2025-2026 Hewlett Packard Enterprise Development LP
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*/
Expand All @@ -18,6 +18,9 @@ static struct daos_obj_class **oc_resil_array;
static int oc_ident_array_sz;
static int oc_resil_array_sz;

#define D_GX_RESERVED_ENV "D_GX_RESERVED"
static unsigned int oc_gx_reserved;

static struct daos_obj_class *oclass_ident2cl(daos_oclass_id_t oc_id,
uint32_t *nr_grps);
static struct daos_obj_class *oclass_resil2cl(struct daos_oclass_attr *ca);
Expand Down Expand Up @@ -253,17 +256,48 @@ daos_oclass_grp_nr(struct daos_oclass_attr *oc_attr, struct daos_obj_md *md)

/**
* To honor RF setting during failure cases, let's reserve RF
* groups, so if some targets fail, there will be enough replacement
* domains, so if some targets fail, there will be enough replacement
* targets to rebuild, so to avoid putting multiple shards in the same
* domain, which may break the RF setting.
*
* Though let's keep reserve targets to be less than 30% of the total
* targets.
* Though let's keep reserve targets to be no less than 20% on small deployment (20 domains),
* or 30% on large deployment, because otherwise layout computation will be too expensive.
*/
#define DOM_LARGE 20

static uint32_t
reserve_grp_by_rf(uint32_t target_nr, uint32_t grp_size, uint32_t rf)
reserve_grp_by_rf(uint32_t domain_nr, uint32_t target_nr, uint32_t grp_size, uint32_t rf)
{
return min(((target_nr * 3) / 10) / grp_size, rf);
unsigned tgt_per_dom;
unsigned rsv_small;
unsigned rsv_large;
unsigned rsv_tgts;

D_ASSERT(target_nr >= domain_nr && domain_nr >= 1); /* unless pool map is corrupted */
if (oc_gx_reserved > 0) {
rsv_tgts = min(oc_gx_reserved, domain_nr - 1);
goto out;
}

tgt_per_dom = target_nr / domain_nr;

rsv_small = (target_nr * 2) / 10; /* 20 percent for small deployment */
rsv_large = (target_nr * 3) / 10; /* 30 percent for large deployment */

if (domain_nr < DOM_LARGE) { /* small deployment */
rsv_tgts = rsv_small;
} else {
/* ensure object layout is not smaller than the case of (dom_nr < DOM_LARGE) */
if (DOM_LARGE * tgt_per_dom - rsv_small > target_nr - rsv_large)
rsv_tgts = rsv_small;
else
rsv_tgts = rsv_large;
}

if (rsv_tgts < tgt_per_dom * rf)
rsv_tgts = tgt_per_dom * rf;
out:
return (rsv_tgts + grp_size - 1) / grp_size;
}

int
Expand Down Expand Up @@ -303,7 +337,7 @@ daos_oclass_fit_max(daos_oclass_id_t oc_id, int domain_nr, int target_nr, enum d

grp_size = daos_oclass_grp_size(&ca);
if (ca.ca_grp_nr == DAOS_OBJ_GRP_MAX) {
uint32_t reserve_grp = reserve_grp_by_rf(target_nr, grp_size, rf_factor);
uint32_t reserve_grp = reserve_grp_by_rf(domain_nr, target_nr, grp_size, rf_factor);

ca.ca_grp_nr = max(1, (target_nr / grp_size));

Expand Down Expand Up @@ -865,7 +899,7 @@ dc_set_oclass(uint32_t rf, int domain_nr, int target_nr, enum daos_otype_t otype
grp_nr = max(256, target_nr * 50 / 100);
break;
case DAOS_OCH_SHD_EXT:
grp_nr = max(1024, target_nr * 80 / 100);
grp_nr = max(1024, target_nr * 70 / 100);
break;
default:
D_ERROR("Invalid sharding hint\n");
Expand All @@ -874,7 +908,7 @@ dc_set_oclass(uint32_t rf, int domain_nr, int target_nr, enum daos_otype_t otype

if (grp_nr == DAOS_OBJ_GRP_MAX || grp_nr * grp_size > target_nr) {
uint32_t max_grp = target_nr / grp_size;
uint32_t reserve_grp = reserve_grp_by_rf(target_nr, grp_size, rf);
uint32_t reserve_grp = reserve_grp_by_rf(domain_nr, target_nr, grp_size, rf);

/* search for the highest scalability in the allowed range */
if (max_grp > reserve_grp)
Expand Down Expand Up @@ -948,6 +982,13 @@ obj_class_init(void)
if (oc_ident_array)
return 0;

oc_gx_reserved = 0;
d_getenv_uint(D_GX_RESERVED_ENV, &oc_gx_reserved);
if (oc_gx_reserved > 0) {
D_INFO("%s = %u, setting it has global impact on all pools!\n", D_GX_RESERVED_ENV,
oc_gx_reserved);
}

D_ALLOC_ARRAY(oc_ident_array, OC_NR);
if (!oc_ident_array)
return -DER_NOMEM;
Expand Down
31 changes: 28 additions & 3 deletions src/object/srv_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,29 @@

extern struct dss_module_key obj_module_key;

struct migr_res_manager;
/* anchor point of resource waiter
* NB: resource control can be a independent library in the future.
*/
struct migr_res_waiter {
struct migrate_pool_tls *rw_tls;
/* link chain on resource manager */
d_list_t rw_link;
/* quantity of resource being demanded */
uint64_t rw_units;
/* start to wait since... */
uint64_t rw_wait_since;
/* eventual to wait on */
ABT_eventual rw_eventual;
/* for eventual */
int *rw_rc;
};

/* resource handle */
struct migr_res_handle {
int rh_type;
int rh_bkt;
uint64_t rh_units;
};

/* Per pool attached to the migrate tls(per xstream) */
struct migrate_pool_tls {
Expand Down Expand Up @@ -80,8 +102,6 @@ struct migrate_pool_tls {
/* The current in-flight data size */
uint64_t mpt_inflight_size;

struct migr_res_manager *mpt_rmg;

/* reference count for the structure */
uint64_t mpt_refcount;
uint32_t mpt_opc;
Expand All @@ -94,6 +114,11 @@ struct migrate_pool_tls {

/* migration init error */
int mpt_init_err;

/* Watchdog: track progress to detect complete rebuild hang */
uint64_t mpt_last_progress_obj_count; /* obj_count at last check */
uint64_t mpt_last_progress_rec_count; /* rec_count at last check */
uint64_t mpt_last_progress_ts; /* time of last observed progress */
};

struct migrate_cont_hdl {
Expand Down
Loading
Loading