You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by lh...@apache.org on 2024/04/18 07:01:51 UTC
(pulsar) branch branch-3.0 updated: [fix][broker] Fix a deadlock in SystemTopicBasedTopicPoliciesService during NamespaceEventsSystemTopicFactory init (#22528)
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 404bcdf9da2 [fix][broker] Fix a deadlock in SystemTopicBasedTopicPoliciesService during NamespaceEventsSystemTopicFactory init (#22528)
404bcdf9da2 is described below
commit 404bcdf9da2f668f25b12a7a005462052d74ca3d
Author: Heesung Sohn <10...@users.noreply.github.com>
AuthorDate: Wed Apr 17 23:59:36 2024 -0700
[fix][broker] Fix a deadlock in SystemTopicBasedTopicPoliciesService during NamespaceEventsSystemTopicFactory init (#22528)
(cherry picked from commit 72474d7a2dabdf7acf0b158bd07f1bc8b69b790e)
---
.../SystemTopicBasedTopicPoliciesService.java | 49 ++++++++++++++--------
1 file changed, 32 insertions(+), 17 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 4e9e875bcf4..0449e5c885c 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
@@ -34,6 +34,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Nonnull;
+import org.apache.commons.lang3.concurrent.ConcurrentInitializer;
+import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.pulsar.broker.PulsarServerException;
import org.apache.pulsar.broker.PulsarService;
@@ -70,7 +72,19 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
private final PulsarService pulsarService;
private final HashSet localCluster;
private final String clusterName;
- private volatile NamespaceEventsSystemTopicFactory namespaceEventsSystemTopicFactory;
+
+ private final ConcurrentInitializer<NamespaceEventsSystemTopicFactory>
+ namespaceEventsSystemTopicFactoryLazyInitializer = new LazyInitializer<>() {
+ @Override
+ protected NamespaceEventsSystemTopicFactory initialize() {
+ try {
+ return new NamespaceEventsSystemTopicFactory(pulsarService.getClient());
+ } catch (PulsarServerException e) {
+ log.error("Create namespace event system topic factory error.", e);
+ throw new RuntimeException(e);
+ }
+ }
+ };
@VisibleForTesting
final Map<TopicName, TopicPolicies> policiesCache = new ConcurrentHashMap<>();
@@ -102,7 +116,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
});
})
.buildAsync((namespaceName, executor) -> {
- SystemTopicClient<PulsarEvent> systemTopicClient = namespaceEventsSystemTopicFactory
+ SystemTopicClient<PulsarEvent> systemTopicClient = getNamespaceEventsSystemTopicFactory()
.createTopicPoliciesSystemTopicClient(namespaceName);
return systemTopicClient.newWriterAsync();
});
@@ -301,7 +315,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
result.complete(null);
return result;
}
- SystemTopicClient<PulsarEvent> systemTopicClient = namespaceEventsSystemTopicFactory
+ SystemTopicClient<PulsarEvent> systemTopicClient = getNamespaceEventsSystemTopicFactory()
.createTopicPoliciesSystemTopicClient(topicName.getNamespaceObject());
systemTopicClient.newReaderAsync().thenAccept(r ->
fetchTopicPoliciesAsyncAndCloseReader(r, topicName, null, result));
@@ -373,7 +387,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
} catch (PulsarServerException ex) {
return FutureUtil.failedFuture(ex);
}
- final SystemTopicClient<PulsarEvent> systemTopicClient = namespaceEventsSystemTopicFactory
+ final SystemTopicClient<PulsarEvent> systemTopicClient = getNamespaceEventsSystemTopicFactory()
.createTopicPoliciesSystemTopicClient(namespace);
return systemTopicClient.newReaderAsync();
}
@@ -561,7 +575,7 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
log.error("Failed to create system topic factory");
break;
}
- SystemTopicClient<PulsarEvent> systemTopicClient = namespaceEventsSystemTopicFactory
+ SystemTopicClient<PulsarEvent> systemTopicClient = getNamespaceEventsSystemTopicFactory()
.createTopicPoliciesSystemTopicClient(topicName.getNamespaceObject());
systemTopicClient.newWriterAsync().thenAccept(writer
-> writer.deleteAsync(getEventKey(topicName),
@@ -595,18 +609,19 @@ public class SystemTopicBasedTopicPoliciesService implements TopicPoliciesServic
}
private void createSystemTopicFactoryIfNeeded() throws PulsarServerException {
- if (namespaceEventsSystemTopicFactory == null) {
- synchronized (this) {
- if (namespaceEventsSystemTopicFactory == null) {
- try {
- namespaceEventsSystemTopicFactory =
- new NamespaceEventsSystemTopicFactory(pulsarService.getClient());
- } catch (PulsarServerException e) {
- log.error("Create namespace event system topic factory error.", e);
- throw e;
- }
- }
- }
+ try {
+ getNamespaceEventsSystemTopicFactory();
+ } catch (Exception e) {
+ throw new PulsarServerException(e);
+ }
+ }
+
+ private NamespaceEventsSystemTopicFactory getNamespaceEventsSystemTopicFactory() {
+ try {
+ return namespaceEventsSystemTopicFactoryLazyInitializer.get();
+ } catch (Exception e) {
+ log.error("Create namespace event system topic factory error.", e);
+ throw new RuntimeException(e);
}
}