You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2022/03/31 03:38:52 UTC

[GitHub] [pulsar] mattisonchao opened a new pull request #14940: [fix][transaction] Remove single thread pool and fix the concurrent problem to avoid performance issues

mattisonchao opened a new pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940


   ### Motivation
   
   According to #13969, We can know that adding a single-threaded pool is because deques in a concurrent environment will cause problems with requesting additions and requesting clears.
   
   We can do some changes and remove the single-threaded pool to improve performance.
   
   #### e.g:
   Current we have threads A, B, C and D.
   
   **Backgound**
   Threads A and B request ``handleTcClientConnect`` concurrently, then A acquires the semaphore from ``openTransactionMetadataStore``, and B adds the failure to acquire the semaphore to the deque. 
   
   **Success openTransactionMetadataStore condition**
   When A's call to ``handleTcClientConnect`` succeeds, they will first release the semaphore and then complete all futures in the deque. Because if we release the semaphore after finishing the deque future, which will cause thread B to reconnect and add to the deque before thread A releases the semaphore and never completes Thread B.
   
   **Exceptionally openTransactionMetadataStore condition**
   When A fails to call ``handleTcClientConnect``, they will release the semaphore first and get all futures(it's a threshold) that need to be complete exceptionally after releasing the semaphore to avoid an infinite loop caused by client reconnection, because If we release the semaphore after all deque futures are complete exceptionally, the client will immediately reconnect and add to the deque (because thread A does not release the semaphore) which may cause an infinite loop (which means something like, because We have an end time that will break the loop)
   
   #### Other problems rely on the current implementation
   
   - When the future of the semaphore acquisition failure exceeds the maximum timeout. We currently clear the deque directly, which is an issue where the CompletableFuture may not complete.
   
   - When ``TransactionMetadataStoreService#handleTcClientConnect`` invoke method as bellow we omit the exception.
   
   ```java
   pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
          .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString()).thenRun(() -> {
              //.... omit some code
         })
   ```
   
   - Avoid frequent context switching using thread pools.
   
   - When checking the TC status for the second time, we just finish the future and don't return. (the code is below)
   
   ```java
   // TransactionMetadataStoreService.java 181-185
   // omit some code...
    if (stores.get(tcId) != null) {
         completableFuture.complete(null);
    }
   
   openTransactionMetadataStore(tcId)
   // omit some code...
   ```
   
   ### Modifications
   
   - Remove the single thread pool to avoid poor performance.
   - Fix concurrent deque issue.
   - Use a bounded queue instead of the deque.
   - Modified to chained calls, all exceptions will not be ignored.
   - Refactor some code.
   
   ### Verifying this change
   
   - [x] Make sure that the change passes the CI checks.
   
   ### Documentation
   
   - [x] `no-need-doc` 
   
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838337547



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       Another thing:
   It looks like we don't need to try to acquire the semaphore and queue other connections once we use a single-threaded pool.
   I'm not sure about that. still wondering...




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao closed pull request #14940: [fix][transaction] Remove single thread pool and fix the concurrent problem to avoid performance issues

Posted by GitBox <gi...@apache.org>.
mattisonchao closed pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on pull request #14940: [fix][Transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#issuecomment-1082716449


   @codelipenghui @eolivelli @congbobo184 @Technoboy- 
   PTAL :)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] Technoboy- closed pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
Technoboy- closed pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838390286



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       @eolivelli 
   I think I find the root cause by #13969
   I will change the code and try to remove the thread pool ( that will seriously reduce efficiency ) 
   




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838300448



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       Hi @eolivelli 
   I changed the method to run in a single thread. And remove second ``stores.get(tcId) != null`` check, Could you review it again?
   
   After deep thinking, I think creating an executor that chooses thread by TC id is better than running in a single thread. but I think I need to do it at another PR to avoid making this PR more complex.
   
   Let me know what you think! thanks~




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838300448



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       Hi @eolivelli 
   I changed the method to run in a single thread. Could you review it again?
   
   After deep thinking, I think creating an executor that chooses thread by TC id is better than running in a single thread. but I think I need to do it at another PR to avoid making this PR more complex.
   
   Let me know what you think! thanks~




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] eolivelli commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
eolivelli commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838241924



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       Before this change we were accessing this variable inside the pinner executor.
   I am not sure this change is correct 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao closed pull request #14940: [fix][transaction] Remove single thread pool and fix the concurrent problem to avoid performance issues

Posted by GitBox <gi...@apache.org>.
mattisonchao closed pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao closed pull request #14940: [fix][transaction] Remove single thread pool and fix the concurrent problem to avoid performance issues

Posted by GitBox <gi...@apache.org>.
mattisonchao closed pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on a change in pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on a change in pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#discussion_r838265065



##########
File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/TransactionMetadataStoreService.java
##########
@@ -163,86 +165,63 @@ public boolean test(NamespaceBundle namespaceBundle) {
     }
 
     public CompletableFuture<Void> handleTcClientConnect(TransactionCoordinatorID tcId) {
-        CompletableFuture<Void> completableFuture = new CompletableFuture<>();
-        internalPinnedExecutor.execute(() -> {
-            if (stores.get(tcId) != null) {
-                completableFuture.complete(null);
-            } else {
-                pulsarService.getBrokerService().checkTopicNsOwnership(TopicName
-                        .TRANSACTION_COORDINATOR_ASSIGN.getPartition((int) tcId.getId()).toString())
-                        .thenRun(() -> internalPinnedExecutor.execute(() -> {
-                    final Semaphore tcLoadSemaphore = this.tcLoadSemaphores
-                            .computeIfAbsent(tcId.getId(), (id) -> new Semaphore(1));
-                    Deque<CompletableFuture<Void>> deque = pendingConnectRequests
-                            .computeIfAbsent(tcId.getId(), (id) -> new ConcurrentLinkedDeque<>());
-                    if (tcLoadSemaphore.tryAcquire()) {
-                        // when tcLoadSemaphore.release(), this command will acquire semaphore,
-                        // so we should jude the store exist again.
-                        if (stores.get(tcId) != null) {
-                            completableFuture.complete(null);
-                        }
-
-                        openTransactionMetadataStore(tcId).thenAccept((store) -> internalPinnedExecutor.execute(() -> {
-                            stores.put(tcId, store);
-                            LOG.info("Added new transaction meta store {}", tcId);
-                            long endTime = System.currentTimeMillis() + HANDLE_PENDING_CONNECT_TIME_OUT;
-                            while (true) {
-                                // prevent thread in a busy loop.
-                                if (System.currentTimeMillis() < endTime) {
-                                    CompletableFuture<Void> future = deque.poll();
-                                    if (future != null) {
-                                        // complete queue request future
-                                        future.complete(null);
-                                    } else {
-                                        break;
-                                    }
-                                } else {
-                                    deque.clear();
-                                    break;
+        if (stores.get(tcId) != null) {

Review comment:
       Well, The second ``stores.get(tcId) != null`` check will ensure thread-safe.
   but looks make the first check move to ``pinner executor`` will be better.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao removed a comment on pull request #14940: [fix][transaction] Fix potentially unfinished CompletableFuture.

Posted by GitBox <gi...@apache.org>.
mattisonchao removed a comment on pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#issuecomment-1082716449


   @codelipenghui @eolivelli @congbobo184 @Technoboy- 
   PTAL :)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [pulsar] mattisonchao commented on pull request #14940: [fix][transaction] Remove single thread pool and fix the concurrent problem to avoid performance issues

Posted by GitBox <gi...@apache.org>.
mattisonchao commented on pull request #14940:
URL: https://github.com/apache/pulsar/pull/14940#issuecomment-1083998210


   @eolivelli  I updated this PR, could you please review it again?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org