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 <amnon@scylladb.com>
(cherry picked from commit 905408f764)

# Conflicts:
#	alternator/executor.cc
This commit is contained in:
Amnon Heiman
2024-09-17 13:38:08 +03:00
committed by Mergify
parent 6b4f0460ba
commit 3fffe7316d

View File

@@ -2104,6 +2104,7 @@ future<executor::request_return_type> executor::batch_write_item(client_state& c
return make_ready_future<request_return_type>(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::request_return_type> executor::batch_write_item(client_state& c
return make_ready_future<request_return_type>(api_error::validation("Provided list of item keys contains duplicates"));
}
used_keys.insert(std::move(mut_key));
batch_size++;
} else {
return make_ready_future<request_return_type>(api_error::validation(format("Unknown BatchWriteItem request type: {}", r_name)));
}
@@ -3362,7 +3364,7 @@ future<executor::request_return_type> executor::batch_get_item(client_state& cli
}
};
std::vector<table_requests> 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::request_return_type> 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<future<std::vector<rjson::value>>> response_futures;