@@ -2943,6 +2943,12 @@ as_batch_keys_execute_seq(
2943
2943
return status ;
2944
2944
}
2945
2945
2946
+ #define batch_results_init (_item_sz , _n_keys ) (_n_keys > 5000) ? \
2947
+ (as_batch_result*)cf_malloc(_item_sz * _n_keys) : \
2948
+ (as_batch_result*)alloca(_item_sz * _n_keys)
2949
+
2950
+ #define batch_results_free (_results , _nkeys ) if (_nkeys > 5000) {cf_free(_results);}
2951
+
2946
2952
static as_status
2947
2953
as_batch_keys_execute (
2948
2954
aerospike * as , as_error * err , const as_policy_batch * policy , const as_batch * batch ,
@@ -2971,9 +2977,8 @@ as_batch_keys_execute(
2971
2977
destroy_versions (versions );
2972
2978
return as_error_set_message (err , AEROSPIKE_ERR_SERVER , cluster_empty_error );
2973
2979
}
2974
-
2975
- // Allocate results array on stack. May be an issue for huge batch.
2976
- as_batch_result * results = (as_batch_result * )alloca (sizeof (as_batch_read ) * n_keys );
2980
+
2981
+ as_batch_result * results = batch_results_init (sizeof (as_batch_result ), n_keys );
2977
2982
2978
2983
as_vector batch_nodes ;
2979
2984
as_vector_inita (& batch_nodes , sizeof (as_batch_node ), n_nodes );
@@ -3009,6 +3014,7 @@ as_batch_keys_execute(
3009
3014
3010
3015
if (status != AEROSPIKE_OK ) {
3011
3016
destroy_versions (versions );
3017
+ batch_results_free (results , n_keys );
3012
3018
as_batch_release_nodes (& batch_nodes );
3013
3019
return status ;
3014
3020
}
@@ -3045,6 +3051,7 @@ as_batch_keys_execute(
3045
3051
// Fatal if no key requests were generated on initialization.
3046
3052
if (batch_nodes .size == 0 ) {
3047
3053
destroy_versions (versions );
3054
+ batch_results_free (results , n_keys );
3048
3055
return as_error_set_message (err , AEROSPIKE_BATCH_FAILED , "Nodes not found" );
3049
3056
}
3050
3057
@@ -3140,6 +3147,7 @@ as_batch_keys_execute(
3140
3147
as_batch_result * br = & btk .results [i ];
3141
3148
as_record_destroy (& br -> record );
3142
3149
}
3150
+ batch_results_free (results , n_keys );
3143
3151
3144
3152
if (status == AEROSPIKE_OK && error_row ) {
3145
3153
return as_error_set_message (err , AEROSPIKE_BATCH_FAILED ,
0 commit comments