diff --git a/src/common/prop.c b/src/common/prop.c index f581bc7425a..158c3707e02 100644 --- a/src/common/prop.c +++ b/src/common/prop.c @@ -1,6 +1,6 @@ /** * (C) Copyright 2019-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 */ @@ -454,8 +454,8 @@ daos_prop_valid(daos_prop_t *prop, bool pool, bool input) case DAOS_PROP_CO_CSUM_CHUNK_SIZE: /** Chunk size is encoded on 32 bits */ val = prop->dpp_entries[i].dpe_val; - if (val >= (1ULL << 32)) { - D_ERROR("invalid chunk size " DF_U64 ". Should be < 2GiB\n", val); + if (val > (1ULL << 31)) { + D_ERROR("invalid chunk size " DF_U64 ". Should be <= 2GiB\n", val); return false; } break; diff --git a/src/container/srv_container.c b/src/container/srv_container.c index 3efa3211f89..50b98c6eb3a 100644 --- a/src/container/srv_container.c +++ b/src/container/srv_container.c @@ -635,6 +635,22 @@ cont_create_existence_check(struct rdb_tx *tx, struct cont_svc *svc, uuid_t puui return -DER_INVAL; } +static uint64_t +snap_csum_chunk_size_to_next_pow2(uint64_t csum_chunk_sz_in) +{ + int nlz; + + if (csum_chunk_sz_in == 0) + return DAOS_PROP_CO_CSUM_CHUNK_SIZE_DEFAULT; + else if (csum_chunk_sz_in == 1) + return 1; + else if (csum_chunk_sz_in >= (1ULL << 31)) + return 1ULL << 31; /* 2GiB max according to daos_prop_is_valid() */ + + nlz = __builtin_clzll(csum_chunk_sz_in - 1); + return 1ULL << (64 - nlz); +} + /* copy \a prop to \a prop_def (duplicated default prop) for cont_create */ static int cont_create_prop_prepare(struct ds_pool_hdl *pool_hdl, @@ -671,7 +687,6 @@ cont_create_prop_prepare(struct ds_pool_hdl *pool_hdl, case DAOS_PROP_CO_LAYOUT_TYPE: case DAOS_PROP_CO_LAYOUT_VER: case DAOS_PROP_CO_CSUM: - case DAOS_PROP_CO_CSUM_CHUNK_SIZE: case DAOS_PROP_CO_CSUM_SERVER_VERIFY: case DAOS_PROP_CO_REDUN_LVL: case DAOS_PROP_CO_SNAPSHOT_MAX: @@ -687,6 +702,14 @@ cont_create_prop_prepare(struct ds_pool_hdl *pool_hdl, case DAOS_PROP_CO_SCRUBBER_DISABLED: entry_def->dpe_val = entry->dpe_val; break; + case DAOS_PROP_CO_CSUM_CHUNK_SIZE: + entry_def->dpe_val = snap_csum_chunk_size_to_next_pow2(entry->dpe_val); + if (entry_def->dpe_val != entry->dpe_val) { + D_DEBUG(DB_MD, + "csum_chunk_size adjusted from " DF_U64 " to " DF_U64 "\n", + entry->dpe_val, entry_def->dpe_val); + } + break; case DAOS_PROP_CO_REDUN_FAC: inherit_redunc_fac = false; entry_def->dpe_val = entry->dpe_val; @@ -4030,6 +4053,18 @@ set_prop(struct rdb_tx *tx, struct ds_pool *pool, struct cont *cont, uint64_t se D_GOTO(out, rc = -DER_INVAL); } + entry = daos_prop_entry_get(prop_in, DAOS_PROP_CO_CSUM_CHUNK_SIZE); + if (entry) { + uint64_t csum_chunk_sz_in = entry->dpe_val; + + entry->dpe_val = snap_csum_chunk_size_to_next_pow2(csum_chunk_sz_in); + if (entry->dpe_val != csum_chunk_sz_in) + D_DEBUG( + DB_MD, + DF_CONT ": csum_chunk_size adjusted from " DF_U64 " to " DF_U64 "\n", + DP_CONT(pool->sp_uuid, cont->c_uuid), csum_chunk_sz_in, entry->dpe_val); + } + if (!daos_prop_valid(prop_in, false, true)) D_GOTO(out, rc = -DER_INVAL); diff --git a/src/container/srv_layout.c b/src/container/srv_layout.c index 56929f6a6d0..0cf6cf1c88f 100644 --- a/src/container/srv_layout.c +++ b/src/container/srv_layout.c @@ -1,6 +1,6 @@ /** * (C) Copyright 2017-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 */ @@ -61,154 +61,183 @@ RDB_STRING_KEY(ds_cont_prop_, ec_agg_eph); static struct daos_prop_co_roots dummy_roots; /** default properties, should cover all optional container properties */ -struct daos_prop_entry cont_prop_entries_default_v0[CONT_PROP_NUM_V0] = { - { - .dpe_type = DAOS_PROP_CO_LABEL, - .dpe_str = DAOS_PROP_CO_LABEL_DEFAULT, - }, { - .dpe_type = DAOS_PROP_CO_LAYOUT_TYPE, - .dpe_val = DAOS_PROP_CO_LAYOUT_UNKNOWN, - }, { - .dpe_type = DAOS_PROP_CO_LAYOUT_VER, - .dpe_val = 1, - }, { - .dpe_type = DAOS_PROP_CO_CSUM, - .dpe_val = DAOS_PROP_CO_CSUM_CRC32, - }, { - .dpe_type = DAOS_PROP_CO_CSUM_CHUNK_SIZE, - .dpe_val = 32 * 1024, /** 32K */ - }, { - .dpe_type = DAOS_PROP_CO_CSUM_SERVER_VERIFY, - .dpe_val = DAOS_PROP_CO_CSUM_SV_ON, - }, { - .dpe_type = DAOS_PROP_CO_REDUN_FAC, - .dpe_val = DAOS_PROP_CO_REDUN_RF3, - }, { - .dpe_type = DAOS_PROP_CO_REDUN_LVL, - .dpe_val = DAOS_PROP_CO_REDUN_RANK, - }, { - .dpe_type = DAOS_PROP_CO_SNAPSHOT_MAX, - .dpe_val = 0, /* No limitation */ - }, { - .dpe_type = DAOS_PROP_CO_ACL, - .dpe_val_ptr = NULL, /* generated dynamically */ - }, { - .dpe_type = DAOS_PROP_CO_COMPRESS, - .dpe_val = DAOS_PROP_CO_COMPRESS_OFF, - }, { - .dpe_type = DAOS_PROP_CO_ENCRYPT, - .dpe_val = DAOS_PROP_CO_ENCRYPT_OFF, - }, { - .dpe_type = DAOS_PROP_CO_OWNER, - .dpe_str = "NOBODY@", - }, { - .dpe_type = DAOS_PROP_CO_OWNER_GROUP, - .dpe_str = "NOBODY@", - }, { - .dpe_type = DAOS_PROP_CO_DEDUP, - .dpe_val = DAOS_PROP_CO_DEDUP_OFF, - }, { - .dpe_type = DAOS_PROP_CO_DEDUP_THRESHOLD, - .dpe_val = 4096, - }, { - .dpe_type = DAOS_PROP_CO_ROOTS, - .dpe_val_ptr = &dummy_roots, /* overwritten by middlewares */ - }, { - .dpe_type = DAOS_PROP_CO_STATUS, - .dpe_val = DAOS_PROP_CO_STATUS_VAL(DAOS_PROP_CO_HEALTHY, - 0, 0), - }, { - .dpe_type = DAOS_PROP_CO_ALLOCED_OID, - .dpe_val = 0, - }, { - .dpe_type = DAOS_PROP_CO_EC_CELL_SZ, - .dpe_val = 0, /* inherit from pool by default */ - } -}; +struct daos_prop_entry cont_prop_entries_default_v0[CONT_PROP_NUM_V0] = { + { + .dpe_type = DAOS_PROP_CO_LABEL, + .dpe_str = DAOS_PROP_CO_LABEL_DEFAULT, + }, + { + .dpe_type = DAOS_PROP_CO_LAYOUT_TYPE, + .dpe_val = DAOS_PROP_CO_LAYOUT_UNKNOWN, + }, + { + .dpe_type = DAOS_PROP_CO_LAYOUT_VER, + .dpe_val = 1, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM, + .dpe_val = DAOS_PROP_CO_CSUM_CRC32, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM_CHUNK_SIZE, + .dpe_val = DAOS_PROP_CO_CSUM_CHUNK_SIZE_DEFAULT, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM_SERVER_VERIFY, + .dpe_val = DAOS_PROP_CO_CSUM_SV_ON, + }, + { + .dpe_type = DAOS_PROP_CO_REDUN_FAC, + .dpe_val = DAOS_PROP_CO_REDUN_RF3, + }, + { + .dpe_type = DAOS_PROP_CO_REDUN_LVL, + .dpe_val = DAOS_PROP_CO_REDUN_RANK, + }, + { + .dpe_type = DAOS_PROP_CO_SNAPSHOT_MAX, .dpe_val = 0, /* No limitation */ + }, + { + .dpe_type = DAOS_PROP_CO_ACL, .dpe_val_ptr = NULL, /* generated dynamically */ + }, + { + .dpe_type = DAOS_PROP_CO_COMPRESS, + .dpe_val = DAOS_PROP_CO_COMPRESS_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_ENCRYPT, + .dpe_val = DAOS_PROP_CO_ENCRYPT_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_OWNER, + .dpe_str = "NOBODY@", + }, + { + .dpe_type = DAOS_PROP_CO_OWNER_GROUP, + .dpe_str = "NOBODY@", + }, + { + .dpe_type = DAOS_PROP_CO_DEDUP, + .dpe_val = DAOS_PROP_CO_DEDUP_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_DEDUP_THRESHOLD, + .dpe_val = 4096, + }, + { + .dpe_type = DAOS_PROP_CO_ROOTS, + .dpe_val_ptr = &dummy_roots, /* overwritten by middlewares */ + }, + { + .dpe_type = DAOS_PROP_CO_STATUS, + .dpe_val = DAOS_PROP_CO_STATUS_VAL(DAOS_PROP_CO_HEALTHY, 0, 0), + }, + { + .dpe_type = DAOS_PROP_CO_ALLOCED_OID, + .dpe_val = 0, + }, + { + .dpe_type = DAOS_PROP_CO_EC_CELL_SZ, .dpe_val = 0, /* inherit from pool by default */ + }}; /** default properties, should cover all optional container properties */ struct daos_prop_entry cont_prop_entries_default[CONT_PROP_NUM] = { - { - .dpe_type = DAOS_PROP_CO_LABEL, - .dpe_str = DAOS_PROP_CO_LABEL_DEFAULT, - }, { - .dpe_type = DAOS_PROP_CO_LAYOUT_TYPE, - .dpe_val = DAOS_PROP_CO_LAYOUT_UNKNOWN, - }, { - .dpe_type = DAOS_PROP_CO_LAYOUT_VER, - .dpe_val = 1, - }, { - .dpe_type = DAOS_PROP_CO_CSUM, - .dpe_val = DAOS_PROP_CO_CSUM_OFF, - }, { - .dpe_type = DAOS_PROP_CO_CSUM_CHUNK_SIZE, - .dpe_val = 32 * 1024, /** 32K */ - }, { - .dpe_type = DAOS_PROP_CO_CSUM_SERVER_VERIFY, - .dpe_val = DAOS_PROP_CO_CSUM_SV_OFF, - }, { - .dpe_type = DAOS_PROP_CO_REDUN_FAC, - .dpe_val = DAOS_PROP_CO_REDUN_RF0, - }, { - .dpe_type = DAOS_PROP_CO_REDUN_LVL, - .dpe_val = DAOS_PROP_CO_REDUN_DEFAULT, - }, { - .dpe_type = DAOS_PROP_CO_SNAPSHOT_MAX, - .dpe_val = 0, /* No limitation */ - }, { - .dpe_type = DAOS_PROP_CO_ACL, - .dpe_val_ptr = NULL, /* generated dynamically */ - }, { - .dpe_type = DAOS_PROP_CO_COMPRESS, - .dpe_val = DAOS_PROP_CO_COMPRESS_OFF, - }, { - .dpe_type = DAOS_PROP_CO_ENCRYPT, - .dpe_val = DAOS_PROP_CO_ENCRYPT_OFF, - }, { - .dpe_type = DAOS_PROP_CO_OWNER, - .dpe_str = "NOBODY@", - }, { - .dpe_type = DAOS_PROP_CO_OWNER_GROUP, - .dpe_str = "NOBODY@", - }, { - .dpe_type = DAOS_PROP_CO_DEDUP, - .dpe_val = DAOS_PROP_CO_DEDUP_OFF, - }, { - .dpe_type = DAOS_PROP_CO_DEDUP_THRESHOLD, - .dpe_val = 4096, - }, { - .dpe_type = DAOS_PROP_CO_ROOTS, - .dpe_val_ptr = &dummy_roots, /* overwritten by middlewares */ - }, { - .dpe_type = DAOS_PROP_CO_STATUS, - .dpe_val = DAOS_PROP_CO_STATUS_VAL(DAOS_PROP_CO_HEALTHY, - 0, 0), - }, { - .dpe_type = DAOS_PROP_CO_ALLOCED_OID, - .dpe_val = 0, - }, { - .dpe_type = DAOS_PROP_CO_EC_CELL_SZ, - .dpe_val = 0, /* inherit from pool by default */ - }, { - .dpe_type = DAOS_PROP_CO_EC_PDA, - .dpe_val = 0, /* inherit from pool by default */ - }, { - .dpe_type = DAOS_PROP_CO_RP_PDA, - .dpe_val = 0, /* inherit from pool by default */ - }, { - .dpe_type = DAOS_PROP_CO_GLOBAL_VERSION, - .dpe_val = 0, /* inherit from pool by default */ - }, { - .dpe_type = DAOS_PROP_CO_SCRUBBER_DISABLED, - .dpe_val = 0, - }, { - .dpe_type = DAOS_PROP_CO_OBJ_VERSION, - .dpe_val = 0, /* inherit from pool by default */ - }, { - .dpe_type = DAOS_PROP_CO_PERF_DOMAIN, - .dpe_val = 0, /* inherit from pool by default */ - } -}; + { + .dpe_type = DAOS_PROP_CO_LABEL, + .dpe_str = DAOS_PROP_CO_LABEL_DEFAULT, + }, + { + .dpe_type = DAOS_PROP_CO_LAYOUT_TYPE, + .dpe_val = DAOS_PROP_CO_LAYOUT_UNKNOWN, + }, + { + .dpe_type = DAOS_PROP_CO_LAYOUT_VER, + .dpe_val = 1, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM, + .dpe_val = DAOS_PROP_CO_CSUM_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM_CHUNK_SIZE, + .dpe_val = DAOS_PROP_CO_CSUM_CHUNK_SIZE_DEFAULT, + }, + { + .dpe_type = DAOS_PROP_CO_CSUM_SERVER_VERIFY, + .dpe_val = DAOS_PROP_CO_CSUM_SV_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_REDUN_FAC, + .dpe_val = DAOS_PROP_CO_REDUN_RF0, + }, + { + .dpe_type = DAOS_PROP_CO_REDUN_LVL, + .dpe_val = DAOS_PROP_CO_REDUN_DEFAULT, + }, + { + .dpe_type = DAOS_PROP_CO_SNAPSHOT_MAX, .dpe_val = 0, /* No limitation */ + }, + { + .dpe_type = DAOS_PROP_CO_ACL, .dpe_val_ptr = NULL, /* generated dynamically */ + }, + { + .dpe_type = DAOS_PROP_CO_COMPRESS, + .dpe_val = DAOS_PROP_CO_COMPRESS_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_ENCRYPT, + .dpe_val = DAOS_PROP_CO_ENCRYPT_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_OWNER, + .dpe_str = "NOBODY@", + }, + { + .dpe_type = DAOS_PROP_CO_OWNER_GROUP, + .dpe_str = "NOBODY@", + }, + { + .dpe_type = DAOS_PROP_CO_DEDUP, + .dpe_val = DAOS_PROP_CO_DEDUP_OFF, + }, + { + .dpe_type = DAOS_PROP_CO_DEDUP_THRESHOLD, + .dpe_val = 4096, + }, + { + .dpe_type = DAOS_PROP_CO_ROOTS, + .dpe_val_ptr = &dummy_roots, /* overwritten by middlewares */ + }, + { + .dpe_type = DAOS_PROP_CO_STATUS, + .dpe_val = DAOS_PROP_CO_STATUS_VAL(DAOS_PROP_CO_HEALTHY, 0, 0), + }, + { + .dpe_type = DAOS_PROP_CO_ALLOCED_OID, + .dpe_val = 0, + }, + { + .dpe_type = DAOS_PROP_CO_EC_CELL_SZ, .dpe_val = 0, /* inherit from pool by default */ + }, + { + .dpe_type = DAOS_PROP_CO_EC_PDA, .dpe_val = 0, /* inherit from pool by default */ + }, + { + .dpe_type = DAOS_PROP_CO_RP_PDA, .dpe_val = 0, /* inherit from pool by default */ + }, + { + .dpe_type = DAOS_PROP_CO_GLOBAL_VERSION, .dpe_val = 0, /* inherit from pool by default */ + }, + { + .dpe_type = DAOS_PROP_CO_SCRUBBER_DISABLED, + .dpe_val = 0, + }, + { + .dpe_type = DAOS_PROP_CO_OBJ_VERSION, .dpe_val = 0, /* inherit from pool by default */ + }, + { + .dpe_type = DAOS_PROP_CO_PERF_DOMAIN, .dpe_val = 0, /* inherit from pool by default */ + }}; daos_prop_t cont_prop_default_v0 = { .dpp_nr = CONT_PROP_NUM_V0, diff --git a/src/include/daos_prop.h b/src/include/daos_prop.h index d41c59bc50b..82c4370b7d9 100644 --- a/src/include/daos_prop.h +++ b/src/include/daos_prop.h @@ -1,6 +1,6 @@ /** * (C) Copyright 2015-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 */ @@ -574,6 +574,7 @@ struct daos_prop_entry { /** default values for unset labels */ #define DAOS_PROP_CO_LABEL_DEFAULT "container_label_not_set" #define DAOS_PROP_PO_LABEL_DEFAULT "pool_label_not_set" +#define DAOS_PROP_CO_CSUM_CHUNK_SIZE_DEFAULT (32 * 1024) /* 32KiB */ /** * Check if DAOS (pool or container property) label string is valid.