Hi Rajan, Even we don't persistent NonPersistentSubscription's state, but it has a `isDurable` field ``` public NonPersistentSubscription(NonPersistentTopic topic, String subscriptionName, boolean isDurable, Map<String, String> properties) { this.topic = topic; this.topicName = topic.getName(); this.subName = subscriptionName; this.fullName = MoreObjects.toStringHelper(this).add("topic", topicName).add("name", subName).toString(); IS_FENCED_UPDATER.set(this, FALSE); this.lastActive = System.currentTimeMillis(); this.isDurable = isDurable; this.subscriptionProperties = properties != null ? Collections.unmodifiableMap(properties) : Collections.emptyMap(); } ``` When users create a `Consumer`, the `durable` will set to be `true`.
And in `removeConsumer` method of `NonPersistentSubscription`, after consumers disconnected, we can remove the `durable` subscription automatically. ``` public synchronized void removeConsumer(Consumer consumer, boolean isResetCursor) throws BrokerServiceException { updateLastActive(); if (dispatcher != null) { dispatcher.removeConsumer(consumer); } // preserve accumulative stats form removed consumer ConsumerStatsImpl stats = consumer.getStats(); bytesOutFromRemovedConsumers.add(stats.bytesOutCounter); msgOutFromRemovedConsumer.add(stats.msgOutCounter); if (!isDurable) { topic.unsubscribe(subName); } // invalid consumer remove will throw an exception // decrement usage is triggered only for valid consumer close topic.decrementUsageCount(); if (log.isDebugEnabled()) { log.debug("[{}] [{}] [{}] Removed consumer -- count: {}", topic.getName(), subName, consumer.consumerName(), topic.currentUsageCount()); } } ``` The PIP is for the purpose of deprecate `durable` subscriptions on NonPersistentTopic for the following reasons: 1. We don't persistent NonPersistentSubscription's state, it's totally in-memory state, keep the `isDurable` field is meaningless and may takes misunderstanding 2. The expired subscriptions auto clean like wrote in the PIP. Thanks, Tao Jiuming Rajan Dhabalia <rdhaba...@apache.org> 于2023年2月23日周四 12:33写道: > > But for NonPersistentTopic, creating a Durable subscription is > meaningless, NonPersistentSubscription doesn't have a ManagedCursor to > persistent its data. After its consumer disconnected, the subscription > couldn't be removed automatically if we didn't set the value of > subscriptionExpirationTimeMinutes greater than 0. > This is not correct. Non-Persistent topics don't create durable > subscriptions but It creates NonPersistent Subscription without storing its > state. > > > if we set the value of subscriptionExpirationTimeMinutes greater than 0, > it may lead to data loss(The durable subscriptions of PersistentTopic also > can be removed). > Non-Persistent topics don't provide data persistent or dispatch guarantee > and it's by design so, let's not try to change semantics of non-persistent > topic and there could be data loss in non-persistent topic. > > > And the Non-durable subscriptions will be removed automatically after all > the consumers disconnected, it's the existing logic. > Why can't we do this in the existing NonPersistent Subscription? I really > don't understand the purpose of this PIP? > > Thanks, > Rajan > > On Sun, Feb 12, 2023 at 10:56 PM Jiuming Tao <jm...@streamnative.io.invalid > > > wrote: > > > Hi all, > > > > I would like to start a VOTE on `PIP-245: Make subscriptions of > > non-persistent topic non-durable`. > > > > Motivation: > > > > There are two types of subscriptions for a topic: Durable and > Non-durable. > > > > We create a Consumer with a Durable subscription and a Reader with a > > Non-durable subscription. > > > > But for NonPersistentTopic, creating a Durable subscription is > > meaningless, NonPersistentSubscription doesn't have a ManagedCursor to > > persistent its data. After its consumer disconnected, the subscription > > couldn't be removed automatically if we didn't set the value of > > subscriptionExpirationTimeMinutes greater than 0. > > > > For subscriptionExpirationTimeMinutes, it controls the subscription > > expiration of NonPersistentTopic and PersistentTopic, if we set the value > > of subscriptionExpirationTimeMinutes greater than 0, it may lead to data > > loss(The durable subscriptions of PersistentTopic also can be removed). > > > > And the Non-durable subscriptions will be removed automatically after all > > the consumers disconnected, it's the existing logic. > > > > For the purpose of removing the subscriptions which have no active > > consumers of NonPersistentTopic and the above reasons, we can make all > the > > subscriptions of a NonPersistentTopic Non-durable. > > > > > > > > For more details, you can read: > > https://github.com/apache/pulsar/issues/19448 < > > https://github.com/apache/pulsar/issues/19448> > > > > And the discuss thread is available at: > > https://lists.apache.org/thread/2ltmyglnb25jy8nk58twkwbglws43bst < > > https://lists.apache.org/thread/2ltmyglnb25jy8nk58twkwbglws43bst> > > > > Thanks, > > Tao Jiuming >