From 3fffe7316da81d3b1c56b070e2d4d6ee9503e2f7 Mon Sep 17 00:00:00 2001 From: Amnon Heiman Date: Tue, 17 Sep 2024 13:38:08 +0300 Subject: [PATCH] alternator: Fix item counting in batch operations This patch fixes the logic for counting items in batch operations. Previously, the item count in requests was inaccurate, it count the number of tabels in get_item and the request_items in write_items. The new logic correctly counts each individual item in `BatchGetItem` and `BatchWriteItem` requests. Signed-off-by: Amnon Heiman (cherry picked from commit 905408f764b9af848d62435f73bf17967eade91e) # Conflicts: # alternator/executor.cc --- alternator/executor.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/alternator/executor.cc b/alternator/executor.cc index 102b027dc0..5df4d2c06f 100644 --- a/alternator/executor.cc +++ b/alternator/executor.cc @@ -2104,6 +2104,7 @@ future executor::batch_write_item(client_state& c return make_ready_future(api_error::validation("Provided list of item keys contains duplicates")); } used_keys.insert(std::move(mut_key)); + batch_size++; } else if (r_name == "DeleteRequest") { const rjson::value& key = (r->value)["Key"]; mutation_builders.emplace_back(schema, put_or_delete_item( @@ -2114,6 +2115,7 @@ future executor::batch_write_item(client_state& c return make_ready_future(api_error::validation("Provided list of item keys contains duplicates")); } used_keys.insert(std::move(mut_key)); + batch_size++; } else { return make_ready_future(api_error::validation(format("Unknown BatchWriteItem request type: {}", r_name))); } @@ -3362,7 +3364,7 @@ future executor::batch_get_item(client_state& cli } }; std::vector requests; - + uint batch_size = 0; for (auto it = request_items.MemberBegin(); it != request_items.MemberEnd(); ++it) { table_requests rs(get_table_from_batch_request(_proxy, it)); tracing::add_table_name(trace_state, sstring(executor::KEYSPACE_NAME_PREFIX) + rs.schema->cf_name(), rs.schema->cf_name()); @@ -3376,9 +3378,18 @@ future executor::batch_get_item(client_state& cli rs.add(key); check_key(key, rs.schema); } + batch_size += rs.requests.size(); requests.emplace_back(std::move(rs)); } +<<<<<<< HEAD +======= + for (const table_requests& tr : requests) { + co_await verify_permission(client_state, tr.schema, auth::permission::SELECT); + } + + _stats.api_operations.batch_get_item_batch_total += batch_size; +>>>>>>> 905408f764 (alternator: Fix item counting in batch operations) // If we got here, all "requests" are valid, so let's start the // requests for the different partitions all in parallel. std::vector>> response_futures;