15 #ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_MUTATION_BATCHER_H
16 #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_BIGTABLE_MUTATION_BATCHER_H
18 #include "google/cloud/bigtable/client_options.h"
19 #include "google/cloud/bigtable/completion_queue.h"
20 #include "google/cloud/bigtable/mutations.h"
21 #include "google/cloud/bigtable/table.h"
22 #include "google/cloud/bigtable/version.h"
23 #include "google/cloud/status.h"
24 #include "absl/memory/memory.h"
25 #include <google/bigtable/v2/bigtable.pb.h>
95 : table_(std::move(table)),
97 cur_batch_(std::make_shared<Batch>()) {}
170 using CompletionPromise = promise<
Status>;
171 using AdmissionPromise = promise<
void>;
172 using NoMorePendingPromise = promise<
void>;
178 struct PendingSingleRowMutation {
180 CompletionPromise completion_promise,
181 AdmissionPromise admission_promise);
184 size_t num_mutations;
186 CompletionPromise completion_promise;
187 AdmissionPromise admission_promise;
197 struct MutationData {
198 explicit MutationData(PendingSingleRowMutation pending)
199 : completion_promise
(std::move(pending.completion_promise)
) {}
200 CompletionPromise completion_promise;
223 std::size_t num_mutations = 0;
224 std::size_t requests_size = 0;
226 std::vector<MutationData> mutation_data;
230 grpc::Status IsValid(PendingSingleRowMutation& mut)
const;
236 bool HasSpaceFor(PendingSingleRowMutation
const& mut)
const;
243 bool CanAppendToBatch(PendingSingleRowMutation
const& mut)
const {
247 return pending_mutations_.empty() && HasSpaceFor(mut);
271 void Admit(PendingSingleRowMutation mut);
277 void SatisfyPromises(std::vector<AdmissionPromise>,
278 std::unique_lock<std::mutex>& lk);
285 std::size_t num_outstanding_batches_ = 0;
287 std::size_t outstanding_size_ = 0;
289 std::size_t outstanding_mutations_ = 0;
291 std::size_t num_requests_pending_ = 0;
294 std::shared_ptr<Batch> cur_batch_;
301 std::queue<PendingSingleRowMutation> pending_mutations_;
309 std::vector<NoMorePendingPromise> no_more_pending_promises_;