You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2021/06/27 12:45:51 UTC
[pulsar] branch branch-2.7 updated: Fix race condition of the
SystemTopicBasedTopicPoliciesService (#11097)
This is an automated email from the ASF dual-hosted git repository.
penghui pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.7 by this push:
new 6cecb5a Fix race condition of the SystemTopicBasedTopicPoliciesService (#11097)
6cecb5a is described below
commit 6cecb5a15e1223c6e93286514564d677b9d07c7c
Author: lipenghui <pe...@apache.org>
AuthorDate: Sun Jun 27 20:30:15 2021 +0800
Fix race condition of the SystemTopicBasedTopicPoliciesService (#11097)
Currently, we are triggering the reader to read more messages not waiting for the init policies cache to complete,
This might lead to the init process got hasMessages=true but not able to read the message since the message has been
consumed by the read more entries process will lead to the `topic policy cache not init` exception.
Here are the details of the race condition:
https://github.com/apache/pulsar/blob/0b67438d23bbbc46b500e896a18aad715a514fd9/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java#L190
https://github.com/apache/pulsar/blob/0b67438d23bbbc46b500e896a18aad715a514fd9/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java#L248
https://github.com/apache/pulsar/blob/0b67438d23bbbc46b500e896a18aad715a514fd9/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java#L275
(cherry picked from commit 81063c04870ba7fa26222e57e4d4e94145e0a1e0)
---
.../broker/service/SystemTopicBasedTopicPoliciesService.java | 6 ++++--
.../java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java | 9 +++++----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java
index abd60cf..fb72f3b 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/SystemTopicBasedTopicPoliciesService.java
@@ -187,7 +187,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
result.completeExceptionally(ex);
} else {
initPolicesCache(reader, result);
- readMorePolicies(reader);
+ result.thenRun(() -> readMorePolicies(reader));
}
});
}
@@ -251,6 +251,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
readerCaches.remove(reader.getSystemTopic().getTopicName().getNamespaceObject());
}
refreshTopicPoliciesCache(msg);
+ notifyListener(msg);
if (log.isDebugEnabled()) {
log.debug("[{}] Loop next event reading for system topic.",
reader.getSystemTopic().getTopicName().getNamespaceObject());
@@ -261,8 +262,9 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
if (log.isDebugEnabled()) {
log.debug("[{}] Reach the end of the system topic.", reader.getSystemTopic().getTopicName());
}
+ policyCacheInitMap.computeIfPresent(
+ reader.getSystemTopic().getTopicName().getNamespaceObject(), (k, v) -> true);
future.complete(null);
- policyCacheInitMap.computeIfPresent(reader.getSystemTopic().getTopicName().getNamespaceObject(), (k, v) -> true);
}
});
}
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java
index b9b7b69..5f98795 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TopicPoliciesTest.java
@@ -627,8 +627,9 @@ public class TopicPoliciesTest extends MockedPulsarServiceBaseTest {
new InactiveTopicPolicies(InactiveTopicDeleteMode.delete_when_no_subscriptions,200,false);
admin.topics().setInactiveTopicPolicies(topic, inactiveTopicPolicies);
- Awaitility.await().atMost(3, TimeUnit.SECONDS)
- .untilAsserted(() -> Assert.assertNotNull(admin.topics().getInactiveTopicPolicies(topic)));
+ InactiveTopicPolicies finalInactiveTopicPolicies = inactiveTopicPolicies;
+ Awaitility.await()
+ .untilAsserted(() -> Assert.assertEquals(admin.topics().getInactiveTopicPolicies(topic), finalInactiveTopicPolicies));
// restart broker, policy should still take effect
restartBroker();
@@ -636,8 +637,8 @@ public class TopicPoliciesTest extends MockedPulsarServiceBaseTest {
// Trigger the cache init.
Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
- InactiveTopicPolicies finalInactiveTopicPolicies = inactiveTopicPolicies;
- Awaitility.await().atMost(5, TimeUnit.SECONDS)
+
+ Awaitility.await()
.untilAsserted(() -> {
PersistentTopic persistentTopic = (PersistentTopic) pulsar.getBrokerService().getTopicIfExists(topic).get().get();
Assert.assertEquals(persistentTopic.getInactiveTopicPolicies(), finalInactiveTopicPolicies);