Skip to content
12 changes: 11 additions & 1 deletion src/container/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ dup_cont_create_props(daos_handle_t poh, daos_prop_t **prop_out,
int rc = 0;
uid_t uid = geteuid();
gid_t gid = getegid();
uint32_t co_ver = 0;

entries = (prop_in == NULL) ? 0 : prop_in->dpp_nr;

Expand Down Expand Up @@ -224,6 +225,10 @@ dup_cont_create_props(daos_handle_t poh, daos_prop_t **prop_out,

entries++;
}
if (!daos_prop_has_entry(prop_in, DAOS_PROP_CO_OBJ_VERSION)) {
co_ver = DAOS_POOL_OBJ_VERSION_2;
entries++;
}

if (!daos_prop_has_entry(prop_in, DAOS_PROP_CO_ROOTS)) {
uint64_t rf;
Expand Down Expand Up @@ -294,6 +299,11 @@ dup_cont_create_props(daos_handle_t poh, daos_prop_t **prop_out,
roots = NULL; /* prop is responsible for it now */
idx++;
}
if (co_ver != 0) {
final_prop->dpp_entries[idx].dpe_type = DAOS_PROP_CO_OBJ_VERSION;
final_prop->dpp_entries[idx].dpe_val = co_ver;
idx++;
}
}

*prop_out = final_prop;
Expand Down Expand Up @@ -999,7 +1009,7 @@ dc_cont_open(tse_task_t *task)
if (tpriv->cont == NULL)
D_GOTO(err_pool, rc = -DER_NOMEM);
uuid_generate(tpriv->cont->dc_cont_hdl);
tpriv->cont->dc_capas = args->flags;
tpriv->cont->dc_capas = args->flags | DAOS_COO_NEW_LAYOUT;
}

D_DEBUG(DB_MD, DF_UUID ":%s: opening: hdl=" DF_UUIDF " flags=%x\n", DP_UUID(pool->dp_pool),
Expand Down
28 changes: 21 additions & 7 deletions src/container/srv_container.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,10 +702,12 @@ cont_create_prop_prepare(struct ds_pool_hdl *pool_hdl,
}
break;
case DAOS_PROP_CO_GLOBAL_VERSION:
case DAOS_PROP_CO_OBJ_VERSION:
D_ERROR("container global/obj %u version could be not set\n",
entry->dpe_type);
D_ERROR("container global %u version could be not set\n", entry->dpe_type);
return -DER_INVAL;
case DAOS_PROP_CO_OBJ_VERSION:
/* this is a walkaround for 2.6 only */
entry_def->dpe_val = entry->dpe_val;
break;
default:
D_ASSERTF(0, "bad dpt_type %d.\n", entry->dpe_type);
break;
Expand Down Expand Up @@ -760,8 +762,9 @@ cont_create_prop_prepare(struct ds_pool_hdl *pool_hdl,

/* inherit object version from pool*/
entry_def = daos_prop_entry_get(prop_def, DAOS_PROP_CO_OBJ_VERSION);
if (entry_def)
if (entry_def && entry_def->dpe_val == 0)
entry_def->dpe_val = pool_hdl->sph_obj_ver;

/* for new container set HEALTHY status with current pm ver */
entry_def = daos_prop_entry_get(prop_def, DAOS_PROP_CO_STATUS);
D_ASSERT(entry_def != NULL);
Expand Down Expand Up @@ -2272,6 +2275,17 @@ cont_open(struct rdb_tx *tx, struct ds_pool_hdl *pool_hdl, struct cont *cont, cr
D_GOTO(out, rc);
D_ASSERT(prop != NULL);
D_ASSERT(prop->dpp_nr <= CONT_PROP_NUM);
if (!(flags & DAOS_COO_NEW_LAYOUT)) {
struct daos_prop_entry *entry;

entry = daos_prop_entry_get(prop, DAOS_PROP_CO_OBJ_VERSION);
if (entry && entry->dpe_val >= DAOS_POOL_OBJ_VERSION_2) {
D_ERROR(DF_CONT ": refusing attempt to open with new layout: " DF_X64 "\n",
DP_CONT(cont->c_svc->cs_pool_uuid, cont->c_uuid), entry->dpe_val);
rc = -DER_NOTSUPPORTED;
D_GOTO(out, rc);
}
}

get_cont_prop_access_info(prop, &owner, &acl);

Expand Down Expand Up @@ -4612,7 +4626,7 @@ upgrade_cont_cb(daos_handle_t ih, d_iov_t *key, d_iov_t *val, void *varg)
}

if (DAOS_FAIL_CHECK(DAOS_FORCE_OBJ_UPGRADE)) {
obj_ver = DS_POOL_OBJ_VERSION;
obj_ver = DAOS_POOL_OBJ_VERSION;
d_iov_set(&value, &obj_ver, sizeof(obj_ver));
rc = rdb_tx_update(ap->tx, &cont->c_prop,
&ds_cont_prop_cont_obj_version, &value);
Expand Down Expand Up @@ -4707,9 +4721,9 @@ upgrade_cont_cb(daos_handle_t ih, d_iov_t *key, d_iov_t *val, void *varg)

entry = daos_prop_entry_get(prop, DAOS_PROP_CO_OBJ_VERSION);
D_ASSERT(entry != NULL);
entry->dpe_val = DS_POOL_OBJ_VERSION;
entry->dpe_val = DAOS_POOL_OBJ_VERSION;
entry->dpe_flags &= ~DAOS_PROP_ENTRY_NOT_SET;
obj_ver = DS_POOL_OBJ_VERSION;
obj_ver = DAOS_POOL_OBJ_VERSION;
d_iov_set(&value, &obj_ver, sizeof(obj_ver));
rc = rdb_tx_update(ap->tx, &cont->c_prop, &ds_cont_prop_cont_obj_version, &value);
if (rc) {
Expand Down
11 changes: 11 additions & 0 deletions src/include/daos/pool.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* (C) Copyright 2016-2024 Intel Corporation.
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*/
Expand Down Expand Up @@ -85,6 +86,16 @@
*/
#define DAOS_POOL_GLOBAL_VERSION 3

/**
* Each individual object layout format, like oid layout, dkey to group,
* dkey to EC group start.
*/
enum {
DAOS_POOL_OBJ_VERSION_1 = 1,
DAOS_POOL_OBJ_VERSION_2 = 2,
DAOS_POOL_OBJ_VERSION = DAOS_POOL_OBJ_VERSION_2,
};

int dc_pool_init(void);
void dc_pool_fini(void);

Expand Down
10 changes: 9 additions & 1 deletion src/include/daos_cont.h
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 @@ -73,8 +74,15 @@ extern "C" {
*/
#define DAOS_COO_EVICT_ALL (1U << 6)

/**
* When clients attempt to open a container using the new hash layout,
* the server will reject the request if this flag is not set,
* even if the container is already in the new layout format.
*/
#define DAOS_COO_NEW_LAYOUT (1U << 7)

/** Number of bits in the container open mode flag, DAOS_COO_ bits */
#define DAOS_COO_NBITS (7)
#define DAOS_COO_NBITS (8)

/** Mask for all of the bits in the container open mode flag, DAOS_COO_ bits */
#define DAOS_COO_MASK ((1U << DAOS_COO_NBITS) - 1)
Expand Down
6 changes: 0 additions & 6 deletions src/include/daos_srv/pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@
/* Pool service (opaque) */
struct ds_pool_svc;

/**
* Each individual object layout format, like oid layout, dkey to group,
* dkey to EC group start.
*/
#define DS_POOL_OBJ_VERSION 1

/* age of an entry in svc_ops KVS before it may be evicted */
#define DEFAULT_SVC_OPS_ENTRY_AGE_SEC_MAX 300ULL

Expand Down
11 changes: 7 additions & 4 deletions src/pipeline/cli_pipeline.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/**
* (C) Copyright 2021-2023 Intel Corporation.
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*/
Expand Down Expand Up @@ -544,7 +545,7 @@ shard_task_sched(tse_task_t *task, void *arg)

static int
pipeline_create_layout(daos_handle_t coh, struct dc_pool *pool, struct daos_obj_md *obj_md,
struct pl_obj_layout **layout)
struct pl_obj_layout **layout, uint16_t layout_gl_version)
{
int rc = 0;
struct pl_map *map;
Expand All @@ -555,7 +556,7 @@ pipeline_create_layout(daos_handle_t coh, struct dc_pool *pool, struct daos_obj_
D_GOTO(out, rc = -DER_INVAL);
}

rc = pl_obj_place(map, 0, obj_md, 0, NULL, layout);
rc = pl_obj_place(map, layout_gl_version, obj_md, 0, NULL, layout);
pl_map_decref(map);
if (rc != 0) {
D_DEBUG(DB_PL, "Failed to generate object layout\n");
Expand Down Expand Up @@ -609,6 +610,7 @@ dc_pipeline_run(tse_task_t *api_task)
int total_replicas;
int shard;
struct pipeline_comp_cb_args comp_cb_args;
uint16_t layout_gl_ver;

coh = dc_obj_hdl2cont_hdl(api_args->oh);
rc = dc_obj_hdl2obj_md(api_args->oh, &obj_md);
Expand All @@ -629,7 +631,8 @@ dc_pipeline_run(tse_task_t *api_task)

/** get layout */

rc = pipeline_create_layout(coh, pool, &obj_md, &layout);
layout_gl_ver = dc_obj_hdl2layout_ver(api_args->oh);
rc = pipeline_create_layout(coh, pool, &obj_md, &layout, layout_gl_ver);
dc_pool_put(pool);
if (rc != 0)
D_GOTO(out, rc);
Expand Down Expand Up @@ -687,7 +690,7 @@ dc_pipeline_run(tse_task_t *api_task)
/** object id */
oid.id_pub = obj_md.omd_id;
oid.id_shard = shard;
oid.id_layout_ver = dc_obj_hdl2layout_ver(api_args->oh);
oid.id_layout_ver = layout_gl_ver;
oid.id_padding = 0;

/** queue shard task */
Expand Down
37 changes: 21 additions & 16 deletions src/placement/jump_map.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/**
*
* (C) Copyright 2016-2024 Intel Corporation.
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*/
Expand Down Expand Up @@ -46,7 +47,7 @@ jm_obj_placement_fini(struct jm_obj_placement *jmop)
#define LOCAL_PD_ARRAY_SIZE (4)
static int
jm_obj_pd_init(struct pl_jump_map *jmap, struct daos_obj_md *md, struct pool_domain *root,
struct jm_obj_placement *jmop)
struct jm_obj_placement *jmop, uint32_t layout_ver)
{
struct pool_domain *pds, *pd;
uint8_t *pd_used = NULL;
Expand Down Expand Up @@ -114,9 +115,9 @@ jm_obj_pd_init(struct pl_jump_map *jmap, struct daos_obj_md *md, struct pool_dom
}

oid = md->omd_id;
key = oid.hi ^ oid.lo;
key = jm_oid_hash(layout_ver, oid);
for (i = 0; i < jmop->jmop_pd_nr; i++) {
key = crc(key, i);
key = (layout_ver <= 1) ? crc(key, i) : jm_crc(key, i, 0xcafebabe);
selected_pd = d_hash_jump(key, jmap->jmp_pd_nr);
do {
selected_pd = selected_pd % jmap->jmp_pd_nr;
Expand Down Expand Up @@ -242,8 +243,8 @@ layout_find_diff(struct pl_jump_map *jmap, struct pl_obj_layout *original,
*/
static int
jm_obj_placement_init(struct pl_jump_map *jmap, struct daos_obj_md *md,
struct daos_obj_shard_md *shard_md,
struct jm_obj_placement *jmop)
struct daos_obj_shard_md *shard_md, struct jm_obj_placement *jmop,
uint32_t layout_ver)
{
struct daos_oclass_attr *oc_attr;
struct pool_domain *root;
Expand Down Expand Up @@ -305,7 +306,7 @@ jm_obj_placement_init(struct pl_jump_map *jmap, struct daos_obj_md *md,
D_ASSERT(jmop->jmop_grp_nr > 0);
D_ASSERT(jmop->jmop_grp_size > 0);

rc = jm_obj_pd_init(jmap, md, root, jmop);
rc = jm_obj_pd_init(jmap, md, root, jmop, layout_ver);
if (rc == 0)
D_DEBUG(DB_PL, "obj="DF_OID"/ grp_size=%u grp_nr=%d, pd_nr=%u pd_grp_size=%u\n",
DP_OID(oid), jmop->jmop_grp_size, jmop->jmop_grp_nr,
Expand Down Expand Up @@ -404,7 +405,7 @@ obj_remap_shards(struct pl_jump_map *jmap, uint32_t layout_ver, struct daos_obj_
current = remap_list->next;
spare_tgt = NULL;
oid = md->omd_id;
key = oid.hi ^ oid.lo;
key = jm_oid_hash(layout_ver, oid);
spares_left = count_available_spares(jmap, layout, failed_in_layout);

rc = pool_map_find_domain(jmap->jmp_map.pl_poolmap, PO_COMP_TP_ROOT,
Expand Down Expand Up @@ -435,13 +436,16 @@ obj_remap_shards(struct pl_jump_map *jmap, uint32_t layout_ver, struct daos_obj_
dgu = f_shard->fs_data;

D_ASSERT(dgu != NULL);
rebuild_key = crc(key, f_shard->fs_shard_idx);
if (layout_ver <= 1)
rebuild_key = crc(key, crc(key, f_shard->fs_shard_idx));
else /* hash OID differently so we don't land to the same target */
rebuild_key = jm_crc(oid.lo, oid.hi, 0xDead2Bad);

curr_pd = jm_obj_shard_pd(jmop, shard_id);
get_target(root, curr_pd, layout_ver, &spare_tgt, &spare_dom,
crc(key, rebuild_key), dom_used, dom_full,
dgu->dgu_used, dgu->dgu_real, tgts_used,
shard_id, allow_version, gen_mode, fdom_lvl,
jmop->jmop_grp_size, &spares_left, &spare_avail);
get_target(root, curr_pd, layout_ver, &spare_tgt, &spare_dom, rebuild_key,
dom_used, dom_full, dgu->dgu_used, dgu->dgu_real, tgts_used,
shard_id, allow_version, gen_mode, fdom_lvl, jmop->jmop_grp_size,
&spares_left, &spare_avail);
if (layout_ver > 0) {
/*
* After 2.4 (layout_ver > 0), it will always assign each shard
Expand Down Expand Up @@ -644,7 +648,8 @@ get_object_layout(struct pl_jump_map *jmap, uint32_t layout_ver, struct pl_obj_l
D_GOTO(out, rc = -DER_NOMEM);

oid = md->omd_id;
key = oid.hi ^ oid.lo;
key = jm_oid_hash(layout_ver, oid);

if (daos_obj_is_srank(oid))
spec_oid = true;

Expand Down Expand Up @@ -1012,7 +1017,7 @@ jump_map_obj_place(struct pl_map *map, uint32_t layout_version, struct daos_obj_
D_DEBUG(DB_PL, "Determining location for object: "DF_OID", ver: %d, pda %u\n",
DP_OID(oid), md->omd_ver, md->omd_pda);

rc = jm_obj_placement_init(jmap, md, shard_md, &jmop);
rc = jm_obj_placement_init(jmap, md, shard_md, &jmop, layout_version);
if (rc) {
D_ERROR("jm_obj_placement_init failed, rc "DF_RC"\n", DP_RC(rc));
return rc;
Expand Down Expand Up @@ -1115,7 +1120,7 @@ jump_map_obj_find_diff(struct pl_map *map, uint32_t layout_ver, struct daos_obj_
}

jmap = pl_map2jmap(map);
rc = jm_obj_placement_init(jmap, md, shard_md, &jop);
rc = jm_obj_placement_init(jmap, md, shard_md, &jop, layout_ver);
if (rc) {
D_ERROR("jm_obj_placement_init failed, rc %d.\n", rc);
return rc;
Expand Down
19 changes: 19 additions & 0 deletions src/placement/jump_map.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/**
* (C) Copyright 2022-2023 Intel Corporation.
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*/
Expand Down Expand Up @@ -61,4 +62,22 @@ get_target(struct pool_domain *root, struct pool_domain *curr_pd, uint32_t layou
uint8_t *dom_full, uint8_t *dom_cur_grp_used, uint8_t *dom_cur_grp_real,
uint8_t *tgts_used, int shard_num, uint32_t allow_version, enum layout_gen_mode gen_mode,
pool_comp_type_t fdom_lvl, uint32_t grp_size, uint32_t *spare_left, bool *spare_avail);

static inline uint64_t
jm_crc(uint64_t val0, uint64_t val1, uint64_t val2)
{
uint64_t data[3];

data[0] = val0;
data[1] = val1;
data[2] = val2;
return crc64_ecma_refl(0xbabecafe, (uint8_t *)data, 24);
}

static inline uint64_t
jm_oid_hash(uint32_t layout_ver, daos_obj_id_t oid)
{
return layout_ver <= 1 ? (oid.hi ^ oid.lo) : jm_crc(oid.hi, oid.lo, 0xbabeface);
}

#endif /* __JUMP_MAP_H__ */
Loading
Loading