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();
}
}