diff --git a/service/storage_service.cc b/service/storage_service.cc index 4116809530..88af2ba710 100644 --- a/service/storage_service.cc +++ b/service/storage_service.cc @@ -90,6 +90,7 @@ static const sstring DIGEST_MULTIPARTITION_READ_FEATURE = "DIGEST_MULTIPARTITION static const sstring CORRECT_COUNTER_ORDER_FEATURE = "CORRECT_COUNTER_ORDER"; static const sstring SCHEMA_TABLES_V3 = "SCHEMA_TABLES_V3"; static const sstring CORRECT_NON_COMPOUND_RANGE_TOMBSTONES = "CORRECT_NON_COMPOUND_RANGE_TOMBSTONES"; +static const sstring WRITE_FAILURE_REPLY_FEATURE = "WRITE_FAILURE_REPLY"; distributed _the_storage_service; @@ -136,6 +137,7 @@ sstring storage_service::get_config_supported_features() { CORRECT_COUNTER_ORDER_FEATURE, SCHEMA_TABLES_V3, CORRECT_NON_COMPOUND_RANGE_TOMBSTONES, + WRITE_FAILURE_REPLY_FEATURE, }; if (service::get_local_storage_service()._db.local().get_config().experimental()) { features.push_back(MATERIALIZED_VIEWS_FEATURE); @@ -347,6 +349,7 @@ void storage_service::register_features() { _correct_counter_order_feature = gms::feature(CORRECT_COUNTER_ORDER_FEATURE); _schema_tables_v3 = gms::feature(SCHEMA_TABLES_V3); _correct_non_compound_range_tombstones = gms::feature(CORRECT_NON_COMPOUND_RANGE_TOMBSTONES); + _write_failure_reply_feature = gms::feature(WRITE_FAILURE_REPLY_FEATURE); if (_db.local().get_config().experimental()) { _materialized_views_feature = gms::feature(MATERIALIZED_VIEWS_FEATURE); diff --git a/service/storage_service.hh b/service/storage_service.hh index 4ddfa485cc..c5d85edcdd 100644 --- a/service/storage_service.hh +++ b/service/storage_service.hh @@ -270,6 +270,7 @@ private: gms::feature _correct_counter_order_feature; gms::feature _schema_tables_v3; gms::feature _correct_non_compound_range_tombstones; + gms::feature _write_failure_reply_feature; public: void enable_all_features() { _range_tombstones_feature.enable(); @@ -281,6 +282,7 @@ public: _correct_counter_order_feature.enable(); _schema_tables_v3.enable(); _correct_non_compound_range_tombstones.enable(); + _write_failure_reply_feature.enable(); } void finish_bootstrapping() { @@ -2249,6 +2251,10 @@ public: bool cluster_supports_reading_correctly_serialized_range_tombstones() const { return bool(_correct_non_compound_range_tombstones); } + + bool node_supports_write_failure_reply(gms::inet_address ep) const { + return gms::get_local_gossiper().node_has_feature(ep, _write_failure_reply_feature); + } }; inline future<> init_storage_service(distributed& db, sharded& auth_service) {