diff --git a/google/cloud/spanner/commit_options.cc b/google/cloud/spanner/commit_options.cc index da09fd7ea296e..707216167c956 100644 --- a/google/cloud/spanner/commit_options.cc +++ b/google/cloud/spanner/commit_options.cc @@ -30,6 +30,9 @@ CommitOptions::CommitOptions(Options const& opts) if (opts.has()) { transaction_tag_ = opts.get(); } + if (opts.has()) { + max_batching_delay_ms_ = opts.get(); + } } CommitOptions::operator Options() const { diff --git a/google/cloud/spanner/commit_options.h b/google/cloud/spanner/commit_options.h index c47df0b7f665c..e50b77c0d1f45 100644 --- a/google/cloud/spanner/commit_options.h +++ b/google/cloud/spanner/commit_options.h @@ -70,6 +70,16 @@ class CommitOptions { return request_priority_; } + CommitOptions& set_max_batching_delay_ms( + int max_batching_delay_ms) { + max_batching_delay_ms_ = std::move(max_batching_delay_ms); + return *this; + } + + absl::optional max_batching_delay_ms() const { + return max_batching_delay_ms; + } + /** * Set the transaction tag for the `spanner::Client::Commit()` call. * Ignored for the overload that already takes a `spanner::Transaction`. @@ -90,6 +100,7 @@ class CommitOptions { // so we do not even provide a mechanism to specify one. bool return_stats_ = false; absl::optional request_priority_; + absl::optional max_batching_delay_ms_; absl::optional transaction_tag_; }; diff --git a/google/cloud/spanner/internal/connection_impl.cc b/google/cloud/spanner/internal/connection_impl.cc index 0707681968b86..e0f2346b006a7 100644 --- a/google/cloud/spanner/internal/connection_impl.cc +++ b/google/cloud/spanner/internal/connection_impl.cc @@ -1025,6 +1025,12 @@ StatusOr ConnectionImpl::CommitImpl( request.mutable_request_options()->set_priority( ProtoRequestPriority(params.options.request_priority())); + if (params.options.has()) { + *request.mutable_max_batching_delay() = + google::protobuf::util::TimeUtil::MillisecondsToDuration( + params.options.get()); + } + // params.options.transaction_tag() was either already used to set // ctx.tag (for a library-generated transaction), or it is ignored // (for a user-supplied transaction). diff --git a/google/cloud/spanner/options.h b/google/cloud/spanner/options.h index ddf1d1f64491f..3d8044024eb67 100644 --- a/google/cloud/spanner/options.h +++ b/google/cloud/spanner/options.h @@ -232,6 +232,15 @@ struct RequestPriorityOption { using Type = spanner::RequestPriority; }; +/** + * Option for `google::cloud::Options` to set a maximum batching delay. + * + * @ingroup spanner-options + */ +struct MaxBatchingDelayMsOption { + using Type = int; +}; + /** * Option for `google::cloud::Options` to set a per-request tag. * diff --git a/google/cloud/spanner/samples/samples.cc b/google/cloud/spanner/samples/samples.cc index 8444845eef8c6..023cd12d27529 100644 --- a/google/cloud/spanner/samples/samples.cc +++ b/google/cloud/spanner/samples/samples.cc @@ -3951,6 +3951,22 @@ void QueryInformationSchemaDatabaseOptions( } // [END spanner_query_information_schema_database_options] +// [START spanner_commit_with_batching_delay] +void UpdateDataWithBatchingDelay(google::cloud::spanner::Client client) { + namespace spanner = ::google::cloud::spanner; + Options ops; + ops.set(100); + auto commit_result = client.Commit(spanner::Mutations{ + spanner::UpdateMutationBuilder("Albums", + {"SingerId", "AlbumId", "MarketingBudget"}) + .EmplaceRow(1, 1, 100000) + .EmplaceRow(2, 2, 500000) + .Build()}, ops); + if (!commit_result) throw std::move(commit_result).status(); + std::cout << "Update was successful [spanner_update_data]\n"; +} +// [END spanner_set_batching_delay] + std::string Basename(absl::string_view name) { auto last_sep = name.find_last_of("/\\"); if (last_sep != absl::string_view::npos) name.remove_prefix(last_sep + 1); @@ -4147,6 +4163,8 @@ int RunOneCommand(std::vector argv) { make_command_entry("make-delete-mutation", MakeDeleteMutation), make_command_entry("query-information-schema-database-options", QueryInformationSchemaDatabaseOptions), + make_command_entry("spanner-commit-with-batching-delay", + UpdateDataWithBatchingDelay), }; static std::string usage_msg = [&argv, &commands] { @@ -4869,6 +4887,11 @@ void RunAll(bool emulator) { QueryInformationSchemaDatabaseOptions(client); } + if (!emulator) { + SampleBanner("spanner_commit_with_batching_delay"); + UpdateDataWithBatchingDelay(client); + } + if (!emulator) { SampleBanner("spanner_create_table_with_foreign_key_delete_cascade"); CreateTableWithForeignKeyDeleteCascade(database_admin_client, project_id,