@@ -1887,9 +1887,9 @@ dc_array_punch(tse_task_t *task)
1887
1887
DAOS_OPC_ARRAY_PUNCH , task );
1888
1888
}
1889
1889
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
1893
1893
1894
1894
struct key_query_props {
1895
1895
struct dc_array * array ;
@@ -2089,11 +2089,15 @@ dc_array_stat(tse_task_t *task)
2089
2089
2090
2090
struct set_size_props {
2091
2091
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 ;
2094
2096
char * val ;
2095
2097
d_iov_t iov ;
2096
2098
d_sg_list_t sgl ;
2099
+ uint32_t kds_size ;
2100
+ uint32_t buf_len ;
2097
2101
uint32_t nr ;
2098
2102
daos_anchor_t anchor ;
2099
2103
bool update_dkey ;
@@ -2111,6 +2115,10 @@ free_set_size_cb(tse_task_t *task, void *data)
2111
2115
{
2112
2116
struct set_size_props * props = * ((struct set_size_props * * )data );
2113
2117
2118
+ if (props -> kds != props -> kds_inline )
2119
+ D_FREE (props -> kds );
2120
+ if (props -> buf != props -> buf_inline )
2121
+ D_FREE (props -> buf );
2114
2122
D_FREE (props -> val );
2115
2123
if (props -> array )
2116
2124
array_decref (props -> array );
@@ -2539,10 +2547,37 @@ adjust_array_size_cb(tse_task_t *task, void *data)
2539
2547
}
2540
2548
2541
2549
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 );
2544
2579
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 );
2546
2581
2547
2582
rc = tse_task_register_cbs (task , NULL , NULL , 0 , adjust_array_size_cb , & props ,
2548
2583
sizeof (props ));
@@ -2612,16 +2647,20 @@ dc_array_set_size(tse_task_t *task)
2612
2647
if (set_size_props == NULL )
2613
2648
D_GOTO (err_task , rc = - DER_NOMEM );
2614
2649
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 ;
2618
2653
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 ;
2625
2664
if (args -> size == 0 )
2626
2665
set_size_props -> update_dkey = false;
2627
2666
else
@@ -2630,7 +2669,7 @@ dc_array_set_size(tse_task_t *task)
2630
2669
memset (& set_size_props -> anchor , 0 , sizeof (set_size_props -> anchor ));
2631
2670
set_size_props -> sgl .sg_nr = 1 ;
2632
2671
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 );
2634
2673
2635
2674
rc = daos_task_create (DAOS_OPC_OBJ_LIST_DKEY , tse_task2sched (task ), 0 , NULL , & enum_task );
2636
2675
if (rc )
0 commit comments