diff --git a/database.cc b/database.cc index 0f5859ca0f..a695cd4d42 100644 --- a/database.cc +++ b/database.cc @@ -1431,6 +1431,10 @@ future<> database::apply_in_memory(const mutation& m, column_family& cf, db::rp_ } future database::apply_counter_update(schema_ptr s, const frozen_mutation& m, db::timeout_clock::time_point timeout, tracing::trace_state_ptr trace_state) { + if (timeout <= db::timeout_clock::now()) { + update_write_metrics_for_timed_out_write(); + return make_exception_future(timed_out_error{}); + } return update_write_metrics(seastar::futurize_apply([&] { if (!s->is_synced()) { throw std::runtime_error(format("attempted to mutate using not synced schema of {}.{}, version={}", @@ -1527,10 +1531,20 @@ Future database::update_write_metrics(Future&& f) { }); } +void database::update_write_metrics_for_timed_out_write() { + ++_stats->total_writes; + ++_stats->total_writes_failed; + ++_stats->total_writes_timedout; +} + future<> database::apply(schema_ptr s, const frozen_mutation& m, db::commitlog::force_sync sync, db::timeout_clock::time_point timeout) { if (dblog.is_enabled(logging::log_level::trace)) { dblog.trace("apply {}", m.pretty_printer(s)); } + if (timeout <= db::timeout_clock::now()) { + update_write_metrics_for_timed_out_write(); + return make_exception_future<>(timed_out_error{}); + } return update_write_metrics(_apply_stage(this, std::move(s), seastar::cref(m), timeout, sync)); } diff --git a/database.hh b/database.hh index 10b3a9a33d..3adce2e1f0 100644 --- a/database.hh +++ b/database.hh @@ -1361,6 +1361,7 @@ private: template Future update_write_metrics(Future&& f); + void update_write_metrics_for_timed_out_write(); public: static utils::UUID empty_version;