Skip to content

Commit a1cdd6f

Browse files
committed
DAOS-17550 object: refine dc_array_set_size processing
1. use memcmp rather than strncmp in merge_key strncmp can cause some keys be incorrectly ignored 2. refine list dkey by providing more memory to save RPC round-trip. Signed-off-by: Xuezhao Liu <[email protected]>
1 parent ebe320a commit a1cdd6f

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

src/client/array/dc_array.c

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,9 +1887,9 @@ dc_array_punch(tse_task_t *task)
18871887
DAOS_OPC_ARRAY_PUNCH, task);
18881888
}
18891889

1890-
#define ENUM_KEY_BUF 32
1891-
#define ENUM_DESC_BUF 512
1892-
#define ENUM_DESC_NR 5
1890+
#define ENUM_DESC_BUF 1024
1891+
#define ENUM_DESC_NR 16
1892+
#define ENUM_DESC_NR_MAX 4096
18931893

18941894
struct key_query_props {
18951895
struct dc_array *array;
@@ -2089,11 +2089,15 @@ dc_array_stat(tse_task_t *task)
20892089

20902090
struct set_size_props {
20912091
struct dc_array *array;
2092-
char buf[ENUM_DESC_BUF];
2093-
daos_key_desc_t kds[ENUM_DESC_NR];
2092+
char buf_inline[ENUM_DESC_BUF];
2093+
daos_key_desc_t kds_inline[ENUM_DESC_NR];
2094+
daos_key_desc_t *kds;
2095+
char *buf;
20942096
char *val;
20952097
d_iov_t iov;
20962098
d_sg_list_t sgl;
2099+
uint32_t kds_size;
2100+
uint32_t buf_len;
20972101
uint32_t nr;
20982102
daos_anchor_t anchor;
20992103
bool update_dkey;
@@ -2111,6 +2115,10 @@ free_set_size_cb(tse_task_t *task, void *data)
21112115
{
21122116
struct set_size_props *props = *((struct set_size_props **)data);
21132117

2118+
if (props->kds != props->kds_inline)
2119+
D_FREE(props->kds);
2120+
if (props->buf != props->buf_inline)
2121+
D_FREE(props->buf);
21142122
D_FREE(props->val);
21152123
if (props->array)
21162124
array_decref(props->array);
@@ -2539,10 +2547,37 @@ adjust_array_size_cb(tse_task_t *task, void *data)
25392547
}
25402548

25412549
if (!daos_anchor_is_eof(args->dkey_anchor)) {
2542-
props->nr = ENUM_DESC_NR;
2543-
memset(props->buf, 0, ENUM_DESC_BUF);
2550+
/* if with more dkeys, double the memory for list dkey to save #RPCs */
2551+
if (props->kds_size * 2 <= ENUM_DESC_NR_MAX) {
2552+
uint32_t new_buf_len;
2553+
uint32_t new_kds_size;
2554+
char *new_buf;
2555+
daos_key_desc_t *new_kds;
2556+
2557+
new_buf_len = props->buf_len * 2;
2558+
D_ALLOC(new_buf, new_buf_len);
2559+
if (new_buf == NULL)
2560+
D_GOTO(out, rc = -DER_NOMEM);
2561+
new_kds_size = props->kds_size * 2;
2562+
D_ALLOC_ARRAY(new_kds, new_kds_size);
2563+
if (new_kds == NULL) {
2564+
D_FREE(new_buf);
2565+
D_GOTO(out, rc = -DER_NOMEM);
2566+
}
2567+
if (props->kds != props->kds_inline)
2568+
D_FREE(props->kds);
2569+
if (props->buf != props->buf_inline)
2570+
D_FREE(props->buf);
2571+
props->buf = new_buf;
2572+
props->buf_len = new_buf_len;
2573+
props->kds = new_kds;
2574+
props->kds_size = new_kds_size;
2575+
args->kds = props->kds;
2576+
}
2577+
props->nr = props->kds_size;
2578+
memset(props->buf, 0, props->buf_len);
25442579
args->sgl->sg_nr = 1;
2545-
d_iov_set(&args->sgl->sg_iovs[0], props->buf, ENUM_DESC_BUF);
2580+
d_iov_set(&args->sgl->sg_iovs[0], props->buf, props->buf_len);
25462581

25472582
rc = tse_task_register_cbs(task, NULL, NULL, 0, adjust_array_size_cb, &props,
25482583
sizeof(props));
@@ -2612,16 +2647,20 @@ dc_array_set_size(tse_task_t *task)
26122647
if (set_size_props == NULL)
26132648
D_GOTO(err_task, rc = -DER_NOMEM);
26142649

2615-
set_size_props->dkey_val = dkey_val;
2616-
set_size_props->array = array;
2617-
set_size_props->cell_size = array->cell_size;
2650+
set_size_props->dkey_val = dkey_val;
2651+
set_size_props->array = array;
2652+
set_size_props->cell_size = array->cell_size;
26182653
set_size_props->num_records = num_records;
2619-
set_size_props->record_i = record_i;
2620-
set_size_props->chunk_size = array->chunk_size;
2621-
set_size_props->nr = ENUM_DESC_NR;
2622-
set_size_props->size = args->size;
2623-
set_size_props->ptask = task;
2624-
set_size_props->val = NULL;
2654+
set_size_props->record_i = record_i;
2655+
set_size_props->chunk_size = array->chunk_size;
2656+
set_size_props->nr = ENUM_DESC_NR;
2657+
set_size_props->kds_size = ENUM_DESC_NR;
2658+
set_size_props->size = args->size;
2659+
set_size_props->ptask = task;
2660+
set_size_props->val = NULL;
2661+
set_size_props->kds = set_size_props->kds_inline;
2662+
set_size_props->buf = set_size_props->buf_inline;
2663+
set_size_props->buf_len = ENUM_DESC_BUF;
26252664
if (args->size == 0)
26262665
set_size_props->update_dkey = false;
26272666
else
@@ -2630,7 +2669,7 @@ dc_array_set_size(tse_task_t *task)
26302669
memset(&set_size_props->anchor, 0, sizeof(set_size_props->anchor));
26312670
set_size_props->sgl.sg_nr = 1;
26322671
set_size_props->sgl.sg_iovs = &set_size_props->iov;
2633-
d_iov_set(&set_size_props->sgl.sg_iovs[0], set_size_props->buf, ENUM_DESC_BUF);
2672+
d_iov_set(&set_size_props->sgl.sg_iovs[0], set_size_props->buf, set_size_props->buf_len);
26342673

26352674
rc = daos_task_create(DAOS_OPC_OBJ_LIST_DKEY, tse_task2sched(task), 0, NULL, &enum_task);
26362675
if (rc)

src/object/cli_obj.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3573,7 +3573,7 @@ merge_key(struct dc_object *obj, d_list_t *head, char *key, int key_size)
35733573

35743574
d_list_for_each_entry(key_one, head, key_list) {
35753575
if (key_size == key_one->key.iov_len &&
3576-
strncmp(key_one->key.iov_buf, key, key_size) == 0) {
3576+
memcmp(key_one->key.iov_buf, key, key_size) == 0) {
35773577
return 0;
35783578
}
35793579
}

0 commit comments

Comments
 (0)