Skip to content

Commit ee9fce6

Browse files
committed
CLIENT-3307 Allocate batch results array on heap for large batches. This avoids stack overflow errors that might occur on larges batches.
1 parent ff2be82 commit ee9fce6

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

src/main/aerospike/aerospike_batch.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,6 +2943,12 @@ as_batch_keys_execute_seq(
29432943
return status;
29442944
}
29452945

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+
29462952
static as_status
29472953
as_batch_keys_execute(
29482954
aerospike* as, as_error* err, const as_policy_batch* policy, const as_batch* batch,
@@ -2971,9 +2977,8 @@ as_batch_keys_execute(
29712977
destroy_versions(versions);
29722978
return as_error_set_message(err, AEROSPIKE_ERR_SERVER, cluster_empty_error);
29732979
}
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);
29772982

29782983
as_vector batch_nodes;
29792984
as_vector_inita(&batch_nodes, sizeof(as_batch_node), n_nodes);
@@ -3009,6 +3014,7 @@ as_batch_keys_execute(
30093014

30103015
if (status != AEROSPIKE_OK) {
30113016
destroy_versions(versions);
3017+
batch_results_free(results, n_keys);
30123018
as_batch_release_nodes(&batch_nodes);
30133019
return status;
30143020
}
@@ -3045,6 +3051,7 @@ as_batch_keys_execute(
30453051
// Fatal if no key requests were generated on initialization.
30463052
if (batch_nodes.size == 0) {
30473053
destroy_versions(versions);
3054+
batch_results_free(results, n_keys);
30483055
return as_error_set_message(err, AEROSPIKE_BATCH_FAILED, "Nodes not found");
30493056
}
30503057

@@ -3140,6 +3147,7 @@ as_batch_keys_execute(
31403147
as_batch_result* br = &btk.results[i];
31413148
as_record_destroy(&br->record);
31423149
}
3150+
batch_results_free(results, n_keys);
31433151

31443152
if (status == AEROSPIKE_OK && error_row) {
31453153
return as_error_set_message(err, AEROSPIKE_BATCH_FAILED,

0 commit comments

Comments
 (0)