This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new ee674b01c45 fix can not update xa recovery id (#17968)
ee674b01c45 is described below

commit ee674b01c45cb05256f0c1300f7a0d8c30a302c4
Author: Haoran Meng <[email protected]>
AuthorDate: Thu May 26 16:25:32 2022 +0800

    fix can not update xa recovery id (#17968)
---
 .../apache/shardingsphere/infra/instance/InstanceContext.java  | 10 ++++++++--
 .../metadata/persist/service/ComputeNodePersistService.java    |  1 +
 .../persist/service/ComputeNodePersistServiceTest.java         |  1 +
 .../cluster/coordinator/ClusterContextManagerCoordinator.java  |  3 +--
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
index 737e436ed34..3334a29eba5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
@@ -104,12 +104,18 @@ public final class InstanceContext {
     /**
      * Update instance XA recovery id.
      *
+     * @param instanceId instance id
      * @param xaRecoveryId XA recovery id
+     * @return true if current instance updated, else false                    
      */
-    public void updateXaRecoveryId(final String xaRecoveryId) {
-        if (!Objects.equals(xaRecoveryId, instance.getXaRecoveryId())) {
+    public boolean updateXaRecoveryId(final String instanceId, final String 
xaRecoveryId) {
+        if (instanceId.equals(instance.getCurrentInstanceId()) && 
!Objects.equals(xaRecoveryId, instance.getXaRecoveryId())) {
             instance.setXaRecoveryId(xaRecoveryId);
+            computeNodeInstances.stream().filter(each -> 
each.getInstanceDefinition().getInstanceId().getId().equals(instanceId)).forEach(each
 -> each.setXaRecoveryId(xaRecoveryId));
+            return true;
         }
+        computeNodeInstances.stream().filter(each -> 
each.getInstanceDefinition().getInstanceId().getId().equals(instanceId)).forEach(each
 -> each.setXaRecoveryId(xaRecoveryId));
+        return false;
     }
     
     /**
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistService.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistService.java
index 1892b6f8601..b89839ebbbc 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistService.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistService.java
@@ -87,6 +87,7 @@ public final class ComputeNodePersistService {
      * @param xaRecoveryId xa recovery id
      */
     public void persistInstanceXaRecoveryId(final String instanceId, final 
String xaRecoveryId) {
+        loadXaRecoveryId(instanceId).ifPresent(each -> 
repository.delete(ComputeNode.getInstanceXaRecoveryIdNodePath(each, 
instanceId)));
         
repository.persist(ComputeNode.getInstanceXaRecoveryIdNodePath(xaRecoveryId, 
instanceId), "");
     }
     
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistServiceTest.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistServiceTest.java
index a2ddff8c327..eea8cff4d05 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistServiceTest.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/ComputeNodePersistServiceTest.java
@@ -67,6 +67,7 @@ public final class ComputeNodePersistServiceTest {
         InstanceDefinition instanceDefinition = new 
InstanceDefinition(InstanceType.PROXY, 3307);
         final String instanceId = instanceDefinition.getInstanceId().getId();
         new 
ComputeNodePersistService(repository).persistInstanceXaRecoveryId(instanceId, 
instanceId);
+        
verify(repository).getChildrenKeys(ComputeNode.getXaRecoveryIdNodePath());
         
verify(repository).persist(ComputeNode.getInstanceXaRecoveryIdNodePath(instanceId,
 instanceId), "");
     }
     
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
index 1bca7017642..36b29700913 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
@@ -248,8 +248,7 @@ public final class ClusterContextManagerCoordinator {
      */
     @Subscribe
     public synchronized void renew(final XaRecoveryIdEvent event) {
-        if 
(contextManager.getInstanceContext().getInstance().getInstanceDefinition().getInstanceId().getId().equals(event.getInstanceId()))
 {
-            
contextManager.getInstanceContext().updateXaRecoveryId(event.getXaRecoveryId());
+        if 
(contextManager.getInstanceContext().updateXaRecoveryId(event.getInstanceId(), 
event.getXaRecoveryId())) {
             contextManager.renewAllTransactionContext();
         }
     }

Reply via email to