@@ -386,8 +386,8 @@ void TPartitionFamily::InactivatePartition(ui32 partitionId) {
386386}
387387
388388 void TPartitionFamily::ChangePartitionCounters (ssize_t active, ssize_t inactive) {
389- Y_VERIFY_DEBUG ((ssize_t )ActivePartitionCount + active >= 0 );
390- Y_VERIFY_DEBUG ((ssize_t )InactivePartitionCount + inactive >= 0 );
389+ Y_VERIFY_DEBUG ((ssize_t )ActivePartitionCount + active >= 0 , " ActivePartitionCount: %lu, active: %ld " , ActivePartitionCount, active );
390+ Y_VERIFY_DEBUG ((ssize_t )InactivePartitionCount + inactive >= 0 , " InactivePartitionCount: %lu, inactive: %ld " , InactivePartitionCount, inactive );
391391
392392 ActivePartitionCount += active;
393393 InactivePartitionCount += inactive;
@@ -1155,11 +1155,12 @@ void TConsumer::FinishReading(TEvPersQueue::TEvReadingPartitionFinishedRequest::
11551155
11561156 auto & partition = Partitions[partitionId];
11571157
1158- if (partition.SetFinishedState (r.GetScaleAwareSDK (), r.GetStartedReadingFromEndOffset ())) {
1158+ const bool wasInactive = partition.IsInactive ();
1159+ if (partition.SetFinishedState (r.GetScaleAwareSDK (), r.GetStartedReadingFromEndOffset ()) || wasInactive) {
11591160 PQ_LOG_D (" Reading of the partition " << partitionId << " was finished by " << r.GetConsumer ()
11601161 << " , firstMessage=" << r.GetStartedReadingFromEndOffset () << " , " << GetSdkDebugString0 (r.GetScaleAwareSDK ()));
11611162
1162- if (ProccessReadingFinished (partitionId, false , ctx)) {
1163+ if (ProccessReadingFinished (partitionId, wasInactive , ctx)) {
11631164 ScheduleBalance (ctx);
11641165 }
11651166 } else if (!partition.IsInactive ()) {
@@ -1835,6 +1836,62 @@ void TBalancer::ProcessPendingStats(const TActorContext& ctx) {
18351836 PendingUpdates.clear ();
18361837}
18371838
1839+ <<<<<<< HEAD
1840+ =======
1841+ void TBalancer::Handle (TEvPersQueue::TEvBalancingSubscribe::TPtr& ev, const TActorContext& ctx) {
1842+ auto & record = ev->Get ()->Record ;
1843+ PQ_LOG_D (" Handle TEvPersQueue::TEvBalancingSubscribe " << record.ShortDebugString ());
1844+
1845+ auto sender = ActorIdFromProto (record.GetSourceActor ());
1846+ auto status = Consumers.contains (record.GetConsumer ()) ?
1847+ NKikimrPQ::TEvBalancingSubscribeNotify::BALANCING : NKikimrPQ::TEvBalancingSubscribeNotify::FREE;
1848+ Notify (sender, record.GetConsumer (), status, ctx);
1849+
1850+ Subscriptions[ev->Sender ].emplace_back (std::move (sender), std::move (*record.MutableConsumer ()));
1851+ }
1852+
1853+ void TBalancer::Handle (TEvPersQueue::TEvBalancingUnsubscribe::TPtr& ev, const TActorContext&) {
1854+ auto & record = ev->Get ()->Record ;
1855+ PQ_LOG_D (" Handle TEvPersQueue::TEvBalancingUnsubscribe " << record.ShortDebugString ());
1856+
1857+ auto sender = ActorIdFromProto (record.GetSourceActor ());
1858+ auto & consumer = record.GetConsumer ();
1859+
1860+ auto it = Subscriptions.find (ev->Sender );
1861+ if (it == Subscriptions.end ()) {
1862+ return ;
1863+ }
1864+
1865+ std::vector<TSubscription>& subscriptions = it->second ;
1866+ std::vector<TSubscription> actualSubscriptions;
1867+ actualSubscriptions.resize (subscriptions.size ());
1868+
1869+ for (auto & [existsSender, existsConsumer] : subscriptions) {
1870+ if (sender == existsSender && consumer == existsConsumer) {
1871+ continue ;
1872+ }
1873+
1874+ actualSubscriptions.emplace_back (std::move (existsSender), std::move (existsConsumer));
1875+ }
1876+
1877+ subscriptions = std::move (actualSubscriptions);
1878+ }
1879+
1880+ void TBalancer::Notify (const TString& consumer, NKikimrPQ::TEvBalancingSubscribeNotify::EStatus status, const TActorContext& ctx) {
1881+ for (auto & [_, subscriptions] : Subscriptions) {
1882+ for (auto & subscription : subscriptions) {
1883+ if (subscription.Consumer == consumer) {
1884+ Notify (subscription.Sender , consumer, status, ctx);
1885+ }
1886+ }
1887+ }
1888+ }
1889+
1890+ void TBalancer::Notify (const TActorId subscriber, const TString& consumer, NKikimrPQ::TEvBalancingSubscribeNotify::EStatus status, const TActorContext& ctx) {
1891+ ctx.Send (subscriber, new TEvPersQueue::TEvBalancingSubscribeNotify (TabletGeneration (), ++NotifyCookie, TopicPath (), consumer, status));
1892+ }
1893+
1894+ >>>>>>> 45f5616be25 (EXT-1793 Fix when reading from the end of uncommitted partition (#30854 ))
18381895TString TBalancer::LogPrefix() const {
18391896 return TStringBuilder () << " [" << TopicActor.TabletID () << " ][" << Topic () << " ] " ;
18401897}
0 commit comments