@@ -325,7 +325,7 @@ class TTableDescription::TImpl {
325325 }
326326
327327 // ttl settings
328- if (auto ttlSettings = TTtlSettings::DeserializeFromProto (proto.ttl_settings ())) {
328+ if (auto ttlSettings = TTtlSettings::FromProto (proto.ttl_settings ())) {
329329 TtlSettings_ = std::move (*ttlSettings);
330330 }
331331
@@ -2729,13 +2729,13 @@ bool operator!=(const TChangefeedDescription& lhs, const TChangefeedDescription&
27292729
27302730// //////////////////////////////////////////////////////////////////////////////
27312731
2732- TTtlTierSettings::TTtlTierSettings (TDuration evictionDelay , const TAction& action)
2733- : EvictAfter_(evictionDelay )
2734- , Action_(action) {
2735- }
2732+ TTtlTierSettings::TTtlTierSettings (TDuration applyAfter , const TAction& action)
2733+ : ApplyAfter_(applyAfter )
2734+ , Action_(action)
2735+ { }
27362736
27372737TTtlTierSettings::TTtlTierSettings (const Ydb::Table::TtlTier& tier)
2738- : EvictAfter_ (TDuration::Seconds(tier.apply_after_seconds())) {
2738+ : ApplyAfter_ (TDuration::Seconds(tier.apply_after_seconds())) {
27392739 switch (tier.action_case ()) {
27402740 case Ydb::Table::TtlTier::kDelete :
27412741 Action_ = TTtlDeleteAction ();
@@ -2749,7 +2749,7 @@ TTtlTierSettings::TTtlTierSettings(const Ydb::Table::TtlTier& tier)
27492749}
27502750
27512751void TTtlTierSettings::SerializeTo (Ydb::Table::TtlTier& proto) const {
2752- proto.set_apply_after_seconds (EvictAfter_ .Seconds ());
2752+ proto.set_apply_after_seconds (ApplyAfter_ .Seconds ());
27532753
27542754 std::visit (TOverloaded{
27552755 [&proto](const TTtlDeleteAction&) { proto.mutable_delete_ (); },
@@ -2761,8 +2761,8 @@ void TTtlTierSettings::SerializeTo(Ydb::Table::TtlTier& proto) const {
27612761 Action_);
27622762}
27632763
2764- TDuration TTtlTierSettings::GetEvictAfter () const {
2765- return EvictAfter_ ;
2764+ TDuration TTtlTierSettings::GetApplyAfter () const {
2765+ return ApplyAfter_ ;
27662766}
27672767
27682768const TTtlTierSettings::TAction& TTtlTierSettings::GetAction () const {
@@ -2896,42 +2896,55 @@ const TValueSinceUnixEpochModeSettings& TTtlSettings::GetValueSinceUnixEpoch() c
28962896 return std::get<TValueSinceUnixEpochModeSettings>(Mode_);
28972897}
28982898
2899- std::optional<TTtlSettings> TTtlSettings::DeserializeFromProto (const Ydb::Table::TtlSettings& proto) {
2900- TDuration legacyExpireAfter = TDuration::Max () ;
2899+ std::optional<TTtlSettings> TTtlSettings::FromProto (const Ydb::Table::TtlSettings& proto) {
2900+ TVector<TTtlTierSettings> tiers ;
29012901 for (const auto & tier : proto.tiers ()) {
2902- if (tier.has_delete_ ()) {
2903- legacyExpireAfter = TDuration::Seconds (tier.apply_after_seconds ());
2904- break ;
2905- }
2902+ tiers.emplace_back (tier);
29062903 }
2904+ TDuration legacyExpireAfter = GetExpireAfterFrom (tiers).value_or (TDuration::Max ());
29072905
29082906 switch (proto.mode_case ()) {
29092907 case Ydb::Table::TtlSettings::kDateTypeColumn :
29102908 return TTtlSettings (proto.date_type_column (), proto.run_interval_seconds ());
29112909 case Ydb::Table::TtlSettings::kValueSinceUnixEpoch :
29122910 return TTtlSettings (proto.value_since_unix_epoch (), proto.run_interval_seconds ());
29132911 case Ydb::Table::TtlSettings::kDateTypeColumnV1 :
2914- return TTtlSettings (TDateTypeColumnModeSettings (proto.date_type_column_v1 ().column_name (), legacyExpireAfter), proto.run_interval_seconds ());
2912+ return TTtlSettings (
2913+ TDateTypeColumnModeSettings (proto.date_type_column_v1 ().column_name (), legacyExpireAfter), tiers, proto.run_interval_seconds ());
29152914 case Ydb::Table::TtlSettings::kValueSinceUnixEpochV1 :
2916- return TTtlSettings (TValueSinceUnixEpochModeSettings (proto.value_since_unix_epoch_v1 ().column_name (), TProtoAccessor::FromProto (proto.value_since_unix_epoch_v1 ().column_unit ()), legacyExpireAfter), proto.run_interval_seconds ());
2915+ return TTtlSettings (TValueSinceUnixEpochModeSettings (proto.value_since_unix_epoch_v1 ().column_name (),
2916+ TProtoAccessor::FromProto (proto.value_since_unix_epoch_v1 ().column_unit ()), legacyExpireAfter),
2917+ tiers, proto.run_interval_seconds ());
29172918 case Ydb::Table::TtlSettings::MODE_NOT_SET:
29182919 return std::nullopt ;
29192920 break ;
29202921 }
29212922}
29222923
29232924void TTtlSettings::SerializeTo (Ydb::Table::TtlSettings& proto) const {
2924- switch (GetMode ()) {
2925- case EMode::DateTypeColumn:
2926- GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column_v1 ());
2927- break ;
2928- case EMode::ValueSinceUnixEpoch:
2929- GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch_v1 ());
2930- break ;
2931- }
2925+ if (Tiers_.size () == 1 && std::holds_alternative<TTtlDeleteAction>(Tiers_.back ().GetAction ())) {
2926+ // serialize DELETE-only TTL to legacy format for backwards-compatibility
2927+ switch (GetMode ()) {
2928+ case EMode::DateTypeColumn:
2929+ GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column ());
2930+ break ;
2931+ case EMode::ValueSinceUnixEpoch:
2932+ GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch ());
2933+ break ;
2934+ }
2935+ } else {
2936+ switch (GetMode ()) {
2937+ case EMode::DateTypeColumn:
2938+ GetDateTypeColumn ().SerializeTo (*proto.mutable_date_type_column_v1 ());
2939+ break ;
2940+ case EMode::ValueSinceUnixEpoch:
2941+ GetValueSinceUnixEpoch ().SerializeTo (*proto.mutable_value_since_unix_epoch_v1 ());
2942+ break ;
2943+ }
29322944
2933- for (const auto & tier : Tiers_) {
2934- tier.SerializeTo (*proto.add_tiers ());
2945+ for (const auto & tier : Tiers_) {
2946+ tier.SerializeTo (*proto.add_tiers ());
2947+ }
29352948 }
29362949
29372950 if (RunInterval_) {
@@ -2963,13 +2976,17 @@ std::optional<TDuration> TTtlSettings::GetExpireAfter() const {
29632976std::optional<TDuration> TTtlSettings::GetExpireAfterFrom (const TVector<TTtlTierSettings>& tiers) {
29642977 for (const auto & tier : tiers) {
29652978 if (std::holds_alternative<TTtlDeleteAction>(tier.GetAction ())) {
2966- return tier.GetEvictAfter ();
2979+ return tier.GetApplyAfter ();
29672980 }
29682981 }
29692982 return std::nullopt ;
29702983}
29712984
2972- TTtlSettings::TTtlSettings (TMode mode, ui32 runIntervalSeconds) : Mode_(std::move(mode)), RunInterval_(TDuration::Seconds(runIntervalSeconds)) {}
2985+ TTtlSettings::TTtlSettings (TMode mode, const TVector<TTtlTierSettings>& tiers, ui32 runIntervalSeconds)
2986+ : Mode_(std::move(mode))
2987+ , Tiers_(tiers)
2988+ , RunInterval_(TDuration::Seconds(runIntervalSeconds))
2989+ {}
29732990
29742991TAlterTtlSettings::EAction TAlterTtlSettings::GetAction () const {
29752992 return static_cast <EAction>(Action_.index ());
0 commit comments