Skip to content

Commit 660a4f4

Browse files
authored
Fix #13027, persistent service instance changed without metadata event. (#13169)
1 parent c2f1579 commit 660a4f4

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

naming/src/main/java/com/alibaba/nacos/naming/core/v2/service/impl/PersistentClientOperationServiceImpl.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.alibaba.nacos.naming.core.v2.client.impl.IpPortBasedClient;
4646
import com.alibaba.nacos.naming.core.v2.client.manager.impl.PersistentIpPortClientManager;
4747
import com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent;
48+
import com.alibaba.nacos.naming.core.v2.event.metadata.MetadataEvent;
4849
import com.alibaba.nacos.naming.core.v2.pojo.InstancePublishInfo;
4950
import com.alibaba.nacos.naming.core.v2.pojo.Service;
5051
import com.alibaba.nacos.naming.core.v2.service.ClientOperationService;
@@ -223,8 +224,8 @@ public Response onApply(WriteRequest request) {
223224
}
224225

225226
private boolean instanceAndServiceExist(InstanceStoreRequest instanceRequest) {
226-
return clientManager.contains(instanceRequest.getClientId()) && clientManager
227-
.getClient(instanceRequest.getClientId()).getAllPublishedService().contains(instanceRequest.service);
227+
return clientManager.contains(instanceRequest.getClientId()) && clientManager.getClient(
228+
instanceRequest.getClientId()).getAllPublishedService().contains(instanceRequest.service);
228229
}
229230

230231
private void onInstanceRegister(Service service, Instance instance, String clientId) {
@@ -237,6 +238,8 @@ private void onInstanceRegister(Service service, Instance instance, String clien
237238
client.addServiceInstance(singleton, instancePublishInfo);
238239
client.setLastUpdatedTime();
239240
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));
241+
NotifyCenter.publishEvent(
242+
new MetadataEvent.InstanceMetadataEvent(singleton, instancePublishInfo.getMetadataId(), false));
240243
}
241244

242245
private void onInstanceDeregister(Service service, String clientId) {
@@ -246,12 +249,16 @@ private void onInstanceDeregister(Service service, String clientId) {
246249
Loggers.RAFT.warn("client not exist onInstanceDeregister, clientId : {} ", clientId);
247250
return;
248251
}
249-
client.removeServiceInstance(singleton);
252+
final InstancePublishInfo removedInstance = client.removeServiceInstance(singleton);
250253
client.setLastUpdatedTime();
251254
if (client.getAllPublishedService().isEmpty()) {
252255
clientManager.clientDisconnected(clientId);
253256
}
254257
NotifyCenter.publishEvent(new ClientOperationEvent.ClientDeregisterServiceEvent(singleton, clientId));
258+
if (null != removedInstance) {
259+
NotifyCenter.publishEvent(
260+
new MetadataEvent.InstanceMetadataEvent(singleton, removedInstance.getMetadataId(), true));
261+
}
255262
}
256263

257264
@Override
@@ -333,8 +340,8 @@ protected boolean readSnapshot(Reader reader) throws Exception {
333340
final Checksum checksum = new CRC64();
334341
byte[] snapshotBytes = DiskUtils.decompress(sourceFile, checksum);
335342
LocalFileMeta fileMeta = reader.getFileMeta(SNAPSHOT_ARCHIVE);
336-
if (fileMeta.getFileMeta().containsKey(CHECK_SUM_KEY) && !Objects
337-
.equals(Long.toHexString(checksum.getValue()), fileMeta.get(CHECK_SUM_KEY))) {
343+
if (fileMeta.getFileMeta().containsKey(CHECK_SUM_KEY) && !Objects.equals(
344+
Long.toHexString(checksum.getValue()), fileMeta.get(CHECK_SUM_KEY))) {
338345
throw new IllegalArgumentException("Snapshot checksum failed");
339346
}
340347
loadSnapshot(snapshotBytes);
@@ -368,7 +375,7 @@ protected void loadSnapshot(byte[] snapshotBytes) {
368375
// remove dead client
369376
removeDeadClient(newData.keySet(), oldClientIds);
370377
}
371-
378+
372379
/**
373380
* update instance info for client.
374381
*
@@ -399,13 +406,15 @@ private void updateSyncDataToClient(Map.Entry<String, ClientSyncData> entry, IpP
399406
InstancePublishInfo oldInstanceInfo = client.getInstancePublishInfo(singleton);
400407
if (oldInstanceInfo != null && !newInstanceInfo.equals(oldInstanceInfo)) {
401408
client.putServiceInstance(singleton, newInstanceInfo);
402-
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, client.getClientId()));
409+
NotifyCenter.publishEvent(
410+
new ClientOperationEvent.ClientRegisterServiceEvent(singleton, client.getClientId()));
403411
Loggers.RAFT.info("[SNAPSHOT-DATA-UPDATE] service={}, instance={}", service, newInstanceInfo);
404412
}
405413
} else {
406414
// add
407415
client.putServiceInstance(singleton, newInstanceInfo);
408-
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, client.getClientId()));
416+
NotifyCenter.publishEvent(
417+
new ClientOperationEvent.ClientRegisterServiceEvent(singleton, client.getClientId()));
409418
Loggers.RAFT.info("[SNAPSHOT-DATA-ADD] service={}, instance={}", service, newInstanceInfo);
410419
}
411420
}
@@ -415,12 +424,13 @@ private void updateSyncDataToClient(Map.Entry<String, ClientSyncData> entry, IpP
415424
InstancePublishInfo oldInfo = client.getInstancePublishInfo(service);
416425
// metric ip count decrement
417426
client.removeServiceInstance(service);
418-
NotifyCenter.publishEvent(new ClientOperationEvent.ClientDeregisterServiceEvent(service, client.getClientId()));
427+
NotifyCenter.publishEvent(
428+
new ClientOperationEvent.ClientDeregisterServiceEvent(service, client.getClientId()));
419429
Loggers.RAFT.info("[SNAPSHOT-DATA-REMOVE] service={}, instance={}", service, oldInfo);
420430
}
421431
}
422432
}
423-
433+
424434
/**
425435
* remove certain client which has dead.
426436
*
@@ -444,7 +454,9 @@ private void removeDeadClient(Collection<String> aliveClientIds, Collection<Stri
444454
InstancePublishInfo oldInfo = client.getInstancePublishInfo(service);
445455
// metric ip count decrement
446456
client.removeServiceInstance(service);
447-
NotifyCenter.publishEvent(new ClientOperationEvent.ClientDeregisterServiceEvent(singleton, client.getClientId()));
457+
NotifyCenter.publishEvent(
458+
new ClientOperationEvent.ClientDeregisterServiceEvent(singleton,
459+
client.getClientId()));
448460
Loggers.RAFT.info("[SNAPSHOT-DATA-REMOVE] service={}, instance={}", singleton, oldInfo);
449461
}
450462
}

0 commit comments

Comments
 (0)