From 75964e0c3413d0337ea55692af708a77d9d3802e Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 3 Apr 2019 22:20:09 +0800 Subject: [PATCH 001/161] fix temp push --- .../data/bootstrap/DataServerConfig.java | 20 +++++++ .../server/data/change/DataChangeHandler.java | 16 +++++- .../change/event/DataChangeEventQueue.java | 27 ++++++++- .../src/main/resources/application.properties | 1 + .../task/DataChangeFetchCloudTask.java | 5 +- .../session/scheduler/task/DataPushTask.java | 55 ++++--------------- .../registry/test/BaseIntegrationTest.java | 2 + .../test/pubsub/TempPublisherTest.java | 45 +++++++++++++++ 8 files changed, 119 insertions(+), 52 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 4d801b711..58eeb29cd 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -55,6 +55,8 @@ public class DataServerConfig { private int clientOffDelayMs; + private int notifyTempDataIntervalMs; + private int rpcTimeout; private CommonConfig commonConfig; @@ -233,6 +235,24 @@ public void setNotifyIntervalMs(int notifyIntervalMs) { this.notifyIntervalMs = notifyIntervalMs; } + /** + * Getter method for property notifyTempDataIntervalMs. + * + * @return property value of notifyTempDataIntervalMs + */ + public int getNotifyTempDataIntervalMs() { + return notifyTempDataIntervalMs; + } + + /** + * Setter method for property notifyTempDataIntervalMs. + * + * @param notifyTempDataIntervalMs value to be assigned to property notifyTempDataIntervalMs + */ + public void setNotifyTempDataIntervalMs(int notifyTempDataIntervalMs) { + this.notifyTempDataIntervalMs = notifyTempDataIntervalMs; + } + /** * Getter method for property rpcTimeout. * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index 6bf66a946..a45c718ba 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.data.change; import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; @@ -31,6 +32,7 @@ import javax.annotation.Resource; import java.util.List; +import java.util.Map; import java.util.concurrent.Executor; /** @@ -178,11 +180,19 @@ private void notifyTempPub(Datum datum, DataSourceTypeEnum sourceType, String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); long version = datum.getVersion(); + + Datum existDatum = DatumCache.get(dataCenter, dataInfoId); + if (existDatum != null) { + Map cachePubMap = existDatum.getPubMap(); + if (cachePubMap != null && !cachePubMap.isEmpty()) { + datum.getPubMap().putAll(cachePubMap); + } + } + LOGGER .info( - "[DataChangeHandler][{}] datum handle temp pub,datum={},dataCenter={}, dataInfoId={}, version={}, sourceType={}, changeType={},isContainsUnPub={}", - name, datum.hashCode(), dataCenter, dataInfoId, version, sourceType, - changeType, datum.isContainsUnPub()); + "[DataChangeHandler][{}] datum handle temp pub,datum={},dataCenter={}, dataInfoId={}, version={}, sourceType={}, changeType={}", + name, datum.hashCode(), dataCenter, dataInfoId, version, sourceType, changeType); for (IDataChangeNotifier notifier : dataChangeNotifiers) { if (notifier.getSuitableSource().contains(sourceType)) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index 45e5cffab..ae996d04f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.data.change.event; +import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -72,6 +73,8 @@ public class DataChangeEventQueue { private final int notifyIntervalMs; + private final int notifyTempDataIntervalMs; + private final ReentrantLock lock = new ReentrantLock(); private DataServerConfig dataServerConfig; @@ -92,6 +95,7 @@ public DataChangeEventQueue(int idx, DataServerConfig dataServerConfig) { eventQueue = new LinkedBlockingDeque<>(queueSize); } this.notifyIntervalMs = dataServerConfig.getNotifyIntervalMs(); + this.notifyTempDataIntervalMs = dataServerConfig.getNotifyTempDataIntervalMs(); } /** @@ -121,7 +125,9 @@ public ChangeData take() throws InterruptedException { lock.lock(); try { Datum datum = changeData.getDatum(); - CHANGE_DATA_MAP.get(datum.getDataCenter()).remove(datum.getDataInfoId()); + if (changeData.getSourceType() != DataSourceTypeEnum.PUB_TEMP) { + CHANGE_DATA_MAP.get(datum.getDataCenter()).remove(datum.getDataInfoId()); + } return changeData; } finally { lock.unlock(); @@ -174,8 +180,15 @@ public void start() { DataChangeScopeEnum scope = event.getScope(); if (scope == DataChangeScopeEnum.DATUM) { DataChangeEvent dataChangeEvent = (DataChangeEvent) event; - handleDatum(dataChangeEvent.getChangeType(), - dataChangeEvent.getSourceType(), dataChangeEvent.getDatum()); + //Temporary push data will be notify as soon as,and not merge to normal pub data; + if (dataChangeEvent.getSourceType() == DataSourceTypeEnum.PUB_TEMP){ + addTempChangeData(dataChangeEvent.getDatum(),dataChangeEvent.getChangeType(), + dataChangeEvent.getSourceType()); + } + else { + handleDatum(dataChangeEvent.getChangeType(), + dataChangeEvent.getSourceType(), dataChangeEvent.getDatum()); + } } else if (scope == DataChangeScopeEnum.CLIENT) { handleHost((ClientChangeEvent) event); } @@ -255,4 +268,12 @@ private void handleDatum(DataChangeTypeEnum changeType, DataSourceTypeEnum sourc lock.unlock(); } } + + private void addTempChangeData(Datum targetDatum, DataChangeTypeEnum changeType, + DataSourceTypeEnum sourceType) { + + ChangeData tempChangeData = new ChangeData(targetDatum, this.notifyTempDataIntervalMs, + sourceType, changeType); + CHANGE_QUEUE.put(tempChangeData); + } } \ No newline at end of file diff --git a/server/server/data/src/main/resources/application.properties b/server/server/data/src/main/resources/application.properties index 77c9484d3..6a28ef486 100644 --- a/server/server/data/src/main/resources/application.properties +++ b/server/server/data/src/main/resources/application.properties @@ -10,6 +10,7 @@ data.server.httpServerPort=9622 data.server.queueCount=4 data.server.queueSize=10240 data.server.notifyIntervalMs=500 +data.server.notifyTempDataIntervalMs=10 data.server.rpcTimeout=3000 data.server.metaServerPort=9611 data.server.storeNodes=3 diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index d6a423adc..a149fe500 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -239,6 +239,7 @@ private void fireReceiveDataPushTask(Map datums, Map subscriberMap, PushTaskClosure pushTaskClosure) { Collection subscribers = new ArrayList<>(subscriberMap.values()); + LOGGER.info("Datums push={}", datums); ReceivedData receivedData = ReceivedDataConverter.getReceivedDataMulti(datums, scopeEnum, subscriberRegisterIdList, subscriber); @@ -248,8 +249,8 @@ private void fireReceiveDataPushTask(Map datums, TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - taskLogger.info("send {} taskURL:{},taskScope:{}", taskEvent.getTaskType(), - subscriber.getSourceAddress(), scopeEnum); + taskLogger.info("send {} taskURL:{},taskScope:{},version:{}", taskEvent.getTaskType(), + subscriber.getSourceAddress(), scopeEnum, receivedData.getVersion()); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java index e372dc21c..52eb5bcfc 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java @@ -89,8 +89,6 @@ public void execute() { String dataInfoId = datum.getDataInfoId(); - PushTaskClosure pushTaskClosure = getTaskClosure(); - for (ScopeEnum scopeEnum : ScopeEnum.values()) { Map> map = getCache(scopeEnum, dataInfoId); @@ -113,11 +111,11 @@ public void execute() { if (ifLocalDataCenter) { if (isOldVersion) { fireUserDataElementPushTask(entry.getKey(), datum, - subscribersSend, pushTaskClosure); + subscribersSend); } else { fireReceivedDataMultiPushTask(datum, subscriberRegisterIdList, ScopeEnum.zone, - subscriber, pushTaskClosure, subscriberMap); + subscriber, subscriberMap); } } break; @@ -125,17 +123,17 @@ public void execute() { if (ifLocalDataCenter) { if (isOldVersion) { fireUserDataElementMultiPushTask(entry.getKey(), datum, - subscribersSend, pushTaskClosure); + subscribersSend); } else { fireReceivedDataMultiPushTask(datum, subscriberRegisterIdList, scopeEnum, subscriber, - pushTaskClosure, subscriberMap); + subscriberMap); } } break; case global: fireReceivedDataMultiPushTask(datum, subscriberRegisterIdList, - scopeEnum, subscriber, pushTaskClosure, subscriberMap); + scopeEnum, subscriber, subscriberMap); break; default: LOGGER.warn("unknown scope, {}", subscriber); @@ -144,38 +142,11 @@ public void execute() { } } } - pushTaskClosure.start(); } } - public PushTaskClosure getTaskClosure() { - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskClosureExecutor()); - pushTaskClosure.setTaskClosure((status, task) -> { - if (status == ProcessingResult.Success) { - Datum datum = dataPushRequest.getDatum(); - String dataCenter = datum.getDataCenter(); - String dataInfoId = datum.getDataInfoId(); - Long version = datum.getVersion(); - - if (sessionServerConfig.isStopPushSwitch()) { - LOGGER.info("Stop Push switch on,dataCenter {} dataInfoId {} version {} can not be update!", - dataCenter, dataInfoId, version); - return; - } - - LOGGER.info("Push all temp data tasks success,dataCenter:{} dataInfoId:{} version:{} update!", - dataCenter, dataInfoId, - version); - } else { - LOGGER.warn("Push temp data tasks found error,subscribers version can not be update!"); - } - }); - return pushTaskClosure; - } - private void fireReceivedDataMultiPushTask(Datum datum, List subscriberRegisterIdList, - ScopeEnum scopeEnum, Subscriber subscriber, - PushTaskClosure pushTaskClosure, Map subscriberMap) { + ScopeEnum scopeEnum, Subscriber subscriber, Map subscriberMap) { Collection subscribers = new ArrayList<>(subscriberMap.values()); String dataId = datum.getDataId(); Predicate zonePredicate = (zone) -> { @@ -194,6 +165,7 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR } return false; }; + LOGGER.info("Datum push={}",datum); ReceivedData receivedData = ReceivedDataConverter.getReceivedDataMulti(datum, scopeEnum, subscriberRegisterIdList, sessionServerConfig.getSessionServerRegion(), zonePredicate); @@ -201,10 +173,9 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR Map parameter = new HashMap<>(); parameter.put(receivedData, subscriber.getSourceAddress()); TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); - taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - taskLogger.info("send {} taskURL:{},taskScope:{}", taskEvent.getTaskType(), subscriber.getSourceAddress(), - scopeEnum); + taskLogger.info("send {} taskURL:{},taskScope:{},version:{}", taskEvent.getTaskType(), subscriber.getSourceAddress(), + scopeEnum,receivedData.getVersion()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -214,11 +185,9 @@ private Map> getCache(ScopeEnum scope } private void fireUserDataElementPushTask(InetSocketAddress address, Datum datum, - Collection subscribers, - PushTaskClosure pushTaskClosure) { + Collection subscribers) { TaskEvent taskEvent = new TaskEvent(TaskType.USER_DATA_ELEMENT_PUSH_TASK); - taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); @@ -233,11 +202,9 @@ private void fireUserDataElementPushTask(InetSocketAddress address, Datum datum, } private void fireUserDataElementMultiPushTask(InetSocketAddress address, Datum datum, - Collection subscribers, - PushTaskClosure pushTaskClosure) { + Collection subscribers) { TaskEvent taskEvent = new TaskEvent(TaskType.USER_DATA_ELEMENT_MULTI_PUSH_TASK); - taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java index 2693e7cff..079de2ad1 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java @@ -165,6 +165,8 @@ public class MySubscriberDataObserver implements SubscriberDataObserver { public void handleData(String dataId, UserData data) { BaseIntegrationTest.this.dataId = dataId; BaseIntegrationTest.this.userData = data; + System.out.println("MySubscriberDataObserver:" + + userData.getZoneData().get(LOCAL_REGION).size()); } } diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java index 19628ec7f..a1dfbd736 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.test.pubsub; import com.alipay.sofa.registry.client.api.model.RegistryType; +import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.ServerDataBox; @@ -93,4 +94,48 @@ public void doTest() throws Exception { assertEquals(0, userData.getZoneData().size()); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); } + + @Test + public void doTestPubAndTempPubSameTime() throws Exception { + String dataId = "test-same-time-pub&tempPub-" + System.currentTimeMillis(); + String value = "test same time publish"; + + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.zone); + registryClient1.register(subReg); + Thread.sleep(1000L); + + // publish data + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, "test publish"); + + Thread.sleep(100L); + + // publish temp data + Publisher tempPublisher = new Publisher(); + tempPublisher.setPublishType(PublishType.TEMPORARY); + tempPublisher.setCell(LOCAL_REGION); + tempPublisher.setDataId(dataId); + tempPublisher.setGroup(DEFAULT_GROUP); + tempPublisher.setInstanceId(DEFAULT_INSTANCE_ID); + tempPublisher.setVersion(System.currentTimeMillis()); + tempPublisher.setRegisterTimestamp(System.currentTimeMillis()); + tempPublisher.setClientRegisterTimestamp(System.currentTimeMillis()); + tempPublisher.setRegisterId(UUID.randomUUID().toString()); + tempPublisher.setDataInfoId(DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, + DEFAULT_GROUP)); + List dataBoxData = new ArrayList(1); + dataBoxData.add(new ServerDataBox(object2bytes(value))); + tempPublisher.setDataList(dataBoxData); + sessionApplicationContext.getBean(DataNodeService.class).register(tempPublisher); + + Thread.sleep(1000L); + + assertEquals(1, userData.getZoneData().size()); + assertEquals(2, userData.getZoneData().get(LOCAL_REGION).size()); + + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); + } } From ebce157f4e62e3fc9a53c240d1c028931a27c3b9 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 12 Apr 2019 10:53:26 +0800 Subject: [PATCH 002/161] update version 5.2.1-SNAPSHOT --- client/all/pom.xml | 2 +- client/api/pom.xml | 2 +- client/impl/pom.xml | 2 +- client/log/pom.xml | 2 +- client/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 2 +- server/common/model/pom.xml | 2 +- server/common/pom.xml | 2 +- server/common/util/pom.xml | 2 +- server/consistency/pom.xml | 2 +- server/distribution/data/pom.xml | 2 +- server/distribution/integration/pom.xml | 2 +- server/distribution/meta/pom.xml | 2 +- server/distribution/pom.xml | 2 +- server/distribution/session/pom.xml | 2 +- server/pom.xml | 2 +- server/remoting/api/pom.xml | 2 +- server/remoting/bolt/pom.xml | 2 +- server/remoting/http/pom.xml | 2 +- server/remoting/pom.xml | 2 +- server/server/data/pom.xml | 2 +- server/server/integration/pom.xml | 2 +- server/server/meta/pom.xml | 2 +- server/server/pom.xml | 2 +- server/server/session/pom.xml | 2 +- server/store/api/pom.xml | 2 +- server/store/jraft/pom.xml | 2 +- server/store/pom.xml | 2 +- test/pom.xml | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/client/all/pom.xml b/client/all/pom.xml index 9f2ff4faa..a4f06ded3 100644 --- a/client/all/pom.xml +++ b/client/all/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-client-all - 5.2.0 + 5.2.1-SNAPSHOT ${project.groupId}:${project.artifactId} http://github.com/alipay/sofa-registry diff --git a/client/api/pom.xml b/client/api/pom.xml index ae29a4493..04292d197 100644 --- a/client/api/pom.xml +++ b/client/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/impl/pom.xml b/client/impl/pom.xml index 873ec62a6..b4179ca3d 100644 --- a/client/impl/pom.xml +++ b/client/impl/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/log/pom.xml b/client/log/pom.xml index 1d94e9b76..9059c5354 100644 --- a/client/log/pom.xml +++ b/client/log/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index f753f37eb..a717d1f38 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml diff --git a/core/pom.xml b/core/pom.xml index 9eea6264e..53b8c83d2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index a030f6367..2822dd6c9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-parent - 5.2.0 + 5.2.1-SNAPSHOT pom ${project.groupId}:${project.artifactId} diff --git a/server/common/model/pom.xml b/server/common/model/pom.xml index d459c1328..534a888df 100644 --- a/server/common/model/pom.xml +++ b/server/common/model/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/pom.xml b/server/common/pom.xml index cdc1aef3a..23e48515d 100644 --- a/server/common/pom.xml +++ b/server/common/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/util/pom.xml b/server/common/util/pom.xml index 500d96ade..bc5bae85f 100644 --- a/server/common/util/pom.xml +++ b/server/common/util/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/consistency/pom.xml b/server/consistency/pom.xml index 16e893a89..74f34ed4f 100644 --- a/server/consistency/pom.xml +++ b/server/consistency/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/data/pom.xml b/server/distribution/data/pom.xml index 0f3058ae7..7a0bcf99f 100644 --- a/server/distribution/data/pom.xml +++ b/server/distribution/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/integration/pom.xml b/server/distribution/integration/pom.xml index c994c31c2..acc7bd614 100644 --- a/server/distribution/integration/pom.xml +++ b/server/distribution/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/meta/pom.xml b/server/distribution/meta/pom.xml index 29c2f346d..7eb2cb232 100644 --- a/server/distribution/meta/pom.xml +++ b/server/distribution/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/pom.xml b/server/distribution/pom.xml index eb832bd67..d86e17598 100644 --- a/server/distribution/pom.xml +++ b/server/distribution/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/session/pom.xml b/server/distribution/session/pom.xml index bbd4f1459..afb87cdd1 100644 --- a/server/distribution/session/pom.xml +++ b/server/distribution/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/pom.xml b/server/pom.xml index 23292aa40..b82e3c0dd 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml diff --git a/server/remoting/api/pom.xml b/server/remoting/api/pom.xml index 8280a7f94..bc3fef23a 100644 --- a/server/remoting/api/pom.xml +++ b/server/remoting/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/bolt/pom.xml b/server/remoting/bolt/pom.xml index 64004ee22..0298c7669 100644 --- a/server/remoting/bolt/pom.xml +++ b/server/remoting/bolt/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/http/pom.xml b/server/remoting/http/pom.xml index 0df19fd39..e58a1ed56 100644 --- a/server/remoting/http/pom.xml +++ b/server/remoting/http/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/pom.xml b/server/remoting/pom.xml index 54767f4db..ad33907d6 100644 --- a/server/remoting/pom.xml +++ b/server/remoting/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/data/pom.xml b/server/server/data/pom.xml index 6e52e0ebd..6860a8ab6 100644 --- a/server/server/data/pom.xml +++ b/server/server/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/integration/pom.xml b/server/server/integration/pom.xml index c4e0e45e8..1a6b754ab 100644 --- a/server/server/integration/pom.xml +++ b/server/server/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/meta/pom.xml b/server/server/meta/pom.xml index 25bd602aa..aa668a070 100644 --- a/server/server/meta/pom.xml +++ b/server/server/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/pom.xml b/server/server/pom.xml index a88ad57f0..315e167ae 100644 --- a/server/server/pom.xml +++ b/server/server/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/session/pom.xml b/server/server/session/pom.xml index 49c4f1832..4762a1c9c 100644 --- a/server/server/session/pom.xml +++ b/server/server/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/api/pom.xml b/server/store/api/pom.xml index a266b9971..df0b06621 100644 --- a/server/store/api/pom.xml +++ b/server/store/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-store - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/jraft/pom.xml b/server/store/jraft/pom.xml index f02d8c6b2..eb7356bbd 100644 --- a/server/store/jraft/pom.xml +++ b/server/store/jraft/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-store - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml diff --git a/server/store/pom.xml b/server/store/pom.xml index 190977b79..0381e92a1 100644 --- a/server/store/pom.xml +++ b/server/store/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index c30264625..c81b32c84 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.2.0 + 5.2.1-SNAPSHOT ../pom.xml 4.0.0 From 5241284f7e0efa7b0e4870fd67b187d03af97bff Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 24 Apr 2019 17:28:43 +0800 Subject: [PATCH 003/161] fix test case --- .../com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java index 1f1787b5c..96d1f9bd1 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java @@ -108,7 +108,7 @@ public void doTestPubAndTempPubSameTime() throws Exception { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, "test publish"); - Thread.sleep(100L); + Thread.sleep(1000L); // publish temp data Publisher tempPublisher = new Publisher(); From 69d18e325fec19c0afcec2d3ea19dd1daac5d1a2 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 29 Apr 2019 13:11:51 +0800 Subject: [PATCH 004/161] fix jetty version,and fix rest api for dataInfoIds --- pom.xml | 2 +- .../server/session/resource/SessionDigestResource.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 2822dd6c9..1b15dc405 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 1.2.4 4.0.2 2.4 - 9.4.12.v20180830 + [9.4.17.v20190418,) ${user.dir} -Dnetwork_interface_denylist=docker0 diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java index 74f25329b..46d408b4f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -146,18 +147,17 @@ public Map getPushSwitch() { @Path("getDataInfoIdList") @Produces(MediaType.APPLICATION_JSON) public Collection getDataInfoIdList() { - Collection ret = new ArrayList<>(); + Collection ret = new HashSet<>(); ret.addAll(sessionInterests.getInterestDataInfoIds()); ret.addAll(sessionDataStore.getStoreDataInfoIds()); - return sessionInterests.getInterestDataInfoIds(); + return ret; } @GET @Path("checkSumDataInfoIdList") @Produces(MediaType.APPLICATION_JSON) public int checkSumDataInfoIdList() { - return sessionInterests.getInterestDataInfoIds().hashCode() - + sessionDataStore.getStoreDataInfoIds().hashCode(); + return getDataInfoIdList().hashCode(); } private void fillServerList(String type, From 2bd6ee524167ea61c7c7e89c296a1b8a31705533 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 29 Apr 2019 14:39:47 +0800 Subject: [PATCH 005/161] fix hashcode test --- .../test/resource/session/SessionDigestResourceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java index 96b1c144f..2c0b7f28c 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java @@ -183,6 +183,6 @@ public void testGetDataInfoIdList() { public void testCheckSumDataInfoIdList() { int result = sessionChannel.getWebTarget().path("digest/checkSumDataInfoIdList") .request(APPLICATION_JSON).get(int.class); - assertTrue(result > 0); + assertTrue(result != 0); } } From cebae412fc2d05a73c600404746314c4016eb188 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 10 May 2019 15:41:11 +0800 Subject: [PATCH 006/161] fix working to init bug --- .../data/bootstrap/DataServerBootstrap.java | 12 ++++- .../server/data/event/StartTaskEvent.java | 16 ++++--- .../server/data/event/StartTaskTypeEnum.java | 45 +++++++++++++++++++ .../handler/MetaServerChangeEventHandler.java | 9 ++++ .../event/handler/StartTaskEventHandler.java | 19 +++++--- .../dataserver/task/AbstractTask.java | 6 +++ .../task/ConnectionRefreshTask.java | 6 +++ .../dataserver/task/ReNewNodeTask.java | 6 +++ .../task/ConnectionRefreshMetaTask.java | 6 +++ 9 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index 02bec192f..e42293b84 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -23,10 +23,12 @@ import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.data.cache.CacheDigestTask; import com.alipay.sofa.registry.server.data.datasync.sync.Scheduler; import com.alipay.sofa.registry.server.data.event.EventCenter; import com.alipay.sofa.registry.server.data.event.MetaServerChangeEvent; import com.alipay.sofa.registry.server.data.event.StartTaskEvent; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import org.glassfish.jersey.server.ResourceConfig; @@ -38,10 +40,12 @@ import javax.ws.rs.Path; import javax.ws.rs.ext.Provider; import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; /** * @@ -186,7 +190,13 @@ private void startScheduler() { try { if (schedulerStarted.compareAndSet(false, true)) { syncDataScheduler.startScheduler(); - eventCenter.post(StartTaskEvent.getInstance()); + // start all startTask except renew task + eventCenter.post(new StartTaskEvent( + Arrays.stream(StartTaskTypeEnum.values()).filter(type->type != StartTaskTypeEnum.RENEW).collect( + Collectors.toSet()))); + + //start dump log + new CacheDigestTask().start(); } } catch (Exception e) { schedulerStarted.set(false); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskEvent.java index f49f3c01a..a892a2ab2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskEvent.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskEvent.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.event; +import java.util.Set; + /** * * @author qian.lqlq @@ -23,17 +25,19 @@ */ public class StartTaskEvent { - private static final StartTaskEvent INSTANCE = new StartTaskEvent(); + private final Set suitableTypes; - private StartTaskEvent() { + public StartTaskEvent(Set suitableTypes) { + this.suitableTypes = suitableTypes; } /** - * get instance of StartTaskEvent - * @return + * Getter method for property suitableTypes. + * + * @return property value of suitableTypes */ - public static StartTaskEvent getInstance() { - return INSTANCE; + public Set getSuitableTypes() { + return suitableTypes; } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java new file mode 100644 index 000000000..a015a1f4d --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.event; + +/** + * + * @author shangyu.wh + * @version $Id: StartTaskTypeEnum.java, v 0.1 2019-04-22 14:35 shangyu.wh Exp $ + */ +public enum StartTaskTypeEnum { + + /** + * ConnectionRefreshMetaTask + */ + CONNECT_META, + + /** + * ConnectionRefreshDataTask + */ + CONNECT_DATA, + + /** + * ReNewNodeTask + */ + RENEW, + + /** + * VersionCompareTask + */ + VERSION_COMPARE +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java index 3518503cb..9b035c98b 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java @@ -30,6 +30,8 @@ import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent; import com.alipay.sofa.registry.server.data.event.EventCenter; import com.alipay.sofa.registry.server.data.event.MetaServerChangeEvent; +import com.alipay.sofa.registry.server.data.event.StartTaskEvent; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.MetaNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; @@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -150,6 +153,12 @@ public URL getRequestUrl() { if (obj instanceof NodeChangeResult) { NodeChangeResult result = (NodeChangeResult) obj; Map versionMap = result.getDataCenterListVersions(); + + //send renew after first register dataNode + Set set = new HashSet<>(); + set.add(StartTaskTypeEnum.RENEW); + eventCenter.post(new StartTaskEvent(set)); + eventCenter.post(new DataServerChangeEvent(result.getNodes(), versionMap)); break; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java index c6adfffe1..9fd11edd9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java @@ -18,7 +18,6 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.server.data.cache.CacheDigestTask; import com.alipay.sofa.registry.server.data.event.StartTaskEvent; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.dataserver.task.AbstractTask; @@ -50,16 +49,22 @@ public Class interest() { @Override public void doHandle(StartTaskEvent event) { if (executor == null || executor.isShutdown()) { - executor = ExecutorFactory.newScheduledThreadPool(tasks.size(), this.getClass() - .getSimpleName()); - for (AbstractTask task : tasks) { - LOGGER.info("[StartTaskEventHandler] start task:{}", task.getName()); + getExecutor(); + } + + for (AbstractTask task : tasks) { + if (event.getSuitableTypes().contains(task.getStartTaskTypeEnum())) { + LOGGER.info("[StartTaskEventHandler] start task:%s", task.getName()); executor.scheduleWithFixedDelay(task, task.getInitialDelay(), task.getDelay(), task.getTimeUnit()); - LOGGER.info("[StartTaskEventHandler] start task:{} success", task.getName()); + LOGGER.info("[StartTaskEventHandler] start task:%s success", task.getName()); } - new CacheDigestTask().start(); } } + private void getExecutor() { + executor = ExecutorFactory.newScheduledThreadPool(tasks.size(), this.getClass() + .getSimpleName()); + } + } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/AbstractTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/AbstractTask.java index 64f80fc16..39c7d0488 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/AbstractTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/AbstractTask.java @@ -18,6 +18,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import java.util.concurrent.TimeUnit; @@ -74,4 +75,9 @@ public void run() { */ public abstract TimeUnit getTimeUnit(); + /** + * get type to match post + * @return + */ + public abstract StartTaskTypeEnum getStartTaskTypeEnum(); } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java index 6a19451ca..041bb2bc4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java @@ -19,6 +19,7 @@ import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent; import com.alipay.sofa.registry.server.data.event.EventCenter; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import org.springframework.beans.factory.annotation.Autowired; @@ -60,4 +61,9 @@ public TimeUnit getTimeUnit() { return TimeUnit.SECONDS; } + @Override + public StartTaskTypeEnum getStartTaskTypeEnum() { + return StartTaskTypeEnum.CONNECT_DATA; + } + } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java index 6fda74933..8275cbfef 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.task; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import org.springframework.beans.factory.annotation.Autowired; @@ -50,4 +51,9 @@ public int getInitialDelay() { public TimeUnit getTimeUnit() { return TimeUnit.SECONDS; } + + @Override + public StartTaskTypeEnum getStartTaskTypeEnum() { + return StartTaskTypeEnum.RENEW; + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/task/ConnectionRefreshMetaTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/task/ConnectionRefreshMetaTask.java index a36967ba0..50946a93a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/task/ConnectionRefreshMetaTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/task/ConnectionRefreshMetaTask.java @@ -18,6 +18,7 @@ import com.alipay.sofa.registry.server.data.event.EventCenter; import com.alipay.sofa.registry.server.data.event.MetaServerChangeEvent; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.dataserver.task.AbstractTask; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import org.springframework.beans.factory.annotation.Autowired; @@ -56,4 +57,9 @@ public int getInitialDelay() { public TimeUnit getTimeUnit() { return TimeUnit.SECONDS; } + + @Override + public StartTaskTypeEnum getStartTaskTypeEnum() { + return StartTaskTypeEnum.CONNECT_META; + } } \ No newline at end of file From 85b42a30e4e9c22caf46500c7cd38b02afd44c7b Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 10 May 2019 15:56:39 +0800 Subject: [PATCH 007/161] fix start task log --- .../server/data/event/handler/StartTaskEventHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java index 9fd11edd9..d82ab0ed4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java @@ -54,10 +54,10 @@ public void doHandle(StartTaskEvent event) { for (AbstractTask task : tasks) { if (event.getSuitableTypes().contains(task.getStartTaskTypeEnum())) { - LOGGER.info("[StartTaskEventHandler] start task:%s", task.getName()); + LOGGER.info("[StartTaskEventHandler] start task:{}", task.getName()); executor.scheduleWithFixedDelay(task, task.getInitialDelay(), task.getDelay(), task.getTimeUnit()); - LOGGER.info("[StartTaskEventHandler] start task:%s success", task.getName()); + LOGGER.info("[StartTaskEventHandler] start task:{} success", task.getName()); } } } From c05528294b538d9f106a108217c0af3a86517134 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 14 May 2019 10:50:16 +0800 Subject: [PATCH 008/161] fix Watcher can't get providate data,retry and finally return new --- .../task/WatcherRegisterFetchTask.java | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java index ad5bdf1b0..2bfeccb36 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java @@ -35,6 +35,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; /** * @@ -58,6 +59,8 @@ public class WatcherRegisterFetchTask extends AbstractSessionTask { private Watcher watcher; + private static final int TRY_COUNT = 3; + public WatcherRegisterFetchTask(SessionServerConfig sessionServerConfig, TaskListenerManager taskListenerManager, MetaNodeService metaNodeService) { @@ -88,17 +91,30 @@ public void execute() { boolean isOldVersion = !ClientVersion.StoreData.equals(watcher.getClientVersion()); - ProvideData provideData = metaNodeService.fetchData(watcher.getDataInfoId()); - if (provideData != null) { - if (!isOldVersion) { - DataInfo dataInfo = DataInfo.valueOf(provideData.getDataInfoId()); - ReceivedConfigData receivedConfigData = ReceivedDataConverter - .getReceivedConfigData(provideData.getProvideData(), dataInfo, - provideData.getVersion()); - receivedConfigData.setConfiguratorRegistIds(subscriberRegisterIdList); - firePushTask(receivedConfigData); + ProvideData provideData = null; + + for (int tryCount = 0; tryCount < TRY_COUNT; tryCount++) { + try { + provideData = metaNodeService.fetchData(watcher.getDataInfoId()); + break; + } catch (Exception e) { + randomDelay(3000); } } + + if (provideData == null) { + taskLogger.error("Fetch provider data error,set null value return.dataInfoId={}", watcher.getDataId()); + provideData = new ProvideData(null, watcher.getDataInfoId(), null); + } + + if (!isOldVersion) { + DataInfo dataInfo = DataInfo.valueOf(provideData.getDataInfoId()); + ReceivedConfigData receivedConfigData = ReceivedDataConverter + .getReceivedConfigData(provideData.getProvideData(), dataInfo, + provideData.getVersion()); + receivedConfigData.setConfiguratorRegistIds(subscriberRegisterIdList); + firePushTask(receivedConfigData); + } } private void firePushTask(ReceivedConfigData receivedConfigData) { @@ -114,6 +130,16 @@ public boolean checkRetryTimes() { return checkRetryTimes(sessionServerConfig.getSubscriberRegisterFetchRetryTimes()); } + private void randomDelay(int max) { + Random random = new Random(); + int randomNum = random.nextInt(max); + try { + Thread.sleep(randomNum); + } catch (InterruptedException e) { + taskLogger.error("[TimeUtil] random delay error", e); + } + } + @Override public String toString() { return "WATCHER_REGISTER_FETCH_TASK{" + "taskId='" + getTaskId() + '\'' + ", watcher=" From b187bd74c6bc2e18e593072ea574aaae76f0e3ef Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 14 May 2019 15:45:18 +0800 Subject: [PATCH 009/161] add data server list api --- .../data/resource/DataDigestResource.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java index 786bf7af0..a88d6cf83 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java @@ -16,21 +16,34 @@ */ package com.alipay.sofa.registry.server.data.resource; +import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.DataInfo; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.node.DataServerNode; +import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; +import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; +import org.springframework.beans.factory.annotation.Autowired; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; /** * @@ -40,6 +53,21 @@ @Path("digest") public class DataDigestResource { + private final static String SESSION = "SESSION"; + + private final static String DATA = "DATA"; + + private final static String META = "META"; + + @Autowired + private SessionServerConnectionFactory sessionServerConnectionFactory; + + @Autowired + private MetaServerConnectionFactory metaServerConnectionFactory; + + @Autowired + private DataServerConfig dataServerConfig; + @GET @Path("datum/query") @Produces(MediaType.APPLICATION_JSON) @@ -111,6 +139,90 @@ public String getDatumCount() { return sb.toString(); } + @GET + @Path("{type}/serverList/query") + @Produces(MediaType.APPLICATION_JSON) + public Map> getServerListAll(@PathParam("type") String type) { + + Map> map = new HashMap<>(); + if (type != null && !type.isEmpty()) { + String inputType = type.toUpperCase(); + + switch (inputType) { + case SESSION: + List sessionList = getSessionServerList(); + if (sessionList != null) { + map = new HashMap<>(); + map.put(dataServerConfig.getLocalDataCenter(), sessionList); + } + break; + case DATA: + map = getDataServerList(); + break; + case META: + map = getMetaServerList(); + break; + default: + map = new HashMap<>(); + break; + } + + } + return map; + } + + public List getSessionServerList() { + List connections = sessionServerConnectionFactory.getConnections().stream().filter(connection -> connection != null && connection.isFine()) + .map(connection -> connection.getRemoteIP() + ":" + connection.getRemotePort()) + .collect(Collectors.toList()); + return connections; + } + + public Map> getDataServerList() { + + Map> map = new HashMap<>(); + Set allDataCenter = new HashSet<>(DataServerNodeFactory.getAllDataCenters()); + for (String dataCenter:allDataCenter) { + + List list = map.computeIfAbsent(dataCenter,k->new ArrayList<>()); + + Map dataNodes = DataServerNodeFactory.getDataServerNodes(dataCenter); + if(dataNodes != null && !dataNodes.isEmpty()){ + + dataNodes.forEach((ip,dataServerNode)->{ + if (ip != null && !ip.equals(DataServerConfig.IP)) { + Connection connection = dataServerNode.getConnection(); + if (connection != null && connection.isFine()) { + list.add(connection.getRemoteIP()); + } + } + }); + } + } + return map; + } + + public Map> getMetaServerList() { + + Map> map = new HashMap<>(); + Set allDataCenter = new HashSet<>(metaServerConnectionFactory.getAllDataCenters()); + for (String dataCenter:allDataCenter) { + + List list = map.computeIfAbsent(dataCenter,k->new ArrayList<>()); + + Map metaConnections = metaServerConnectionFactory.getConnections(dataCenter); + if(metaConnections != null && !metaConnections.isEmpty()){ + + metaConnections.forEach((ip,connection)->{ + if (connection != null && connection.isFine()) { + list.add(connection.getRemoteIP()); + } + }); + } + } + return map; + } + private boolean isBlank(String dataInfoId) { return dataInfoId == null || dataInfoId.isEmpty(); } From b3714e5f0f063e0c4a55db73827910c5ae289367 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Sun, 19 May 2019 22:32:56 +0800 Subject: [PATCH 010/161] add server list api --- .../data/resource/DataDigestResource.java | 12 +-- .../resource/SessionDigestResource.java | 91 ++++++++++++++++++- .../task/WatcherRegisterFetchTask.java | 8 +- 3 files changed, 98 insertions(+), 13 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java index a88d6cf83..d61ea6da3 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java @@ -53,20 +53,20 @@ @Path("digest") public class DataDigestResource { - private final static String SESSION = "SESSION"; + private final static String SESSION = "SESSION"; - private final static String DATA = "DATA"; + private final static String DATA = "DATA"; - private final static String META = "META"; + private final static String META = "META"; @Autowired private SessionServerConnectionFactory sessionServerConnectionFactory; @Autowired - private MetaServerConnectionFactory metaServerConnectionFactory; + private MetaServerConnectionFactory metaServerConnectionFactory; @Autowired - private DataServerConfig dataServerConfig; + private DataServerConfig dataServerConfig; @GET @Path("datum/query") @@ -144,7 +144,7 @@ public String getDatumCount() { @Produces(MediaType.APPLICATION_JSON) public Map> getServerListAll(@PathParam("type") String type) { - Map> map = new HashMap<>(); + Map> map = new HashMap<>(); if (type != null && !type.isEmpty()) { String inputType = type.toUpperCase(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java index 46d408b4f..3bb5e1110 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java @@ -16,11 +16,16 @@ */ package com.alipay.sofa.registry.server.session.resource; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.StoreData; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.Watcher; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; +import com.alipay.sofa.registry.server.session.node.SessionNodeManager; import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; @@ -70,11 +75,17 @@ public class SessionDigestResource { @Autowired private SessionServerConfig sessionServerConfig; - private final static String SUB = "SUB"; + private final static String SUB = "SUB"; - private final static String PUB = "PUB"; + private final static String PUB = "PUB"; - private final static String WAT = "WAT"; + private final static String WAT = "WAT"; + + private final static String SESSION = "SESSION"; + + private final static String DATA = "DATA"; + + private final static String META = "META"; @GET @Path("{type}/data/query") @@ -208,4 +219,78 @@ private void fillServerList(String type, } } } + + @GET + @Path("{type}/serverList/query") + @Produces(MediaType.APPLICATION_JSON) + public List getServerListAll(@PathParam("type") String type) { + List serverList = new ArrayList<>(); + if (type != null && !type.isEmpty()) { + String inputType = type.toUpperCase(); + + switch (inputType) { + case SESSION: + serverList = getSessionServerList(); + break; + case DATA: + serverList = getDataServerList(); + break; + case META: + serverList = getMetaServerList(); + break; + default: + serverList = new ArrayList<>(); + break; + } + + } + return serverList; + } + + public List getSessionServerList() { + + List serverList = new ArrayList<>(); + NodeManager nodeManager = NodeManagerFactory.getNodeManager(NodeType.SESSION); + + if (nodeManager instanceof SessionNodeManager) { + SessionNodeManager sessionNodeManager = (SessionNodeManager) nodeManager; + serverList = sessionNodeManager.getZoneServerList(sessionServerConfig + .getSessionServerRegion()); + } + return serverList; + } + + public List getDataServerList() { + List serverList = new ArrayList<>(); + NodeManager dataNodeManager = NodeManagerFactory.getNodeManager(NodeType.DATA); + + Collection dataNodes = dataNodeManager.getDataCenterNodes(); + + if (!CollectionUtils.isEmpty(dataNodes)) { + for (Node dataNode : dataNodes) { + if (dataNode.getNodeUrl() == null || dataNode.getNodeUrl().getIpAddress() == null) { + continue; + } + serverList.add(dataNode.getNodeUrl().getIpAddress()); + } + } + return serverList; + } + + public List getMetaServerList() { + List serverList = new ArrayList<>(); + NodeManager metaNodeManager = NodeManagerFactory.getNodeManager(NodeType.META); + + Collection metaNodes = metaNodeManager.getDataCenterNodes(); + + if (!CollectionUtils.isEmpty(metaNodes)) { + for (Node metaNode : metaNodes) { + if (metaNode.getNodeUrl() == null || metaNode.getNodeUrl().getIpAddress() == null) { + continue; + } + serverList.add(metaNode.getNodeUrl().getIpAddress()); + } + } + return serverList; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java index 2bfeccb36..c85202614 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java @@ -103,15 +103,15 @@ public void execute() { } if (provideData == null) { - taskLogger.error("Fetch provider data error,set null value return.dataInfoId={}", watcher.getDataId()); + taskLogger.error("Fetch provider data error,set null value return.dataInfoId={}", + watcher.getDataId()); provideData = new ProvideData(null, watcher.getDataInfoId(), null); } if (!isOldVersion) { DataInfo dataInfo = DataInfo.valueOf(provideData.getDataInfoId()); - ReceivedConfigData receivedConfigData = ReceivedDataConverter - .getReceivedConfigData(provideData.getProvideData(), dataInfo, - provideData.getVersion()); + ReceivedConfigData receivedConfigData = ReceivedDataConverter.getReceivedConfigData( + provideData.getProvideData(), dataInfo, provideData.getVersion()); receivedConfigData.setConfiguratorRegistIds(subscriberRegisterIdList); firePushTask(receivedConfigData); } From 566fd1be997e49c1d6e5f8f2f75bc94e878038d6 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 20 May 2019 11:42:01 +0800 Subject: [PATCH 011/161] remove log --- .../server/meta/bootstrap/AbstractNodeConfigBean.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java index c5b8e78a5..430e29b45 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java @@ -105,9 +105,7 @@ public String getMetaDataCenter(String metaIpAddress) { } }); - if (ret.get() == null) { - LOGGER.error("node ipAddress:" + metaIpAddress + " cannot be found on config list!"); - } + dataCenterRet = ret.get(); } return dataCenterRet; From a31255840253ff0863aa658f9b12f059cfcc8a57 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 20 May 2019 16:30:21 +0800 Subject: [PATCH 012/161] fix isssue 21 --- .../registry/task/listener/TaskEvent.java | 28 ++++++++++++++++--- .../ReceivedDataMultiPushTaskListener.java | 7 +++++ .../scheduler/task/AbstractSessionTask.java | 4 +++ .../scheduler/task/CancelDataTask.java | 6 ++++ .../task/DataChangeFetchCloudTask.java | 20 +++++++++---- .../scheduler/task/DataChangeFetchTask.java | 20 +++++++++---- .../session/scheduler/task/DataPushTask.java | 6 +++- .../task/ProvideDataChangeFetchTask.java | 5 ++++ .../scheduler/task/PushTaskClosure.java | 28 ++++++++++--------- .../task/ReceivedConfigDataPushTask.java | 6 ++++ .../task/ReceivedDataMultiPushTask.java | 9 +++--- .../task/SessionRegisterDataTask.java | 6 ++++ .../task/SubscriberMultiFetchTask.java | 5 ++++ .../task/SubscriberRegisterFetchTask.java | 6 ++++ .../task/WatcherRegisterFetchTask.java | 6 ++++ ...ltSubscriberRegisterFetchTaskStrategy.java | 12 ++++---- 16 files changed, 134 insertions(+), 40 deletions(-) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index 16f1abcc3..3e1d354a4 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -19,6 +19,7 @@ import com.alipay.sofa.registry.task.TaskClosure; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; /** @@ -75,6 +76,10 @@ public String getName() { private long createTime; + private TaskClosure taskClosure; + + private final String taskId; + private final Map attributes = new ConcurrentHashMap(); /** @@ -84,10 +89,9 @@ public String getName() { public TaskEvent(TaskType taskType) { this.taskType = taskType; this.createTime = System.currentTimeMillis(); + taskId = UUID.randomUUID().toString(); } - private TaskClosure taskClosure; - /** * constructor * @param eventObj @@ -96,6 +100,17 @@ public TaskEvent(TaskType taskType) { public TaskEvent(Object eventObj, TaskType taskType) { this.eventObj = eventObj; this.taskType = taskType; + this.createTime = System.currentTimeMillis(); + taskId = UUID.randomUUID().toString(); + } + + /** + * Getter method for property taskId. + * + * @return property value of taskId + */ + public String getTaskId() { + return taskId; } /** @@ -195,7 +210,12 @@ public long getCreateTime() { @Override public String toString() { - return "TaskEvent{" + "eventObj=" + eventObj + ", sendTimeStamp=" + sendTimeStamp - + ", attributes=" + attributes + '}'; + final StringBuilder sb = new StringBuilder("TaskEvent{"); + sb.append("eventObj=").append(eventObj); + sb.append(", sendTimeStamp=").append(sendTimeStamp); + sb.append(", attributes=").append(attributes); + sb.append(", taskId='").append(taskId).append('\''); + sb.append('}'); + return sb.toString(); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java index e4c8b06b3..fa8e67694 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java @@ -22,10 +22,12 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.ClientNodeService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; +import com.alipay.sofa.registry.server.session.scheduler.task.PushTaskClosure; import com.alipay.sofa.registry.server.session.scheduler.task.ReceivedDataMultiPushTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; import com.alipay.sofa.registry.server.session.strategy.TaskMergeProcessorStrategy; +import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; @@ -103,6 +105,11 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { + TaskClosure taskClosure = event.getTaskClosure(); + + if (taskClosure != null && taskClosure instanceof PushTaskClosure) { + ((PushTaskClosure) taskClosure).addTask(event); + } receiveDataTaskMergeProcessorStrategy.handleEvent(event); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java index 3135c1461..47d9e853b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java @@ -46,6 +46,10 @@ public synchronized String getTaskId() { return taskId; } + protected synchronized void setTaskId(String taskId) { + this.taskId = taskId; + } + protected boolean checkRetryTimes(int configTimes) { if (configTimes > 0) { if (execCount.incrementAndGet() > configTimes) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java index df380c58b..17ef2a827 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java @@ -82,6 +82,12 @@ public void execute() { @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (obj instanceof List) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index a149fe500..0a31df7ce 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -98,6 +98,11 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof String)) { @@ -249,8 +254,9 @@ private void fireReceiveDataPushTask(Map datums, TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - taskLogger.info("send {} taskURL:{},taskScope:{},version:{}", taskEvent.getTaskType(), - subscriber.getSourceAddress(), scopeEnum, receivedData.getVersion()); + taskLogger.info("send {} taskURL:{},taskScope:{},version:{},taskId={}", + taskEvent.getTaskType(), subscriber.getSourceAddress(), scopeEnum, + receivedData.getVersion(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -268,9 +274,10 @@ private void fireUserDataElementPushTask(Datum datum, Subscriber subscriber, int size = datum != null && datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={}", + taskLogger.info( + "send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={},taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), datum.getDataInfoId(), - datum.getDataCenter(), size, subscribers.size()); + datum.getDataCenter(), size, subscribers.size(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -287,9 +294,10 @@ private void fireUserDataElementMultiPushTask(Datum datum, Subscriber subscriber int size = datum != null && datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={}", + taskLogger.info( + "send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={},taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), datum.getDataInfoId(), - datum.getDataCenter(), size, subscribers.size()); + datum.getDataCenter(), size, subscribers.size(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 3757a3117..17cd49982 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -248,8 +248,8 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - taskLogger.info("send {} taskURL:{},taskScope:{}", taskEvent.getTaskType(), subscriber.getSourceAddress(), - scopeEnum); + taskLogger.info("send {} taskURL:{},taskScope:{},,taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), + scopeEnum,taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -278,9 +278,10 @@ private void fireUserDataElementPushTask(InetSocketAddress address, Datum datum, int size = datum != null && datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={}", + taskLogger.info( + "send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={},taskId={}", taskEvent.getTaskType(), address, datum.getDataInfoId(), datum.getDataCenter(), size, - subscribers.size()); + subscribers.size(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -297,9 +298,10 @@ private void fireUserDataElementMultiPushTask(InetSocketAddress address, Datum d int size = datum != null && datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={}", + taskLogger.info( + "send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},subSize={},taskId={}", taskEvent.getTaskType(), address, datum.getDataInfoId(), datum.getDataCenter(), size, - subscribers.size()); + subscribers.size(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -310,6 +312,12 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof DataChangeRequest)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java index 52eb5bcfc..8e768b46f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java @@ -29,7 +29,6 @@ import com.alipay.sofa.registry.server.session.converter.ReceivedDataConverter; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.store.Interests; -import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; @@ -225,6 +224,11 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof DataPushRequest)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java index 19ffb86c1..7d6c69ca9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java @@ -100,6 +100,11 @@ public ProvideDataChangeFetchTask(SessionServerConfig sessionServerConfig, @Override public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof NotifyProvideDataChange)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java index cf7d46ece..68a7a4b45 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java @@ -21,8 +21,9 @@ import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; +import com.alipay.sofa.registry.task.listener.TaskEvent; -import java.util.Map; +import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -39,7 +40,8 @@ public class PushTaskClosure implements TaskClosure { private final static Logger LOGGER = LoggerFactory .getLogger(PushTaskClosure.class); - private ConcurrentHashMap taskMap = new ConcurrentHashMap<>(); + private Set tasks = ConcurrentHashMap + .newKeySet(); private ConcurrentHashMap taskResultMap = new ConcurrentHashMap<>(); @@ -64,21 +66,21 @@ public void run(ProcessingResult processingResult, Task task) { } } - public void addTask(Task task) { - taskMap.putIfAbsent(task.getTaskId(), task); + public void addTask(TaskEvent taskEvent) { + tasks.add(taskEvent.getTaskId()); } public void start() { pushTaskClosureExecutor.execute(() -> { try { - int size = taskMap.size(); - LOGGER.info("Push task queue size {},map size {}", completionQueue.size(), size); + int size = tasks.size(); + LOGGER.info("Push task queue size {},all task size {}", completionQueue.size(), size); for (int i = 0; i < size; i++) { String taskId = completionQueue.poll(6000, TimeUnit.MILLISECONDS); if(taskId != null) { ProcessingResult result = taskResultMap.get(taskId); if (result == ProcessingResult.Success) { - taskMap.remove(taskId); + tasks.remove(taskId); } } } @@ -86,14 +88,14 @@ public void start() { LOGGER.error("Push task check InterruptedException!", e); } - if (taskMap.isEmpty()) { + if (tasks.isEmpty()) { LOGGER.info("Push all tasks success"); if (taskClosure != null) { taskClosure.run(ProcessingResult.Success, null); } } else { - LOGGER.warn("Push tasks found error tasks {} !", taskMap); + LOGGER.warn("Push tasks found error tasks {} !", tasks.size()); if (taskClosure != null) { taskClosure.run(ProcessingResult.PermanentError, null); } @@ -102,12 +104,12 @@ public void start() { } /** - * Getter method for property taskMap. + * Getter method for property tasks. * - * @return property value of taskMap + * @return property value of tasks */ - public Map getTaskMap() { - return taskMap; + public Set getTasks() { + return tasks; } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java index 168e86474..11f6df8b6 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java @@ -98,6 +98,12 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (obj instanceof Map) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index dde2fd9be..4c0e99d7f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -191,6 +191,11 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (obj instanceof Map) { @@ -212,10 +217,6 @@ public void setTaskEvent(TaskEvent taskEvent) { taskClosure = taskEvent.getTaskClosure(); - if (taskClosure instanceof PushTaskClosure) { - ((PushTaskClosure) taskClosure).addTask(this); - } - subscribers = (Collection) taskEvent .getAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS); //taskClosure must confirm all subscriber push success diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java index 0640760ed..925bc27a5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java @@ -64,6 +64,12 @@ public boolean checkRetryTimes() { @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (obj instanceof URL) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberMultiFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberMultiFetchTask.java index ffb1495c0..b2b35d1e3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberMultiFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberMultiFetchTask.java @@ -63,6 +63,11 @@ public SubscriberMultiFetchTask(SessionServerConfig sessionServerConfig, @Override public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof String)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberRegisterFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberRegisterFetchTask.java index 815325337..9a539dd81 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberRegisterFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberRegisterFetchTask.java @@ -66,6 +66,12 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof Subscriber)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java index ad5bdf1b0..acc1ffa4e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/WatcherRegisterFetchTask.java @@ -68,6 +68,12 @@ public WatcherRegisterFetchTask(SessionServerConfig sessionServerConfig, @Override public void setTaskEvent(TaskEvent taskEvent) { + + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + Object obj = taskEvent.getEventObj(); if (!(obj instanceof Watcher)) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberRegisterFetchTaskStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberRegisterFetchTaskStrategy.java index 0c7f1ac91..9ef7fdbe3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberRegisterFetchTaskStrategy.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberRegisterFetchTaskStrategy.java @@ -108,8 +108,8 @@ private void firePush(ReceivedData receivedData, Subscriber subscriber, parameter.put(receivedData, subscriber.getSourceAddress()); TaskEvent taskEvent = new TaskEvent(parameter, TaskEvent.TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); - taskLogger.info("send {} taskURL:{},taskScope:{}", taskEvent.getTaskType(), - subscriber.getSourceAddress(), receivedData.getScope()); + taskLogger.info("send {} taskURL:{},taskScope:{},taskId:{}", taskEvent.getTaskType(), + subscriber.getSourceAddress(), receivedData.getScope(), taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -141,9 +141,9 @@ private void fireUserDataElementPushTask(Datum datum, Subscriber subscriber, taskEvent.setAttribute(Constant.PUSH_CLIENT_URL, subscriber.getSourceAddress()); int size = datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={}", + taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), datum.getDataInfoId(), - datum.getDataCenter(), size); + datum.getDataCenter(), size, taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -161,9 +161,9 @@ private void fireUserDataElementMultiPushTask(Datum datum, Subscriber subscriber int size = datum.getPubMap() != null ? datum.getPubMap().size() : 0; - taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={}", + taskLogger.info("send {} taskURL:{},dataInfoId={},dataCenter={},pubSize={},taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), datum.getDataInfoId(), - datum.getDataCenter(), size); + datum.getDataCenter(), size, taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } } From 079399dc5de3d83af4b61227772c287e371923af Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 20 May 2019 16:43:53 +0800 Subject: [PATCH 013/161] add query by id function --- .../sofa/registry/server/session/store/Interests.java | 8 ++++++++ .../server/session/store/SessionInterests.java | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java index 3fcf99a39..61baf6da2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java @@ -77,4 +77,12 @@ public interface Interests extends DataManager { */ Map> querySubscriberIndex(String dataInfoId, ScopeEnum scope); + + /** + * get subscriber by dataInfoId and registerId + * @param registerId + * @param dataInfoId + * @return + */ + Subscriber queryById(String registerId, String dataInfoId); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index 68341371e..a1b0719be 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -180,6 +180,16 @@ public Map queryByConnectId(String connectId) { return connectIndex.get(connectId); } + public Subscriber queryById(String registerId, String dataInfoId) { + + Map subscribers = interests.get(dataInfoId); + + if (subscribers == null) { + return null; + } + return subscribers.get(registerId); + } + @Override public Collection getInterests(String dataInfoId) { Map subscribers = interests.get(dataInfoId); From 2c06a3922c9a3c9f32b60597f110cc5998311f9d Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 20 May 2019 18:19:23 +0800 Subject: [PATCH 014/161] fix issue 22 --- .../datasync/sync/AbstractAcceptorStore.java | 31 ++++++++++++------- .../DataServerConnectionFactory.java | 14 ++++++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java index c85ff165c..70e644c0e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java @@ -31,6 +31,7 @@ import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.util.DelayItem; +import com.alipay.sofa.registry.server.data.util.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; @@ -191,25 +192,31 @@ private void notifyChange(Acceptor acceptor) { continue; } - Connection connection = dataServerConnectionFactory.getConnection(targetDataIp); - if (connection == null) { - LOGGER.error(getLogByClass(String.format( - "Can not get notify data server connection!ip: %s", targetDataIp))); - continue; - } - LOGGER.info(getLogByClass("Notify data server {} change data {} to sync"), - connection.getRemoteIP(), request); + Server syncServer = boltExchange.getServer(dataServerBootstrapConfig.getSyncDataPort()); + for (int tryCount = 0; tryCount < NOTIFY_RETRY; tryCount++) { try { - Server syncServer = boltExchange.getServer(dataServerBootstrapConfig - .getSyncDataPort()); + + Connection connection = dataServerConnectionFactory.getConnection(targetDataIp); + if (connection == null) { + LOGGER.error(getLogByClass(String.format( + "Can not get notify data server connection!ip: %s,retry=%s", + targetDataIp, tryCount))); + TimeUtil.randomDelay(1000); + continue; + } + LOGGER.info( + getLogByClass("Notify data server {} change data {} to sync,retry={}"), + connection.getRemoteIP(), request, tryCount); + syncServer.sendSync(syncServer.getChannel(connection.getRemoteAddress()), request, 1000); break; } catch (Exception e) { LOGGER.error(getLogByClass(String.format( - "Notify data server %s failed, NotifyDataSyncRequest:%s", targetDataIp, - request)), e); + "Notify data server %s failed, NotifyDataSyncRequest:%s,retry=%s", + targetDataIp, request, tryCount)), e); + TimeUtil.randomDelay(1000); } } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerConnectionFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerConnectionFactory.java index 6cb2d8f9b..c7f62a93f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerConnectionFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerConnectionFactory.java @@ -31,7 +31,7 @@ public class DataServerConnectionFactory { /** * collection of connections - * key:ip + * key:connectId ip:port */ private final Map MAP = new ConcurrentHashMap<>(); @@ -41,16 +41,16 @@ public class DataServerConnectionFactory { * @param connection */ public void register(Connection connection) { - MAP.put(connection.getRemoteIP(), connection); + MAP.put(getConnectId(connection), connection); } /** - * remove connection by specific ip + * remove connection by specific ip+port * * @param connection */ public void remove(Connection connection) { - MAP.remove(connection.getRemoteIP()); + MAP.remove(getConnectId(connection)); } /** @@ -60,6 +60,10 @@ public void remove(Connection connection) { * @return */ public Connection getConnection(String ip) { - return MAP.get(ip); + return MAP.values().stream().filter(connection -> ip.equals(connection.getRemoteIP()) && connection.isFine()).findFirst().orElse(null); + } + + private String getConnectId(Connection connection) { + return connection.getRemoteIP() + ":" + connection.getRemotePort(); } } \ No newline at end of file From f03183b8f65eb9751925d8b38111d0e67f7e1a4f Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 May 2019 15:27:49 +0800 Subject: [PATCH 015/161] delay client off process and sync data process to working status --- .../common/model/metaserver/DataNode.java | 4 - .../common/model/metaserver/MetaNode.java | 3 - .../common/model/metaserver/SessionNode.java | 13 ++- .../DataServerBeanConfiguration.java | 27 ++++++ .../server/data/cache/DataServerCache.java | 25 +++-- .../change/event/DataChangeEventQueue.java | 3 +- .../data/event/AfterWorkingProcess.java | 29 ++++++ .../handler/AfterWorkingProcessHandler.java | 50 ++++++++++ .../LocalDataServerChangeEventHandler.java | 12 ++- .../handler/NotifyDataSyncHandler.java | 92 +++++++++++++++++-- .../disconnect/DisconnectEventHandler.java | 57 ++++++++++-- .../task/ReceivedDataMultiPushTask.java | 59 ++++++++---- 12 files changed, 318 insertions(+), 56 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/AfterWorkingProcess.java create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/AfterWorkingProcessHandler.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/DataNode.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/DataNode.java index ca3bba378..e5e623f63 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/DataNode.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/DataNode.java @@ -213,10 +213,6 @@ public void setRegistrationTimestamp(long registrationTimestamp) { public String toString() { final StringBuilder sb = new StringBuilder("DataNode{"); sb.append("ip=").append(getIp()); - sb.append(", dataCenter='").append(dataCenter).append('\''); - sb.append(", regionId='").append(regionId).append('\''); - sb.append(", nodeStatus=").append(nodeStatus); - sb.append(", registrationTimestamp=").append(registrationTimestamp); sb.append('}'); return sb.toString(); } diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java index 6adf2457c..8e804f186 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java @@ -132,9 +132,6 @@ public void setRegionId(String regionId) { public String toString() { final StringBuilder sb = new StringBuilder("MetaNode{"); sb.append("nodeUrl=").append(getIp()); - sb.append(", dataCenter='").append(dataCenter).append('\''); - sb.append(", regionId='").append(regionId).append('\''); - sb.append(", nodeStatus=").append(nodeStatus); sb.append('}'); return sb.toString(); } diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/SessionNode.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/SessionNode.java index d6beeaf67..8c9a3487e 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/SessionNode.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/SessionNode.java @@ -55,6 +55,14 @@ public URL getNodeUrl() { return nodeUrl; } + /** + * get ip address from nodeUrl + * @return + */ + public String getIp() { + return nodeUrl == null ? "" : nodeUrl.getIpAddress(); + } + @Override public boolean equals(Object o) { if (this == o) { @@ -167,10 +175,7 @@ public void setNodeStatus(NodeStatus nodeStatus) { @Override public String toString() { final StringBuilder sb = new StringBuilder("SessionNode{"); - sb.append("nodeUrl=").append(nodeUrl); - sb.append(", regionId='").append(regionId).append('\''); - sb.append(", name='").append(name).append('\''); - sb.append(", nodeStatus=").append(nodeStatus); + sb.append("ip=").append(getIp()); sb.append('}'); return sb.toString(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 5087a451b..a15a39907 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -33,7 +33,9 @@ import com.alipay.sofa.registry.server.data.datasync.sync.Scheduler; import com.alipay.sofa.registry.server.data.datasync.sync.StoreServiceFactory; import com.alipay.sofa.registry.server.data.datasync.sync.SyncDataServiceImpl; +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; import com.alipay.sofa.registry.server.data.event.EventCenter; +import com.alipay.sofa.registry.server.data.event.handler.AfterWorkingProcessHandler; import com.alipay.sofa.registry.server.data.event.handler.DataServerChangeEventHandler; import com.alipay.sofa.registry.server.data.event.handler.LocalDataServerChangeEventHandler; import com.alipay.sofa.registry.server.data.event.handler.MetaServerChangeEventHandler; @@ -76,6 +78,7 @@ import com.alipay.sofa.registry.util.PropertySplitter; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -449,4 +452,28 @@ public DataDigestResource dataDigestResource() { return new DataDigestResource(); } } + + @Configuration + public static class AfterWorkingProcessConfiguration { + + @Autowired + DisconnectEventHandler disconnectEventHandler; + + @Autowired + NotifyDataSyncHandler notifyDataSyncHandler; + + @Bean(name = "afterWorkProcessors") + public List afterWorkingProcessors() { + List list = new ArrayList<>(); + list.add(disconnectEventHandler); + list.add(notifyDataSyncHandler); + return list; + } + + @Bean + public AfterWorkingProcessHandler afterWorkingProcessHandler() { + return new AfterWorkingProcessHandler(); + } + + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java index 163d633ff..a99565375 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java @@ -21,6 +21,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.event.handler.AfterWorkingProcessHandler; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +29,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -53,8 +53,13 @@ public class DataServerCache { @Autowired private DataServerConfig dataServerConfig; + @Autowired + private AfterWorkingProcessHandler afterWorkingProcessHandler; + + /** current dataServer list and version */ private volatile DataServerChangeItem dataServerChangeItem = new DataServerChangeItem(); + /** new input dataServer list and version */ private volatile DataServerChangeItem newDataServerChangeItem = new DataServerChangeItem(); private final AtomicBoolean HAS_NOTIFY_ALL = new AtomicBoolean( @@ -265,6 +270,9 @@ private void updateDataServerStatus() { //after working status,must clean this map,because calculate backupTriad need add not working node,see LocalDataServerChangeEventHandler getToBeSyncMap resetStatusMapToWorking(); + + //after working process + afterWorkingProcessHandler.afterWorkingProcess(); } } @@ -351,8 +359,12 @@ public Long getDataCenterNewVersion(String dataCenter) { } } - public BackupTriad calculateOldBackupTriad(String dataInfoId, String dataCenter, - DataServerConfig dataServerBootstrapConfig) { + /** + * calculate ConsistentHash base current data server list + * @param dataCenter + * @return + */ + public ConsistentHash calculateOldConsistentHash(String dataCenter) { Map> dataServerMap = dataServerChangeItem.getServerMap(); Map dataNodeMap = dataServerMap.get(dataCenter); @@ -361,12 +373,9 @@ public BackupTriad calculateOldBackupTriad(String dataInfoId, String dataCenter, Collection dataServerNodes = dataNodeMap.values(); ConsistentHash consistentHash = new ConsistentHash<>( - dataServerBootstrapConfig.getNumberOfReplicas(), dataServerNodes); - - List list = consistentHash.getNUniqueNodesFor(dataInfoId, - dataServerBootstrapConfig.getStoreNodes()); + dataServerConfig.getNumberOfReplicas(), dataServerNodes); - return new BackupTriad(dataInfoId, list); + return consistentHash; } else { LOGGER.warn("Calculate Old BackupTriad,old dataServer list is empty!"); return null; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index ae996d04f..b9b91e421 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -16,7 +16,6 @@ */ package com.alipay.sofa.registry.server.data.change.event; -import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -205,6 +204,8 @@ private void handleHost(ClientChangeEvent event) { synchronized (Interners.newWeakInterner().intern(clientHost)) { Map pubMap = DatumCache.getByHost(clientHost); if (pubMap != null && !pubMap.isEmpty()) { + LOGGER.info("[{}] client off begin, host={}, occurTimestamp={},all pub size={}", + getName(), clientHost, event.getOccurredTimestamp(), pubMap.size()); int count = 0; for (Publisher publisher : pubMap.values()) { DataServerNode dataServerNode = DataServerNodeFactory.computeDataServerNode( diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/AfterWorkingProcess.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/AfterWorkingProcess.java new file mode 100644 index 000000000..f15aca14d --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/AfterWorkingProcess.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.event; + +/** + * + * @author shangyu.wh + * @version $Id: AfterWorkingProcessor.java, v 0.1 2019-05-21 11:25 shangyu.wh Exp $ + */ +public interface AfterWorkingProcess { + + void afterWorkingProcess(); + + int getOrder(); +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/AfterWorkingProcessHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/AfterWorkingProcessHandler.java new file mode 100644 index 000000000..3e7f3cfba --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/AfterWorkingProcessHandler.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.event.handler; + +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * @author shangyu.wh + * @version $Id: AfterWorkingProcessHandler.java, v 0.1 2019-05-21 11:46 shangyu.wh Exp $ + */ +public class AfterWorkingProcessHandler implements AfterWorkingProcess { + + @Resource(name = "afterWorkProcessors") + private List afterWorkingProcessors; + + @Override + public void afterWorkingProcess() { + + if(afterWorkingProcessors != null){ + List list = afterWorkingProcessors.stream().sorted(Comparator.comparing(AfterWorkingProcess::getOrder)).collect(Collectors.toList()); + + list.forEach(AfterWorkingProcess::afterWorkingProcess); + } + } + + @Override + public int getOrder() { + return 0; + } +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 774b7572f..d2d8cde68 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -228,6 +228,13 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) Map>> toBeSyncMap = new HashMap<>(); Map> triadCache = new HashMap<>(); + ConsistentHash consistentHashOld = dataServerCache + .calculateOldConsistentHash(dataServerBootstrapConfig.getLocalDataCenter()); + if (consistentHash == null) { + LOGGER.error("Calculate Old ConsistentHash error!"); + throw new RuntimeException("Calculate Old ConsistentHash error!"); + } + //compute new triad for every datum in cache Map> allMap = DatumCache.getAll(); for (Entry> dataCenterEntry : allMap.entrySet()) { @@ -247,8 +254,9 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) dataServerBootstrapConfig.getStoreNodes()); triadCache.put(dataInfoId, backupNodes); } - BackupTriad backupTriad = dataServerCache.calculateOldBackupTriad(dataInfoId, - dataServerBootstrapConfig.getLocalDataCenter(), dataServerBootstrapConfig); + BackupTriad backupTriad = new BackupTriad(dataInfoId, + consistentHashOld.getNUniqueNodesFor(dataInfoId, + dataServerBootstrapConfig.getStoreNodes())); if (backupTriad != null) { List newJoinedNodes = backupTriad.getNewJoined(backupNodes, dataServerCache.getNotWorking()); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java index 5938070bb..af94482d1 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java @@ -29,17 +29,22 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; +import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.remoting.dataserver.GetSyncDataHandler; import com.alipay.sofa.registry.server.data.remoting.dataserver.SyncDataCallback; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; +import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; import org.springframework.beans.factory.annotation.Autowired; import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -48,23 +53,33 @@ * @author qian.lqlq * @version $Id: NotifyDataSyncProcessor.java, v 0.1 2018-03-06 20:04 qian.lqlq Exp $ */ -public class NotifyDataSyncHandler extends AbstractClientHandler { +public class NotifyDataSyncHandler extends AbstractClientHandler implements + AfterWorkingProcess { - private static final Logger LOGGER = LoggerFactory.getLogger(NotifyDataSyncHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(NotifyDataSyncHandler.class); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerBootstrapConfig; @Autowired - private GetSyncDataHandler getSyncDataHandler; + private GetSyncDataHandler getSyncDataHandler; @Autowired - private DataChangeEventCenter dataChangeEventCenter; + private DataChangeEventCenter dataChangeEventCenter; - private Executor executor = ExecutorFactory.newFixedThreadPool(10, - NotifyDataSyncHandler.class.getSimpleName()); + private Executor executor = ExecutorFactory + .newFixedThreadPool( + 10, + NotifyDataSyncHandler.class + .getSimpleName()); - private ThreadPoolExecutor notifyExecutor; + private ThreadPoolExecutor notifyExecutor; + + @Autowired + private DataNodeStatus dataNodeStatus; + + private static final BlockingQueue noWorkQueue = new LinkedBlockingQueue<>(); @Override public void checkParam(NotifyDataSyncRequest request) throws RuntimeException { @@ -74,6 +89,16 @@ public void checkParam(NotifyDataSyncRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, NotifyDataSyncRequest request) { final Connection connection = ((BoltChannel) channel).getConnection(); + if (dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING) { + LOGGER.info("receive notifyDataSync request,but data server not working!"); + noWorkQueue.add(new SyncDataRequestForWorking(connection, request)); + return CommonResponse.buildSuccessResponse(); + } + executorRequest(connection, request); + return CommonResponse.buildSuccessResponse(); + } + + private void executorRequest(Connection connection,NotifyDataSyncRequest request){ executor.execute(() -> { String dataInfoId = request.getDataInfoId(); String dataCenter = request.getDataCenter(); @@ -92,7 +117,25 @@ public Object doHandle(Channel channel, NotifyDataSyncRequest request) { "[NotifyDataSyncHandler] not need to sync data, version={}", version); } }); - return CommonResponse.buildSuccessResponse(); + } + + @Override + public void afterWorkingProcess() { + try { + while (!noWorkQueue.isEmpty()) { + SyncDataRequestForWorking event = noWorkQueue.poll(1, TimeUnit.SECONDS); + if (event != null) { + executorRequest(event.getConnection(), event.getRequest()); + } + } + } catch (InterruptedException e) { + LOGGER.error("receive disconnect event after working interrupted!", e); + } + } + + @Override + public int getOrder() { + return 1; } @Override @@ -128,4 +171,35 @@ public HandlerType getType() { protected Node.NodeType getConnectNodeType() { return Node.NodeType.DATA; } + + private class SyncDataRequestForWorking { + + private final Connection connection; + + private final NotifyDataSyncRequest request; + + public SyncDataRequestForWorking(Connection connection, NotifyDataSyncRequest request) { + this.connection = connection; + this.request = request; + } + + /** + * Getter method for property connection. + * + * @return property value of connection + */ + public Connection getConnection() { + return connection; + } + + /** + * Getter method for property request. + * + * @return property value of request + */ + public NotifyDataSyncRequest getRequest() { + return request; + } + + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java index f262b420f..8cdf7044e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java @@ -21,37 +21,50 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.event.ClientChangeEvent; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; +import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; +import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import java.util.Set; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.DelayQueue; import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; /** * @author qian.lqlq * @version $Id: ClientDisconnectEventHandler.java, v 0.1 2017-12-07 15:32 qian.lqlq Exp $ */ -public class DisconnectEventHandler implements InitializingBean { +public class DisconnectEventHandler implements InitializingBean, AfterWorkingProcess { - private static final Logger LOGGER = LoggerFactory - .getLogger(DisconnectEventHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DisconnectEventHandler.class); /** * a DelayQueue that contains client disconnect events */ - private final DelayQueue EVENT_QUEUE = new DelayQueue<>(); + private final DelayQueue EVENT_QUEUE = new DelayQueue<>(); @Autowired - private SessionServerConnectionFactory sessionServerConnectionFactory; + private SessionServerConnectionFactory sessionServerConnectionFactory; @Autowired - private DataChangeEventCenter dataChangeEventCenter; + private DataChangeEventCenter dataChangeEventCenter; @Autowired - private DataServerConfig dataServerConfig; + private DataServerConfig dataServerConfig; + + @Autowired + private DataNodeStatus dataNodeStatus; + + private static final int BLOCK_FOR_ALL_SYNC = 5000; + + private static final BlockingQueue noWorkQueue = new LinkedBlockingQueue<>(); /** * receive disconnect event of client @@ -64,10 +77,40 @@ public void receive(DisconnectEvent event) { LOGGER.info("receive session off event: sessionServerHost={}, processId={}", sessionServerDisconnectEvent.getSessionServerHost(), sessionServerDisconnectEvent.getProcessId()); + } else if (event.getType() == DisconnectTypeEnum.CLIENT) { + ClientDisconnectEvent clientDisconnectEvent = (ClientDisconnectEvent) event; + LOGGER.info("receive client off event: clientHost={}", clientDisconnectEvent.getHost()); + } + + if (dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING) { + LOGGER.info("receive disconnect event,but data server not working!"); + noWorkQueue.add(event); + return; } EVENT_QUEUE.add(event); } + public void afterWorkingProcess() { + try { + //sleep for sync all done + TimeUnit.MILLISECONDS.sleep(BLOCK_FOR_ALL_SYNC); + + while (!noWorkQueue.isEmpty()) { + DisconnectEvent event = noWorkQueue.poll(1, TimeUnit.SECONDS); + if (event != null) { + receive(event); + } + } + } catch (InterruptedException e) { + LOGGER.error("receive disconnect event after working interrupted!", e); + } + } + + @Override + public int getOrder() { + return 0; + } + @Override public void afterPropertiesSet() { LOGGER.info("begin start DisconnectEventHandler"); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index dde2fd9be..5baec41c0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -19,6 +19,7 @@ import com.alipay.sofa.registry.common.model.PushDataRetryRequest; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.core.model.DataBox; import com.alipay.sofa.registry.core.model.ReceivedData; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -37,6 +38,7 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; @@ -62,6 +64,8 @@ public class ReceivedDataMultiPushTask extends AbstractSessionTask implements Ta private ReceivedDataMultiPushTaskStrategy receivedDataMultiPushTaskStrategy; private AsyncHashedWheelTimer asyncHashedWheelTimer; + private String dataPush; + public ReceivedDataMultiPushTask(SessionServerConfig sessionServerConfig, ClientNodeService clientNodeService, ExecutorManager executorManager, @@ -94,10 +98,11 @@ public void execute() { CallbackHandler callbackHandler = new CallbackHandler() { @Override public void onCallback(Channel channel, Object message) { - LOGGER.info( - "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url); + LOGGER + .info( + "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush); if (taskClosure != null) { confirmCallBack(true); @@ -106,10 +111,12 @@ public void onCallback(Channel channel, Object message) { @Override public void onException(Channel channel, Throwable exception) { - LOGGER.error( - "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url, exception); + LOGGER + .error( + "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush, + exception); if (taskClosure != null) { confirmCallBack(false); @@ -154,31 +161,31 @@ private void retrySendReceiveData(PushDataRetryRequest pushDataRetryRequest) { clientNodeService.pushWithCallback(infoPackage, targetUrl, new CallbackHandler() { @Override public void onCallback(Channel channel, Object message) { - LOGGER.info("Retry Push ReceivedData success! dataId:{}, group:{},url:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,retryTimes); + LOGGER.info("Retry Push ReceivedData success! dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); } @Override public void onException(Channel channel, Throwable exception) { - LOGGER.error("Retry Push ReceivedData callback error! url:{}, dataId:{}, group:{},taskId:{},retryTimes:{}", targetUrl, - receivedData.getDataId(), receivedData.getGroup(),getTaskId(),retryTimes); + LOGGER.error("Retry Push ReceivedData callback error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", targetUrl, + receivedData.getDataId(), receivedData.getGroup(),getTaskId(),dataPush,retryTimes); retrySendReceiveData(pushDataRetryRequest); } }); } catch (Exception e) { - LOGGER.error("Retry Push ReceivedData error! url:{}, dataId:{}, group:{},taskId:{},retryTimes:{}", targetUrl, - receivedData.getDataId(), receivedData.getGroup(),getTaskId(),retryTimes); + LOGGER.error("Retry Push ReceivedData error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", targetUrl, + receivedData.getDataId(), receivedData.getGroup(),getTaskId(),dataPush,retryTimes); retrySendReceiveData(pushDataRetryRequest); } },getBlockTime(retryTimes),TimeUnit.MILLISECONDS); } else { - LOGGER.error("Retry Push ReceivedData error, connect be null or disconnected,stop retry!dataId:{}, group:{},url:{},taskId:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),retryTimes); + LOGGER.error("Retry Push ReceivedData error, connect be null or disconnected,stop retry!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); } } else { - LOGGER.error("Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),retryTimes); + LOGGER.error("Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); } } } @@ -210,6 +217,22 @@ public void setTaskEvent(TaskEvent taskEvent) { } } + if (receivedData != null && receivedData.getData() != null) { + StringBuilder sb = new StringBuilder(); + sb.append("["); + Map> map = receivedData.getData(); + if (!map.isEmpty()) { + + for (Map.Entry> entry1 : map.entrySet()) { + sb.append(entry1.getKey()).append("="); + int size = entry1.getValue() != null ? entry1.getValue().size() : 0; + sb.append(size).append(","); + } + } + sb.append("]"); + dataPush = sb.toString(); + } + taskClosure = taskEvent.getTaskClosure(); if (taskClosure instanceof PushTaskClosure) { From ab3e21d3169e86ce0a75d96b48d6104651d8a95f Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 May 2019 15:56:51 +0800 Subject: [PATCH 016/161] fix data connet meta error --- .../metaserver/DefaultMetaServiceImpl.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java index dd9ecdc49..dd1b2252d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -81,11 +82,14 @@ public Map> getMetaServerMap() { Connection connection = null; try { if (connectionMap.isEmpty()) { - connection = ((BoltChannel) metaNodeExchanger.connect(new URL( - set.iterator().next(), dataServerBootstrapConfig.getMetaServerPort()))) - .getConnection(); + List list = new ArrayList(set); + Collections.shuffle(list); + connection = ((BoltChannel) metaNodeExchanger.connect(new URL(list.iterator() + .next(), dataServerBootstrapConfig.getMetaServerPort()))).getConnection(); } else { - connection = connectionMap.values().iterator().next(); + List connections = new ArrayList<>(connectionMap.values()); + Collections.shuffle(connections); + connection = connections.iterator().next(); } GetNodesRequest request = new GetNodesRequest(NodeType.META); @@ -127,6 +131,8 @@ public URL getRequestUrl() { .warn( "[DefaultMetaServiceImpl] refresh connections from metaServer error,refresh leader : {}", con); + throw new RuntimeException( + "[DefaultMetaServiceImpl] refresh connections from metaServer error!", e); } return map; } From 69446218af8ded531b81fc2efc08adbc705b3ae7 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 22 May 2019 14:33:32 +0800 Subject: [PATCH 017/161] fix inject NotifyDataSyncHandler --- .../server/data/bootstrap/DataServerBeanConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index a15a39907..776982906 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -460,13 +460,13 @@ public static class AfterWorkingProcessConfiguration { DisconnectEventHandler disconnectEventHandler; @Autowired - NotifyDataSyncHandler notifyDataSyncHandler; + AbstractClientHandler notifyDataSyncHandler; @Bean(name = "afterWorkProcessors") public List afterWorkingProcessors() { List list = new ArrayList<>(); list.add(disconnectEventHandler); - list.add(notifyDataSyncHandler); + list.add((NotifyDataSyncHandler) notifyDataSyncHandler); return list; } From 93fa77da37a968dae82ebbac684d59f2a9a882d8 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 23 May 2019 13:48:04 +0800 Subject: [PATCH 018/161] fix start log --- .../common/model/metaserver/MetaNode.java | 2 +- .../server/data/change/DataChangeHandler.java | 8 ++- .../change/event/DataChangeEventQueue.java | 6 +- .../LocalDataServerCleanHandler.java | 12 ++-- .../event/handler/StartTaskEventHandler.java | 11 +-- .../handler/AbstractServerHandler.java | 22 +++--- .../metaserver/DefaultMetaServiceImpl.java | 5 ++ .../disconnect/DisconnectEventHandler.java | 6 +- .../handler/DataServerConnectionHandler.java | 7 +- .../src/main/resources/logback-spring.xml | 69 ++++++++++++++++++- .../server/meta/remoting/RaftExchanger.java | 22 +++--- .../src/main/resources/logback-spring.xml | 18 +++++ .../src/main/resources/logback-spring.xml | 6 ++ 13 files changed, 155 insertions(+), 39 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java index 8e804f186..01d107cb0 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/MetaNode.java @@ -131,7 +131,7 @@ public void setRegionId(String regionId) { @Override public String toString() { final StringBuilder sb = new StringBuilder("MetaNode{"); - sb.append("nodeUrl=").append(getIp()); + sb.append("ip=").append(getIp()); sb.append('}'); return sb.toString(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index a45c718ba..6f9e0104f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -43,7 +43,10 @@ */ public class DataChangeHandler implements InitializingBean { - private static final Logger LOGGER = LoggerFactory.getLogger(DataChangeHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DataChangeHandler.class); + + private static final Logger LOGGER_START = LoggerFactory.getLogger("DATA-START-LOGS"); @Autowired private DataServerConfig dataServerBootstrapConfig; @@ -74,7 +77,6 @@ public void start() { for (int idx = 0; idx < queueCount; idx++) { final DataChangeEventQueue dataChangeEventQueue = queues[idx]; final String name = dataChangeEventQueue.getName(); - LOGGER.info("[DataChangeHandler] begin to notify datum in queue:{}", name); executor.execute(() -> { while (true) { try { @@ -85,7 +87,7 @@ public void start() { } } }); - LOGGER.info("[DataChangeHandler] notify datum in queue:{} success", name); + LOGGER_START.info("[DataChangeHandler] notify datum in queue:{} success", name); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index b9b91e421..99cd31bd3 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -50,6 +50,9 @@ public class DataChangeEventQueue { private static final Logger LOGGER = LoggerFactory .getLogger(DataChangeEventQueue.class); + private static final Logger LOGGER_START = LoggerFactory + .getLogger("DATA-START-LOGS"); + /** * */ @@ -169,7 +172,6 @@ private ChangeData getChangeData(String dataCenter, String dataInfoId, * */ public void start() { - LOGGER.info("[{}] begin start DataChangeEventQueue", getName()); Executor executor = ExecutorFactory.newSingleThreadExecutor( String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), getName())); executor.execute(() -> { @@ -196,7 +198,7 @@ public void start() { } } }); - LOGGER.info("[{}] start DataChangeEventQueue success", getName()); + LOGGER_START.info("[{}] start DataChangeEventQueue success", getName()); } private void handleHost(ClientChangeEvent event) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java index bfc1fc3c8..fe498dbae 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java @@ -44,8 +44,11 @@ */ public class LocalDataServerCleanHandler { - private static final Logger LOGGER = LoggerFactory - .getLogger(LocalDataServerCleanHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(LocalDataServerCleanHandler.class); + + private static final Logger LOGGER_START = LoggerFactory + .getLogger("DATA-START-LOGS"); @Autowired private DataServerConfig dataServerBootstrapConfig; @@ -61,13 +64,12 @@ public class LocalDataServerCleanHandler { /** * a DelayQueue that contains clean task */ - private final DelayQueue> EVENT_QUEUE = new DelayQueue<>(); + private final DelayQueue> EVENT_QUEUE = new DelayQueue<>(); /** * constructor */ public LocalDataServerCleanHandler() { - LOGGER.info("[LocalDataServerCleanHandler] begin start LocalDataServerCleanHandler"); Executor executor = ExecutorFactory .newSingleThreadExecutor(LocalDataServerCleanHandler.class.getSimpleName()); executor.execute(() -> { @@ -81,7 +83,7 @@ public LocalDataServerCleanHandler() { } } }); - LOGGER.info("[LocalDataServerCleanHandler] start LocalDataServerCleanHandler success"); + LOGGER_START.info("[LocalDataServerCleanHandler] start LocalDataServerCleanHandler success"); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java index d82ab0ed4..8da403f3e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/StartTaskEventHandler.java @@ -33,13 +33,15 @@ */ public class StartTaskEventHandler extends AbstractEventHandler { - private static final Logger LOGGER = LoggerFactory - .getLogger(StartTaskEventHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(StartTaskEventHandler.class); + + private static final Logger LOGGER_START = LoggerFactory.getLogger("DATA-START-LOGS"); @Resource(name = "tasks") private List tasks; - private ScheduledExecutorService executor = null; + private ScheduledExecutorService executor = null; @Override public Class interest() { @@ -54,10 +56,9 @@ public void doHandle(StartTaskEvent event) { for (AbstractTask task : tasks) { if (event.getSuitableTypes().contains(task.getStartTaskTypeEnum())) { - LOGGER.info("[StartTaskEventHandler] start task:{}", task.getName()); executor.scheduleWithFixedDelay(task, task.getInitialDelay(), task.getDelay(), task.getTimeUnit()); - LOGGER.info("[StartTaskEventHandler] start task:{} success", task.getName()); + LOGGER_START.info("[StartTaskEventHandler] start task:{} success", task.getName()); } } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractServerHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractServerHandler.java index 34630ed39..ec7fd1432 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractServerHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractServerHandler.java @@ -30,23 +30,28 @@ */ public abstract class AbstractServerHandler implements ChannelHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractServerHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(AbstractServerHandler.class); + + private static final Logger LOGGER_CONNECT = LoggerFactory.getLogger("DATA-CONNECT"); + + private static final Logger LOGGER_EXCHANGE = LoggerFactory.getLogger("DATA-EXCHANGE"); @Override public void connected(Channel channel) throws RemotingException { if (channel != null && channel.isConnected()) { - LOGGER - .info(getConnectNodeType() + " node connected,remote address:" - + channel.getRemoteAddress() + " localAddress:" + channel.getLocalAddress()); + LOGGER_CONNECT.info(getConnectNodeType() + " node connected,remote address:" + + channel.getRemoteAddress() + " localAddress:" + + channel.getLocalAddress()); } } @Override public void disconnected(Channel channel) throws RemotingException { if (channel != null && !channel.isConnected()) { - LOGGER - .info(getConnectNodeType() + " node disconnected,remote address:" - + channel.getRemoteAddress() + " localAddress:" + channel.getLocalAddress()); + LOGGER_CONNECT.info(getConnectNodeType() + " node disconnected,remote address:" + + channel.getRemoteAddress() + " localAddress:" + + channel.getLocalAddress()); } } @@ -112,7 +117,6 @@ public Class interest() { * @param request */ protected void logRequest(Channel channel, T request) { - log(request.toString()); if (channel != null) { log(new StringBuilder("Remote:").append(channel.getRemoteAddress()).append(" Request:") .append(request).toString()); @@ -127,7 +131,7 @@ protected void logRequest(Channel channel, T request) { * @param log */ protected void log(String log) { - LOGGER.info(new StringBuilder("[").append(getClassName()).append("] ").append(log) + LOGGER_EXCHANGE.info(new StringBuilder("[").append(getClassName()).append("] ").append(log) .toString()); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java index dd1b2252d..ac94deb3e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java @@ -90,6 +90,11 @@ public Map> getMetaServerMap() { List connections = new ArrayList<>(connectionMap.values()); Collections.shuffle(connections); connection = connections.iterator().next(); + if (!connection.isFine()) { + connection = ((BoltChannel) metaNodeExchanger.connect(new URL(connection + .getRemoteIP(), dataServerBootstrapConfig.getMetaServerPort()))) + .getConnection(); + } } GetNodesRequest request = new GetNodesRequest(NodeType.META); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java index 8cdf7044e..fa870f910 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java @@ -45,6 +45,9 @@ public class DisconnectEventHandler implements InitializingBean, AfterWorkingPro private static final Logger LOGGER = LoggerFactory .getLogger(DisconnectEventHandler.class); + private static final Logger LOGGER_START = LoggerFactory + .getLogger("DATA-START-LOGS"); + /** * a DelayQueue that contains client disconnect events */ @@ -113,7 +116,6 @@ public int getOrder() { @Override public void afterPropertiesSet() { - LOGGER.info("begin start DisconnectEventHandler"); Executor executor = ExecutorFactory .newSingleThreadExecutor(DisconnectEventHandler.class.getSimpleName()); executor.execute(() -> { @@ -152,7 +154,7 @@ public void afterPropertiesSet() { } } }); - LOGGER.info("start DisconnectEventHandler success"); + LOGGER_START.info("start DisconnectEventHandler success"); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java index 6f41e1f95..2340fa18d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.net.NetUtil; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.ChannelHandler; @@ -26,6 +27,10 @@ import org.springframework.beans.factory.annotation.Autowired; /** + * + * Connection handler for session connect data server + * + * fix shangyu.wh * @author xuanbei * @since 2019/2/15 */ @@ -52,7 +57,7 @@ public void disconnected(Channel channel) throws RemotingException { @Override protected Node.NodeType getConnectNodeType() { - return Node.NodeType.DATA; + return NodeType.SESSION; } @Override diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index eab8360d6..f64cde75d 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -173,6 +173,46 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-connect.log + + ${DATA_LOG_HOME}/registry-connect.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-exchange.log + + ${DATA_LOG_HOME}/registry-exchange.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -198,7 +238,7 @@ - @@ -214,6 +254,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java index 6a35b4b7a..981c1a19e 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java @@ -58,6 +58,8 @@ public class RaftExchanger { private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("META-JRAFT-METRICS"); + private static final Logger LOGGER_START = LoggerFactory.getLogger("META-START-LOGS"); + @Autowired private MetaServerConfig metaServerConfig; @@ -93,9 +95,9 @@ public void startRaftServer(final ExecutorManager executorManager) { raftServer.setLeaderProcessListener(new LeaderProcessListener() { @Override public void startProcess() { - LOGGER.info("Start leader process..."); + LOGGER_START.info("Start leader process..."); executorManager.startScheduler(); - LOGGER.info("Initialize server scheduler success!"); + LOGGER_START.info("Initialize server scheduler success!"); PeerId leader = new PeerId(NetUtil.getLocalAddress().getHostAddress(), metaServerConfig.getRaftServerPort()); raftServer.sendNotify(leader, "leader"); @@ -104,9 +106,9 @@ public void startProcess() { @Override public void stopProcess() { - LOGGER.info("Stop leader process..."); + LOGGER_START.info("Stop leader process..."); executorManager.stopScheduler(); - LOGGER.info("Stop server scheduler success!"); + LOGGER_START.info("Stop server scheduler success!"); PeerId leader = new PeerId(NetUtil.getLocalAddress().getHostAddress(), metaServerConfig.getRaftServerPort()); raftServer.sendNotify(leader, "leader"); @@ -116,14 +118,14 @@ public void stopProcess() { raftServer.setFollowerProcessListener(new FollowerProcessListener() { @Override public void startProcess(PeerId leader) { - LOGGER.info("Start follower process leader {}...", leader); + LOGGER_START.info("Start follower process leader {}...", leader); raftServer.sendNotify(leader, "follower"); registerCurrentNode(); } @Override public void stopProcess(PeerId leader) { - LOGGER.info("Stop follower process leader {}...", leader); + LOGGER_START.info("Stop follower process leader {}...", leader); raftServer.sendNotify(leader, "follower"); } }); @@ -136,7 +138,7 @@ public void stopProcess(PeerId leader) { } } catch (Exception e) { serverStart.set(false); - LOGGER.error("Start raft server error!", e); + LOGGER_START.error("Start raft server error!", e); throw new RuntimeException("Start raft server error!", e); } } @@ -160,7 +162,7 @@ public void startRaftClient() { } } catch (Exception e) { clientStart.set(false); - LOGGER.error("Start raft client error!", e); + LOGGER_START.error("Start raft client error!", e); throw new RuntimeException("Start raft client error!", e); } } @@ -174,7 +176,7 @@ public void startCliService() { cliService = new CliServiceImpl(); cliService.init(new CliOptions()); } catch (Exception e) { - LOGGER.error("Start raft cliService error!", e); + LOGGER_START.error("Start raft cliService error!", e); throw new RuntimeException("Start raft cliService error!", e); } } @@ -190,7 +192,7 @@ private void registerCurrentNode() { metaServerRegistry.register(new MetaNode(new URL(ip, 0), nodeConfig .getLocalDataCenter())); } else { - LOGGER.error( + LOGGER_START.error( "Register CurrentNode fail!meta node list config not contains current ip {}", ip); throw new RuntimeException( diff --git a/server/server/meta/src/main/resources/logback-spring.xml b/server/server/meta/src/main/resources/logback-spring.xml index 9251cda98..6294f4dcf 100644 --- a/server/server/meta/src/main/resources/logback-spring.xml +++ b/server/server/meta/src/main/resources/logback-spring.xml @@ -213,6 +213,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/server/server/session/src/main/resources/logback-spring.xml b/server/server/session/src/main/resources/logback-spring.xml index 7df0a5104..96f141a5b 100644 --- a/server/server/session/src/main/resources/logback-spring.xml +++ b/server/server/session/src/main/resources/logback-spring.xml @@ -291,6 +291,12 @@ + + + + + + From 1b9f0e6590ae11eb4ff90786b85fc87c02263e1f Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 28 May 2019 14:20:31 +0800 Subject: [PATCH 019/161] add send sub log --- .../session/scheduler/task/DataChangeFetchTask.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 17cd49982..adcb1a7e4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -111,6 +111,11 @@ public void execute() { Collection subscribersSend = subscribersVersionCheck(subscriberMap .values()); if (subscribersSend.isEmpty()) { + LOGGER + .warn( + "Subscribers send empty,which dataInfoId:{} on dataCenter:{},scope:{}", + dataChangeRequest.getDataInfoId(), + dataChangeRequest.getDataCenter(), scopeEnum); continue; } @@ -158,6 +163,11 @@ public void execute() { } } } + } else { + LOGGER.warn( + "Get subscriber data empty,which dataInfoId:{} on dataCenter:{},scope:{}", + dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter(), + scopeEnum); } } From 6c829ef3cb33f3c8c16189d5d1f1253439bf5390 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 28 May 2019 22:06:12 +0800 Subject: [PATCH 020/161] fix subscriber to send log --- .../scheduler/task/DataChangeFetchTask.java | 15 ++++++++------- .../registry/server/session/store/Interests.java | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index adcb1a7e4..8a95b8548 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -103,6 +103,11 @@ public void execute() { for (ScopeEnum scopeEnum : ScopeEnum.values()) { Map> map = getCache(scopeEnum); if (map != null && !map.isEmpty()) { + LOGGER + .info( + "Get all subscribers to send from cache size:{},which dataInfoId:{} on dataCenter:{},scope:{}", + map.size(), dataChangeRequest.getDataInfoId(), + dataChangeRequest.getDataCenter(), scopeEnum); for (Entry> entry : map.entrySet()) { Map subscriberMap = entry.getValue(); if (subscriberMap != null && !subscriberMap.isEmpty()) { @@ -113,9 +118,10 @@ public void execute() { if (subscribersSend.isEmpty()) { LOGGER .warn( - "Subscribers send empty,which dataInfoId:{} on dataCenter:{},scope:{}", + "Subscribers to send empty,which dataInfoId:{} on dataCenter:{},scope:{},address:{},size:{}", dataChangeRequest.getDataInfoId(), - dataChangeRequest.getDataCenter(), scopeEnum); + dataChangeRequest.getDataCenter(), scopeEnum, + entry.getKey(), subscriberMap.size()); continue; } @@ -163,11 +169,6 @@ public void execute() { } } } - } else { - LOGGER.warn( - "Get subscriber data empty,which dataInfoId:{} on dataCenter:{},scope:{}", - dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter(), - scopeEnum); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java index 61baf6da2..e3c0b65c1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java @@ -70,7 +70,7 @@ public interface Interests extends DataManager { Collection getInterestDataInfoIds(); /** - * get subscribers whith specify dataInfo and scope,and order by source InetSocketAddress + * get subscribers whith specify dataInfo and scope,and group by source InetSocketAddress * @param dataInfoId * @param scope * @return From d6d53d5fbe6c1517f286f78d1d32b154d38c70d9 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 16:33:50 +0800 Subject: [PATCH 021/161] bugfix: https://github.com/sofastack/sofa-registry/issues/27 --- .../server/data/resource/HealthResource.java | 33 ++++++++++++++----- .../server/meta/resource/HealthResource.java | 24 +++++++++----- .../session/resource/HealthResource.java | 22 +++++++++---- 3 files changed, 55 insertions(+), 24 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java index c61a8bcf8..476e64ee7 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java @@ -16,16 +16,20 @@ */ package com.alipay.sofa.registry.server.data.resource; -import com.alipay.sofa.registry.common.model.CommonResponse; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerBootstrap; -import com.alipay.sofa.registry.server.data.node.DataNodeStatus; -import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; -import org.springframework.beans.factory.annotation.Autowired; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerBootstrap; +import com.alipay.sofa.registry.server.data.node.DataNodeStatus; +import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; /** * @@ -44,9 +48,11 @@ public class HealthResource { @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) - public CommonResponse checkHealth() { + public Response checkHealth() { - CommonResponse response; + ResponseBuilder builder = Response.status(Response.Status.OK); + + CommonResponse response; StringBuilder sb = new StringBuilder("DataServerBoot "); @@ -76,6 +82,15 @@ public CommonResponse checkHealth() { response = CommonResponse.buildFailedResponse(sb.toString()); } - return response; + if (ret) { + response = CommonResponse.buildSuccessResponse(sb.toString()); + builder.entity(response); + } else { + response = CommonResponse.buildFailedResponse(sb.toString()); + builder.entity(response); + builder.status(Status.INTERNAL_SERVER_ERROR); + } + + return builder.build(); } } \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java index 8e6970390..f67a1263b 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java @@ -16,16 +16,20 @@ */ package com.alipay.sofa.registry.server.meta.resource; -import com.alipay.sofa.registry.common.model.CommonResponse; -import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; -import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerBootstrap; -import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; -import org.springframework.beans.factory.annotation.Autowired; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; +import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerBootstrap; +import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; /** * @@ -44,7 +48,8 @@ public class HealthResource { @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) - public CommonResponse checkHealth() { + public Response checkHealth() { + ResponseBuilder builder = Response.status(Response.Status.OK); CommonResponse response; @@ -93,10 +98,13 @@ public CommonResponse checkHealth() { if (ret) { response = CommonResponse.buildSuccessResponse(sb.toString()); + builder.entity(response); } else { response = CommonResponse.buildFailedResponse(sb.toString()); + builder.entity(response); + builder.status(Status.INTERNAL_SERVER_ERROR); } - return response; + return builder.build(); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java index 37afbd6c2..ba6a4316d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java @@ -16,15 +16,19 @@ */ package com.alipay.sofa.registry.server.session.resource; -import com.alipay.sofa.registry.common.model.CommonResponse; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerBootstrap; -import com.alipay.sofa.registry.server.session.node.RaftClientManager; -import org.springframework.beans.factory.annotation.Autowired; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import javax.ws.rs.core.Response.Status; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerBootstrap; +import com.alipay.sofa.registry.server.session.node.RaftClientManager; /** * @@ -43,7 +47,8 @@ public class HealthResource { @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) - public CommonResponse checkHealth() { + public Response checkHealth() { + ResponseBuilder builder = Response.status(Response.Status.OK); CommonResponse response; @@ -75,10 +80,13 @@ public CommonResponse checkHealth() { if (ret) { response = CommonResponse.buildSuccessResponse(sb.toString()); + builder.entity(response); } else { response = CommonResponse.buildFailedResponse(sb.toString()); + builder.entity(response); + builder.status(Status.INTERNAL_SERVER_ERROR); } - return response; + return builder.build(); } } \ No newline at end of file From cdc582bd8f63acc06a4bc34d2ad9b17b5ef25588 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 17:17:43 +0800 Subject: [PATCH 022/161] bugfix: https://github.com/sofastack/sofa-registry/issues/27 --- .../sofa/registry/server/data/resource/HealthResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java index 476e64ee7..ab4af5c62 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java @@ -52,7 +52,7 @@ public Response checkHealth() { ResponseBuilder builder = Response.status(Response.Status.OK); - CommonResponse response; + CommonResponse response; StringBuilder sb = new StringBuilder("DataServerBoot "); From d9efee54b21c5cffd113cd0de78b2cfd605b7b7f Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 17:45:38 +0800 Subject: [PATCH 023/161] feature: Add monitoring logs https://github.com/sofastack/sofa-registry/issues/29 --- .../sofa/registry/metrics/ReporterUtils.java | 50 +++++++++++++------ .../alipay/sofa/registry/remoting/Server.java | 6 ++- .../registry/remoting/bolt/BoltServer.java | 25 ++++++---- .../remoting/jersey/JerseyJettyServer.java | 37 ++++++++------ .../server/data/resource/HealthResource.java | 26 ++++++++-- .../src/main/resources/logback-spring.xml | 26 ++++++++++ .../bootstrap/AbstractNodeConfigBean.java | 9 ++-- .../server/meta/resource/HealthResource.java | 26 ++++++++-- .../meta/resource/MetaDigestResource.java | 34 +++++++++---- .../src/main/resources/logback-spring.xml | 26 ++++++++++ .../session/resource/HealthResource.java | 26 ++++++++-- .../resource/SessionDigestResource.java | 45 +++++++++++------ .../timertask/SyncClientsHeartbeatTask.java | 34 +++++++++---- .../src/main/resources/logback-spring.xml | 25 ++++++++++ 14 files changed, 298 insertions(+), 97 deletions(-) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java b/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java index fb5f24e36..045678ace 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java @@ -1,27 +1,32 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright Notice: This software is developed by Ant Small and Micro Financial Services Group Co., Ltd. This software and + * all the relevant information, including but not limited to any signs, images, photographs, animations, text, + * interface design, audios and videos, and printed materials, are protected by copyright laws and other intellectual + * property laws and treaties. * - * http://www.apache.org/licenses/LICENSE-2.0 + * The use of this software shall abide by the laws and regulations as well as Software Installation License + * Agreement/Software Use Agreement updated from time to time. Without authorization from Ant Small and Micro Financial + * Services Group Co., Ltd., no one may conduct the following actions: * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * 1) reproduce, spread, present, set up a mirror of, upload, download this software; + * + * 2) reverse engineer, decompile the source code of this software or try to find the source code in any other ways; + * + * 3) modify, translate and adapt this software, or develop derivative products, works, and services based on this + * software; + * + * 4) distribute, lease, rent, sub-license, demise or transfer any rights in relation to this software, or authorize + * the reproduction of this software on other’s computers. */ package com.alipay.sofa.registry.metrics; +import java.util.concurrent.TimeUnit; + import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Slf4jReporter; -import java.util.concurrent.TimeUnit; - /** * * @author shangyu.wh @@ -29,6 +34,8 @@ */ public class ReporterUtils { + private static final Logger METRIC_LOGGER = LoggerFactory.getLogger("REGISTRY-METRICS"); + /** * start slf4j reporter * @param period @@ -37,8 +44,10 @@ public class ReporterUtils { */ public static void startSlf4jReporter(long period, MetricRegistry registry, Logger loggerMetrics) { Slf4jReporter reporter = Slf4jReporter.forRegistry(registry) - .outputTo((org.slf4j.Logger) loggerMetrics.getLogger()) - .convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); + .outputTo((org.slf4j.Logger) loggerMetrics.getLogger()) + .convertRatesTo(TimeUnit.SECONDS) + .convertDurationsTo(TimeUnit.MILLISECONDS) + .build(); if (period > 0) { reporter.start(period, TimeUnit.SECONDS); } else { @@ -46,4 +55,13 @@ public static void startSlf4jReporter(long period, MetricRegistry registry, Logg } } + + /** + * start slf4j reporter + * @param period + * @param registry + */ + public static void startSlf4jReporter(long period, MetricRegistry registry) { + startSlf4jReporter(period, registry, METRIC_LOGGER); + } } \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java index 7452bb4f4..900bedbcd 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java @@ -16,11 +16,11 @@ */ package com.alipay.sofa.registry.remoting; -import com.alipay.sofa.registry.common.model.store.URL; - import java.net.InetSocketAddress; import java.util.Collection; +import com.alipay.sofa.registry.common.model.store.URL; + /** * * @author shangyu.wh @@ -57,4 +57,6 @@ public interface Server extends Endpoint { * @return channel */ Channel getChannel(URL url); + + int getChannelCount(); } \ No newline at end of file diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java index e9fc9ed38..93951de5a 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.remoting.bolt; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventType; import com.alipay.remoting.InvokeCallback; @@ -33,16 +43,6 @@ import com.alipay.sofa.registry.remoting.ChannelHandler.InvokeType; import com.alipay.sofa.registry.remoting.Server; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; - /** * * @author shangyu.wh @@ -342,4 +342,9 @@ public void removeChannel(Channel channel) { public RpcServer getRpcServer() { return boltServer; } + + @Override + public int getChannelCount(){ + return channels.size(); + } } \ No newline at end of file diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java index 680384881..9907c2f31 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java @@ -16,14 +16,15 @@ */ package com.alipay.sofa.registry.remoting.jersey; -import com.alipay.sofa.registry.common.model.store.URL; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.remoting.CallbackHandler; -import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.ChannelHandler; -import com.alipay.sofa.registry.remoting.Server; -import com.alipay.sofa.registry.remoting.jersey.jetty.server.HttpConnectionCustomFactory; +import java.net.InetSocketAddress; +import java.net.URI; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.ws.rs.ProcessingException; + import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.thread.QueuedThreadPool; @@ -35,13 +36,14 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spi.Container; -import javax.ws.rs.ProcessingException; -import java.net.InetSocketAddress; -import java.net.URI; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicBoolean; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.CallbackHandler; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.ChannelHandler; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.jersey.jetty.server.HttpConnectionCustomFactory; /** * @@ -224,4 +226,9 @@ public URI getBaseUri() { return baseUri; } + @Override + public int getChannelCount() { + return 0; + } + } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java index ab4af5c62..99e867c8a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/HealthResource.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.data.resource; +import javax.annotation.PostConstruct; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -27,9 +28,12 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.metrics.ReporterUtils; import com.alipay.sofa.registry.server.data.bootstrap.DataServerBootstrap; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; /** * @@ -45,13 +49,29 @@ public class HealthResource { @Autowired private DataNodeStatus dataNodeStatus; + @PostConstruct + public void init() { + MetricRegistry metrics = new MetricRegistry(); + metrics.register("healthCheck", (Gauge) () -> getHealthCheckResult()); + ReporterUtils.startSlf4jReporter(60, metrics); + } + @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) public Response checkHealth() { ResponseBuilder builder = Response.status(Response.Status.OK); + CommonResponse response = getHealthCheckResult(); + builder.entity(response); + if (!response.isSuccess()) { + builder.status(Status.INTERNAL_SERVER_ERROR); + } + + return builder.build(); + } + private CommonResponse getHealthCheckResult() { CommonResponse response; StringBuilder sb = new StringBuilder("DataServerBoot "); @@ -84,13 +104,9 @@ public Response checkHealth() { if (ret) { response = CommonResponse.buildSuccessResponse(sb.toString()); - builder.entity(response); } else { response = CommonResponse.buildFailedResponse(sb.toString()); - builder.entity(response); - builder.status(Status.INTERNAL_SERVER_ERROR); } - - return builder.build(); + return response; } } \ No newline at end of file diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index f64cde75d..fe4dcb027 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -213,6 +213,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-metrics.log + + ${DATA_LOG_HOME}/registry-metrics.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -281,6 +301,12 @@ + + + + + + diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java index 430e29b45..ddcb5e4b5 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/AbstractNodeConfigBean.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.net.NetUtil; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -29,6 +25,10 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.net.NetUtil; + /** * * @author shangyu.wh @@ -105,7 +105,6 @@ public String getMetaDataCenter(String metaIpAddress) { } }); - dataCenterRet = ret.get(); } return dataCenterRet; diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java index f67a1263b..e284a05d9 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.meta.resource; +import javax.annotation.PostConstruct; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -28,8 +29,11 @@ import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; +import com.alipay.sofa.registry.metrics.ReporterUtils; import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerBootstrap; import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; /** * @@ -45,12 +49,28 @@ public class HealthResource { @Autowired private RaftExchanger raftExchanger; + @PostConstruct + public void init() { + MetricRegistry metrics = new MetricRegistry(); + metrics.register("healthCheck", (Gauge) () -> getHealthCheckResult()); + ReporterUtils.startSlf4jReporter(60, metrics); + } + @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) public Response checkHealth() { ResponseBuilder builder = Response.status(Response.Status.OK); + CommonResponse response = getHealthCheckResult(); + builder.entity(response); + if (!response.isSuccess()) { + builder.status(Status.INTERNAL_SERVER_ERROR); + } + + return builder.build(); + } + private CommonResponse getHealthCheckResult() { CommonResponse response; StringBuilder sb = new StringBuilder("MetaServerBoot "); @@ -98,13 +118,9 @@ public Response checkHealth() { if (ret) { response = CommonResponse.buildSuccessResponse(sb.toString()); - builder.entity(response); } else { response = CommonResponse.buildFailedResponse(sb.toString()); - builder.entity(response); - builder.status(Status.INTERNAL_SERVER_ERROR); } - - return builder.build(); + return response; } } \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/MetaDigestResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/MetaDigestResource.java index 538614f15..42211be7c 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/MetaDigestResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/MetaDigestResource.java @@ -16,26 +16,32 @@ */ package com.alipay.sofa.registry.server.meta.resource; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.console.PersistenceData; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.metrics.ReporterUtils; import com.alipay.sofa.registry.server.meta.registry.Registry; import com.alipay.sofa.registry.store.api.DBResponse; import com.alipay.sofa.registry.store.api.DBService; import com.alipay.sofa.registry.store.api.OperationStatus; import com.alipay.sofa.registry.store.api.annotation.RaftReference; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; /** * @@ -57,6 +63,16 @@ public class MetaDigestResource { @RaftReference private DBService persistenceDataDBService; + @PostConstruct + public void init() { + MetricRegistry metrics = new MetricRegistry(); + metrics.register("metaNodeList", (Gauge) () -> getRegisterNodeByType("meta")); + metrics.register("dataNodeList", (Gauge) () -> getRegisterNodeByType("data")); + metrics.register("sessionNodeList", (Gauge) () -> getRegisterNodeByType("session")); + metrics.register("pushSwitch", (Gauge) () -> getPushSwitch()); + ReporterUtils.startSlf4jReporter(60, metrics); + } + @GET @Path("{type}/node/query") @Produces(MediaType.APPLICATION_JSON) diff --git a/server/server/meta/src/main/resources/logback-spring.xml b/server/server/meta/src/main/resources/logback-spring.xml index 6294f4dcf..0d5cb2faa 100644 --- a/server/server/meta/src/main/resources/logback-spring.xml +++ b/server/server/meta/src/main/resources/logback-spring.xml @@ -173,6 +173,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${META_LOG_HOME}/registry-metrics.log + + ${META_LOG_HOME}/registry-metrics.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -231,6 +251,12 @@ + + + + + + diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java index ba6a4316d..648acd736 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/HealthResource.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.session.resource; +import javax.annotation.PostConstruct; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -27,8 +28,11 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.metrics.ReporterUtils; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerBootstrap; import com.alipay.sofa.registry.server.session.node.RaftClientManager; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; /** * @@ -44,12 +48,28 @@ public class HealthResource { @Autowired private SessionServerBootstrap sessionServerBootstrap; + @PostConstruct + public void init() { + MetricRegistry metrics = new MetricRegistry(); + metrics.register("healthCheck", (Gauge) () -> getHealthCheckResult()); + ReporterUtils.startSlf4jReporter(60, metrics); + } + @GET @Path("check") @Produces(MediaType.APPLICATION_JSON) public Response checkHealth() { ResponseBuilder builder = Response.status(Response.Status.OK); + CommonResponse response = getHealthCheckResult(); + builder.entity(response); + if (!response.isSuccess()) { + builder.status(Status.INTERNAL_SERVER_ERROR); + } + + return builder.build(); + } + private CommonResponse getHealthCheckResult() { CommonResponse response; StringBuilder sb = new StringBuilder("SessionServerBoot "); @@ -80,13 +100,9 @@ public Response checkHealth() { if (ret) { response = CommonResponse.buildSuccessResponse(sb.toString()); - builder.entity(response); } else { response = CommonResponse.buildFailedResponse(sb.toString()); - builder.entity(response); - builder.status(Status.INTERNAL_SERVER_ERROR); } - - return builder.build(); + return response; } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java index 3bb5e1110..c8c9d071b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionDigestResource.java @@ -16,12 +16,32 @@ */ package com.alipay.sofa.registry.server.session.resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.StoreData; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.Watcher; +import com.alipay.sofa.registry.metrics.ReporterUtils; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; @@ -29,22 +49,8 @@ import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; /** * @@ -87,6 +93,13 @@ public class SessionDigestResource { private final static String META = "META"; + @PostConstruct + public void init() { + MetricRegistry metrics = new MetricRegistry(); + metrics.register("pushSwitch", (Gauge) () -> getPushSwitch()); + ReporterUtils.startSlf4jReporter(60, metrics); + } + @GET @Path("{type}/data/query") @Produces(MediaType.APPLICATION_JSON) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java index 7f2d58464..a2633189c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java @@ -16,9 +16,20 @@ */ package com.alipay.sofa.registry.server.session.scheduler.timertask; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ThreadPoolExecutor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.metrics.TaskMetrics; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.listener.ReceivedDataMultiPushTaskListener; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -30,13 +41,6 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; - -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ThreadPoolExecutor; /** * The type Sync clients heartbeat task. @@ -57,6 +61,12 @@ public class SyncClientsHeartbeatTask { public static final String SYMBOLIC1 = " ├─ "; public static final String SYMBOLIC2 = " └─ "; + @Autowired + private Exchange boltExchange; + + @Autowired + private SessionServerConfig sessionServerConfig; + /** * store subscribers */ @@ -87,8 +97,14 @@ public void syncCounte() { long countPub = sessionDataStore.count(); long countSubW = sessionWatchers.count(); - CONSOLE_COUNT_LOGGER.info("Subscriber count: {}, Publisher count: {}, Watcher count: {},", - countSub, countPub, countSubW); + int channelCount = 0; + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + if (sessionServer != null) { + channelCount = sessionServer.getChannelCount(); + } + + CONSOLE_COUNT_LOGGER.info("Subscriber count: {}, Publisher count: {}, Watcher count: {}, Connection count: {}", + countSub, countPub, countSubW, channelCount); } @Scheduled(initialDelayString = "${session.server.printTask.fixedDelay}", fixedDelayString = "${session.server.printTask.fixedDelay}") diff --git a/server/server/session/src/main/resources/logback-spring.xml b/server/server/session/src/main/resources/logback-spring.xml index 96f141a5b..48d7db9f3 100644 --- a/server/server/session/src/main/resources/logback-spring.xml +++ b/server/server/session/src/main/resources/logback-spring.xml @@ -241,6 +241,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${SESSION_LOG_HOME}/registry-metrics.log + + ${SESSION_LOG_HOME}/registry-metrics.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -297,6 +317,11 @@ + + + + + From 1c1d6420b01a032df1cf8a32c2651e49e6baf5c9 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 17:48:59 +0800 Subject: [PATCH 024/161] feature: Add monitoring logs https://github.com/sofastack/sofa-registry/issues/29 (1) bugfix CommonResponse (2) format --- .../registry/common/model/CommonResponse.java | 12 +++++++ .../sofa/registry/metrics/ReporterUtils.java | 34 ++++++++----------- .../registry/remoting/bolt/BoltServer.java | 2 +- .../timertask/SyncClientsHeartbeatTask.java | 9 ++--- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/CommonResponse.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/CommonResponse.java index e85455adf..72f7d5591 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/CommonResponse.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/CommonResponse.java @@ -108,4 +108,16 @@ public String getMessage() { public void setMessage(String message) { this.message = message; } + + /** + * @see Object#toString() + */ + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("CommonResponse{"); + sb.append("success=").append(success); + sb.append(", message='").append(message).append('\''); + sb.append('}'); + return sb.toString(); + } } \ No newline at end of file diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java b/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java index 045678ace..7cc79bc33 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/metrics/ReporterUtils.java @@ -1,22 +1,18 @@ /* - * Copyright Notice: This software is developed by Ant Small and Micro Financial Services Group Co., Ltd. This software and - * all the relevant information, including but not limited to any signs, images, photographs, animations, text, - * interface design, audios and videos, and printed materials, are protected by copyright laws and other intellectual - * property laws and treaties. + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * The use of this software shall abide by the laws and regulations as well as Software Installation License - * Agreement/Software Use Agreement updated from time to time. Without authorization from Ant Small and Micro Financial - * Services Group Co., Ltd., no one may conduct the following actions: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1) reproduce, spread, present, set up a mirror of, upload, download this software; - * - * 2) reverse engineer, decompile the source code of this software or try to find the source code in any other ways; - * - * 3) modify, translate and adapt this software, or develop derivative products, works, and services based on this - * software; - * - * 4) distribute, lease, rent, sub-license, demise or transfer any rights in relation to this software, or authorize - * the reproduction of this software on other’s computers. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.alipay.sofa.registry.metrics; @@ -44,10 +40,8 @@ public class ReporterUtils { */ public static void startSlf4jReporter(long period, MetricRegistry registry, Logger loggerMetrics) { Slf4jReporter reporter = Slf4jReporter.forRegistry(registry) - .outputTo((org.slf4j.Logger) loggerMetrics.getLogger()) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.MILLISECONDS) - .build(); + .outputTo((org.slf4j.Logger) loggerMetrics.getLogger()) + .convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); if (period > 0) { reporter.start(period, TimeUnit.SECONDS); } else { diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java index 93951de5a..af2c3d71a 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java @@ -344,7 +344,7 @@ public RpcServer getRpcServer() { } @Override - public int getChannelCount(){ + public int getChannelCount() { return channels.size(); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java index a2633189c..1b8d77973 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/timertask/SyncClientsHeartbeatTask.java @@ -62,7 +62,7 @@ public class SyncClientsHeartbeatTask { public static final String SYMBOLIC2 = " └─ "; @Autowired - private Exchange boltExchange; + private Exchange boltExchange; @Autowired private SessionServerConfig sessionServerConfig; @@ -97,14 +97,15 @@ public void syncCounte() { long countPub = sessionDataStore.count(); long countSubW = sessionWatchers.count(); - int channelCount = 0; + int channelCount = 0; Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); if (sessionServer != null) { channelCount = sessionServer.getChannelCount(); } - CONSOLE_COUNT_LOGGER.info("Subscriber count: {}, Publisher count: {}, Watcher count: {}, Connection count: {}", - countSub, countPub, countSubW, channelCount); + CONSOLE_COUNT_LOGGER.info( + "Subscriber count: {}, Publisher count: {}, Watcher count: {}, Connection count: {}", + countSub, countPub, countSubW, channelCount); } @Scheduled(initialDelayString = "${session.server.printTask.fixedDelay}", fixedDelayString = "${session.server.printTask.fixedDelay}") From 4765efe7871702ed2ceee60958189e31bad2b451 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 18:41:35 +0800 Subject: [PATCH 025/161] bugfix: During meta startup, leader may not register itself https://github.com/sofastack/sofa-registry/issues/30 --- .../server/meta/remoting/RaftExchanger.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java index 981c1a19e..6fb868934 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.meta.remoting; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.jraft.CliService; import com.alipay.sofa.jraft.Status; import com.alipay.sofa.jraft.conf.Configuration; @@ -38,14 +47,6 @@ import com.alipay.sofa.registry.server.meta.bootstrap.NodeConfig; import com.alipay.sofa.registry.server.meta.executor.ExecutorManager; import com.alipay.sofa.registry.server.meta.registry.Registry; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; /** * @@ -100,8 +101,9 @@ public void startProcess() { LOGGER_START.info("Initialize server scheduler success!"); PeerId leader = new PeerId(NetUtil.getLocalAddress().getHostAddress(), metaServerConfig.getRaftServerPort()); - raftServer.sendNotify(leader, "leader"); + // refer: https://github.com/sofastack/sofa-registry/issues/30 registerCurrentNode(); + raftServer.sendNotify(leader, "leader"); } @Override From 9e2a59733f5e38e1dacfbdfe719f48dd9a4cc8bf Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 18:57:43 +0800 Subject: [PATCH 026/161] bugfix: Sometimes receive "Not leader" response from leader in OnStartingFollowing() https://github.com/sofastack/sofa-registry/issues/31 --- .../disconnect/DisconnectEventHandler.java | 25 +++++++++++-------- .../server/meta/remoting/RaftExchanger.java | 8 +++++- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java index fa870f910..be8303982 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; @@ -26,15 +36,6 @@ import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.DelayQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; /** * @author qian.lqlq @@ -95,7 +96,11 @@ public void receive(DisconnectEvent event) { public void afterWorkingProcess() { try { - //sleep for sync all done + /* + * After the snapshot data is synchronized during startup, it is queued and then placed asynchronously into + * DatumCache. When the notification becomes WORKING, there may be data in the queue that is not executed + * to DatumCache. So it need to sleep for a while. + */ TimeUnit.MILLISECONDS.sleep(BLOCK_FOR_ALL_SYNC); while (!noWorkQueue.isEmpty()) { diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java index 6fb868934..f64c15ced 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java @@ -121,8 +121,14 @@ public void stopProcess() { @Override public void startProcess(PeerId leader) { LOGGER_START.info("Start follower process leader {}...", leader); - raftServer.sendNotify(leader, "follower"); + // refer: https://github.com/sofastack/sofa-registry/issues/31 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOGGER_START.error(e.getMessage(), e); + } registerCurrentNode(); + raftServer.sendNotify(leader, "follower"); } @Override From 875bf8867704f6c365cfb95b19b2e0398eb52c8a Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 29 May 2019 19:32:19 +0800 Subject: [PATCH 027/161] temp add --- .../change/event/DataChangeEventCenter.java | 6 +-- .../change/event/DataChangeEventQueue.java | 37 ++++++++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java index 58c5496e2..f36dc887f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.change.event; +import java.util.concurrent.atomic.AtomicBoolean; + import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; @@ -24,8 +26,6 @@ import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; -import java.util.concurrent.atomic.AtomicBoolean; - /** * * @author qian.lqlq @@ -118,7 +118,7 @@ public void sync(DataChangeTypeEnum changeType, DataSourceTypeEnum sourceType, D * @param key * @return */ - private int hash(String key) { + public int hash(String key) { if (queueCount > 1) { return Math.abs(key.hashCode() % queueCount); } else { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index 45e5cffab..760a5aba7 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.data.change.event; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.locks.ReentrantLock; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -31,14 +39,6 @@ import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; import com.google.common.collect.Interners; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.DelayQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.locks.ReentrantLock; - /** * a queue of DataChangeEvent * @@ -74,16 +74,21 @@ public class DataChangeEventQueue { private final ReentrantLock lock = new ReentrantLock(); + private final int queueIdx; + private DataServerConfig dataServerConfig; + private DataChangeEventCenter dataChangeEventCenter; + /** * constructor - * @param idx + * @param queueIdx * @param dataServerConfig */ - public DataChangeEventQueue(int idx, DataServerConfig dataServerConfig) { + public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig) { - this.name = String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), idx); + this.queueIdx = queueIdx; + this.name = String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), queueIdx); this.dataServerConfig = dataServerConfig; int queueSize = dataServerConfig.getQueueSize(); if (queueSize <= 0) { @@ -177,7 +182,7 @@ public void start() { handleDatum(dataChangeEvent.getChangeType(), dataChangeEvent.getSourceType(), dataChangeEvent.getDatum()); } else if (scope == DataChangeScopeEnum.CLIENT) { - handleHost((ClientChangeEvent) event); + handleClientOff((ClientChangeEvent) event); } } catch (Throwable e) { LOGGER.error("[{}] handle change event failed", getName(), e); @@ -187,13 +192,19 @@ public void start() { LOGGER.info("[{}] start DataChangeEventQueue success", getName()); } - private void handleHost(ClientChangeEvent event) { + private void handleClientOff(ClientChangeEvent event) { String clientHost = event.getHost(); synchronized (Interners.newWeakInterner().intern(clientHost)) { Map pubMap = DatumCache.getByHost(clientHost); if (pubMap != null && !pubMap.isEmpty()) { int count = 0; for (Publisher publisher : pubMap.values()) { + // Only care dataInfoIds which belong to this queue + int queueIdx = this.dataChangeEventCenter.hash(publisher.getDataInfoId()); + if(this.queueIdx != queueIdx){ + continue; + } + DataServerNode dataServerNode = DataServerNodeFactory.computeDataServerNode( dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); //current dataCenter backup data need not unPub,it will be unPub by backup sync event From b1400d421df7fd3e86ff7dbdf550c717e9376b88 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 30 May 2019 11:22:38 +0800 Subject: [PATCH 028/161] add renew request --- .../common/model/DatumSnapshotRequest.java | 69 +++++++++++++++++++ .../common/model/ReNewDatumRequest.java | 64 +++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java create mode 100644 server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java new file mode 100644 index 000000000..2270f5c54 --- /dev/null +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.common.model; + +import com.alipay.sofa.registry.common.model.store.Publisher; + +import java.util.List; + +/** + * + * @author shangyu.wh + * @version $Id: DatumSnapshotRequest.java, v 0.1 2019-05-30 11:09 shangyu.wh Exp $ + */ +public class DatumSnapshotRequest { + + private final String connectId; + + private final String dataServerAddress; + + private final List publishers; + + public DatumSnapshotRequest(String connectId, String dataServerAddress, + List publishers) { + this.connectId = connectId; + this.dataServerAddress = dataServerAddress; + this.publishers = publishers; + } + + /** + * Getter method for property connectId. + * + * @return property value of connectId + */ + public String getConnectId() { + return connectId; + } + + /** + * Getter method for property dataServerAddress. + * + * @return property value of dataServerAddress + */ + public String getDataServerAddress() { + return dataServerAddress; + } + + /** + * Getter method for property publishers. + * + * @return property value of publishers + */ + public List getPublishers() { + return publishers; + } +} \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java new file mode 100644 index 000000000..bcd4e43fa --- /dev/null +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.common.model; + +/** + * + * @author shangyu.wh + * @version $Id: RenewRequest.java, v 0.1 2019-05-30 10:58 shangyu.wh Exp $ + */ +public class ReNewDatumRequest { + + private final String connectId; + + private final String dataServerAddress; + + private final String digestSum; + + public ReNewDatumRequest(String connectId, String dataServerAddress, String digestSum) { + this.connectId = connectId; + this.dataServerAddress = dataServerAddress; + this.digestSum = digestSum; + } + + /** + * Getter method for property connectId. + * + * @return property value of connectId + */ + public String getConnectId() { + return connectId; + } + + /** + * Getter method for property dataServerAddress. + * + * @return property value of dataServerAddress + */ + public String getDataServerAddress() { + return dataServerAddress; + } + + /** + * Getter method for property digestSum. + * + * @return property value of digestSum + */ + public String getDigestSum() { + return digestSum; + } +} \ No newline at end of file From 0539bab5f6136af00891e3c8e72a4c2e525572df Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 30 May 2019 21:20:30 +0800 Subject: [PATCH 029/161] data snapshot module --- .../change/event/DataChangeEventCenter.java | 12 +- .../change/event/DataChangeEventQueue.java | 75 ++++++++++-- .../change/event/DataChangeScopeEnum.java | 2 +- .../data/change/event/DatumSnapshotEvent.java | 75 ++++++++++++ .../sessionserver/forward/ForwardService.java | 3 +- .../forward/ForwardServiceImpl.java | 11 +- .../handler/DatumSnapshotHandler.java | 107 ++++++++++++++++++ .../sessionserver/handler/GetDataHandler.java | 17 +-- .../handler/PublishDataHandler.java | 15 +-- .../handler/UnPublishDataHandler.java | 5 +- 10 files changed, 285 insertions(+), 37 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java index f36dc887f..3383ad748 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java @@ -53,7 +53,7 @@ public void init(DataServerConfig config) { queueCount = config.getQueueCount(); dataChangeEventQueues = new DataChangeEventQueue[queueCount]; for (int idx = 0; idx < queueCount; idx++) { - dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, config); + dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, config, this); dataChangeEventQueues[idx].start(); } } @@ -101,6 +101,16 @@ public void onChange(ClientChangeEvent event) { } } + /** + * + * @param event + */ + public void onChange(DatumSnapshotEvent event) { + for (DataChangeEventQueue dataChangeEventQueue : dataChangeEventQueues) { + dataChangeEventQueue.onChange(event); + } + } + /** * * @param changeType diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index 02d602048..ffe4b4286 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -79,19 +79,19 @@ public class DataChangeEventQueue { private final ReentrantLock lock = new ReentrantLock(); - private final int queueIdx; + private final int queueIdx; private DataServerConfig dataServerConfig; - private DataChangeEventCenter dataChangeEventCenter; + private DataChangeEventCenter dataChangeEventCenter; /** * constructor * @param queueIdx * @param dataServerConfig */ - public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig) { - + public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig, + DataChangeEventCenter dataChangeEventCenter) { this.queueIdx = queueIdx; this.name = String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), queueIdx); this.dataServerConfig = dataServerConfig; @@ -103,6 +103,7 @@ public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig) { } this.notifyIntervalMs = dataServerConfig.getNotifyIntervalMs(); this.notifyTempDataIntervalMs = dataServerConfig.getNotifyTempDataIntervalMs(); + this.dataChangeEventCenter = dataChangeEventCenter; } /** @@ -182,21 +183,22 @@ public void start() { executor.execute(() -> { while (true) { try { - IDataChangeEvent event = eventQueue.take(); + IDataChangeEvent event = eventQueue.take(); DataChangeScopeEnum scope = event.getScope(); if (scope == DataChangeScopeEnum.DATUM) { DataChangeEvent dataChangeEvent = (DataChangeEvent) event; //Temporary push data will be notify as soon as,and not merge to normal pub data; - if (dataChangeEvent.getSourceType() == DataSourceTypeEnum.PUB_TEMP){ - addTempChangeData(dataChangeEvent.getDatum(),dataChangeEvent.getChangeType(), + if (dataChangeEvent.getSourceType() == DataSourceTypeEnum.PUB_TEMP) { + addTempChangeData(dataChangeEvent.getDatum(), dataChangeEvent.getChangeType(), dataChangeEvent.getSourceType()); - } - else { + } else { handleDatum(dataChangeEvent.getChangeType(), dataChangeEvent.getSourceType(), dataChangeEvent.getDatum()); } } else if (scope == DataChangeScopeEnum.CLIENT) { handleClientOff((ClientChangeEvent) event); + } else if (scope == DataChangeScopeEnum.SNAPSHOT) { + handleSnapshot((DatumSnapshotEvent) event); } } catch (Throwable e) { LOGGER.error("[{}] handle change event failed", getName(), e); @@ -216,8 +218,7 @@ private void handleClientOff(ClientChangeEvent event) { int count = 0; for (Publisher publisher : pubMap.values()) { // Only care dataInfoIds which belong to this queue - int queueIdx = this.dataChangeEventCenter.hash(publisher.getDataInfoId()); - if(this.queueIdx != queueIdx){ + if (!belongTo(publisher.getDataInfoId())) { continue; } @@ -283,6 +284,51 @@ private void handleDatum(DataChangeTypeEnum changeType, DataSourceTypeEnum sourc } } + private void handleSnapshot(DatumSnapshotEvent event) { + String clientHost = event.getHost(); + Map snapshotPubMap = event.getPubMap(); + synchronized (Interners.newWeakInterner().intern(clientHost)) { + Map pubMap = DatumCache.getByHost(clientHost); + LOGGER + .info("[{}] snapshot begin, host={}, old pub size={}, snapshot pub size={}", + getName(), clientHost, pubMap != null ? pubMap.size() : null, + snapshotPubMap.size()); + int unpubSize = 0; + if (pubMap != null) { + for (Publisher publisher : pubMap.values()) { + // Only care dataInfoIds which belong to this queue + if (!belongTo(publisher.getDataInfoId())) { + continue; + } + //backup datum do not need to unPub, it will be unPub by backup sync event + DataServerNode dataServerNode = DataServerNodeFactory.computeDataServerNode( + dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); + if (!DataServerConfig.IP.equals(dataServerNode.getIp())) { + continue; + } + + //If snapshot.pubMap does not contain this pub: then build the reverse operation as unpub + if (!snapshotPubMap.containsKey(publisher.getRegisterId())) { + long currentTimeStamp = System.currentTimeMillis(); + Datum datum = new Datum(new UnPublisher(publisher.getDataInfoId(), + publisher.getRegisterId(), currentTimeStamp), event.getDataCenter(), + currentTimeStamp); + datum.setContainsUnPub(true); + handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); + unpubSize++; + } + } + } + for (Publisher publisher : snapshotPubMap.values()) { + long currentTimeStamp = System.currentTimeMillis(); + Datum datum = new Datum(publisher, event.getDataCenter(), currentTimeStamp); + handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); + } + LOGGER.info("[{}] snapshot handle, host={}, handle unpub size={}, handle pub size={}", + getName(), clientHost, unpubSize, snapshotPubMap.size()); + } + } + private void addTempChangeData(Datum targetDatum, DataChangeTypeEnum changeType, DataSourceTypeEnum sourceType) { @@ -290,4 +336,11 @@ private void addTempChangeData(Datum targetDatum, DataChangeTypeEnum changeType, sourceType, changeType); CHANGE_QUEUE.put(tempChangeData); } + + /** + * Determine whether dataInfoId belongs to the current queue + */ + private boolean belongTo(String dataInfoId) { + return this.queueIdx == this.dataChangeEventCenter.hash(dataInfoId); + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeScopeEnum.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeScopeEnum.java index bfba719e5..94bbdb0d3 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeScopeEnum.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeScopeEnum.java @@ -22,5 +22,5 @@ * @version $Id: DataChangeScopeEnum.java, v 0.1 2018-05-10 16:51 qian.lqlq Exp $ */ public enum DataChangeScopeEnum { - CLIENT, DATUM + CLIENT, DATUM, SNAPSHOT } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java new file mode 100644 index 000000000..df3bef14f --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.change.event; + +import java.util.Map; + +import com.alipay.sofa.registry.common.model.store.Publisher; + +/** + * + * @author kezhu.wukz + * @version $Id: DatumSnapshotEvent.java, v 0.1 2019-05-30 18:22 kezhu.wukz Exp $ + */ +public class DatumSnapshotEvent implements IDataChangeEvent { + + /** connId, format is ip:port */ + private String host; + + private String dataCenter; + + private Map pubMap; + + public DatumSnapshotEvent(String host, String dataCenter, Map pubMap) { + this.host = host; + this.dataCenter = dataCenter; + this.pubMap = pubMap; + } + + /** + * Getter method for property host. + * + * @return property value of host + */ + public String getHost() { + return host; + } + + /** + * Getter method for property dataCenter. + * + * @return property value of dataCenter + */ + public String getDataCenter() { + return dataCenter; + } + + /** + * Getter method for property pubMap. + * + * @return property value of pubMap + */ + public Map getPubMap() { + return pubMap; + } + + @Override + public DataChangeScopeEnum getScope() { + return DataChangeScopeEnum.SNAPSHOT; + } + +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardService.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardService.java index 43931d46c..b896521fc 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardService.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardService.java @@ -28,10 +28,9 @@ public interface ForwardService { /** * Need forward boolean. * - * @param dataInfoId the data info id * @return the boolean */ - boolean needForward(String dataInfoId); + boolean needForward(); /** * Forward request object. diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java index 7228bc03d..1cf27fb53 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.forward; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.exception.RemotingException; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -28,9 +32,6 @@ import com.alipay.sofa.registry.server.data.remoting.DataNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; /** * The type Forward service. @@ -52,10 +53,10 @@ public class ForwardServiceImpl implements ForwardService { private DataNodeExchanger dataNodeExchanger; /** - * @see ForwardService#needForward(String) + * @see ForwardService#needForward() */ @Override - public boolean needForward(String dataInfoId) { + public boolean needForward() { return dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java new file mode 100644 index 000000000..f1f6b421b --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; + +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; +import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; +import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; + +/** + * handling snapshot request + * + * @author kezhu.wukz + * @version $Id: ClientOffProcessor.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ + */ +public class DatumSnapshotHandler extends AbstractServerHandler { + + /** LOGGER */ + private static final Logger LOGGER = LoggerFactory.getLogger(DatumSnapshotHandler.class); + + @Autowired + private ForwardService forwardService; + + @Autowired + private DataServerConfig dataServerBootstrapConfig; + + @Autowired + private DisconnectEventHandler disconnectEventHandler; + + @Autowired + private DataChangeEventCenter dataChangeEventCenter; + + @Autowired + private DataServerConfig dataServerConfig; + + @Override + public void checkParam(DatumSnapshotRequest request) throws RuntimeException { + // ParaCheckUtil.checkNotEmpty(request.getHosts(), "ClientOffRequest.hosts"); + } + + @Override + public Object doHandle(Channel channel, DatumSnapshotRequest request) { + if (forwardService.needForward()) { + LOGGER.warn("[forward] Snapshot request refused, request: {}", request); + CommonResponse response = new CommonResponse(); + response.setSuccess(false); + response.setMessage("Request refused, Server status is not working"); + return response; + } + + Map pubMap = request.getPublishers().stream().collect( + Collectors.toMap(p -> p.getRegisterId(), p -> p)); + dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), dataServerConfig + .getLocalDataCenter(), pubMap)); + + return CommonResponse.buildSuccessResponse(); + } + + @Override + public CommonResponse buildFailedResponse(String msg) { + return CommonResponse.buildFailedResponse(msg); + } + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + public Class interest() { + return ClientOffRequest.class; + } + + @Override + protected Node.NodeType getConnectNodeType() { + return Node.NodeType.DATA; + } +} diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java index 76682983e..a2a8e448f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -30,13 +38,6 @@ import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * processor to get specific data @@ -64,7 +65,7 @@ public void checkParam(GetDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, GetDataRequest request) { String dataInfoId = request.getDataInfoId(); - if (forwardService.needForward(dataInfoId)) { + if (forwardService.needForward()) { try { LOGGER.warn("[forward] Get data request forward, request: {}", request); return forwardService.forwardRequest(dataInfoId, request); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java index 94caad81e..1fa7d876e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublishType; @@ -32,12 +39,6 @@ import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * processor to publish data @@ -94,7 +95,7 @@ public void checkParam(PublishDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, PublishDataRequest request) { Publisher publisher = Publisher.processPublisher(request.getPublisher()); - if (forwardService.needForward(publisher.getDataInfoId())) { + if (forwardService.needForward()) { LOGGER.warn("[forward] Publish request refused, request: {}", request); CommonResponse response = new CommonResponse(); response.setSuccess(false); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 2a297ed6b..8662db602 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.UnPublishDataRequest; @@ -28,7 +30,6 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; /** * processor to unPublish specific data @@ -58,7 +59,7 @@ public void checkParam(UnPublishDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, UnPublishDataRequest request) { - if (forwardService.needForward(request.getDataInfoId())) { + if (forwardService.needForward()) { LOGGER.warn("[forward] UnPublish request refused, request: {}", request); CommonResponse response = new CommonResponse(); response.setSuccess(false); From 957b603231a06a2775c7869c05e3e643a4bb6bbd Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 31 May 2019 16:56:35 +0800 Subject: [PATCH 030/161] add calculate digest service --- .../common/model/PublisherDigest.java | 47 +++++++++ .../registry/timer/AsyncHashedWheelTimer.java | 2 +- .../correction/PublisherDigestService.java | 44 +++++++++ .../PublisherDigestServiceImpl.java | 95 +++++++++++++++++++ 4 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java new file mode 100644 index 000000000..24e55645b --- /dev/null +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.common.model; + +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.consistency.hash.MD5HashFunction; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicLong; + +/** + * + * @author shangyu.wh + * @version $Id: PublisherDigest.java, v 0.1 2019-05-30 20:58 shangyu.wh Exp $ + */ +public class PublisherDigest { + + public static Long getDigestValueSum(Collection publishers){ + AtomicLong digest = new AtomicLong(); + if(publishers != null && !publishers.isEmpty()) { + publishers.forEach(publisher -> digest.addAndGet(getDigestValue(publisher))); + } + return digest.get(); + } + + public static int getDigestValue(Publisher publisher) { + MD5HashFunction md5HashFunction = new MD5HashFunction(); + StringBuilder sb = new StringBuilder(); + sb.append(publisher.getRegisterId()).append(publisher.getVersion()) + .append(publisher.getRegisterTimestamp()); + return md5HashFunction.hash(sb.toString()); + } +} \ No newline at end of file diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java index f6cd4d206..675ed779b 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java @@ -92,7 +92,7 @@ public void run(Timeout timeout) throws Exception { } catch (RejectedExecutionException e) { taskFailedCallback.executionRejected(e); } catch (Throwable e) { - taskFailedCallback.executionRejected(e); + taskFailedCallback.executionFailed(e); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java new file mode 100644 index 000000000..ec3a8fa71 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +import com.alipay.sofa.registry.common.model.store.Publisher; + +import java.util.List; +import java.util.Map; + +/** + * + * @author shangyu.wh + * @version $Id: PublisherDigestService.java, v 0.1 2019-05-30 21:08 shangyu.wh Exp $ + */ +public interface PublisherDigestService { + + /** + * get session store all publisher digest sum group by dataServerAddress,at same client connectId + * @param connectId + * @return dataServerIp+digestValue + */ + Map getConnectDigest(String connectId); + + /** + * get session store all publishers group by dataServerAddress,at same client connectId + * @param connectId + * @return + */ + Map> getConnectSnapShot(String connectId); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java new file mode 100644 index 000000000..8ef886221 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.PublisherDigest; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.store.DataStore; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * + * @author shangyu.wh + * @version $Id: PublisherDigestServiceImpl.java, v 0.1 2019-05-30 21:17 shangyu.wh Exp $ + */ +public class PublisherDigestServiceImpl implements PublisherDigestService { + + private static final Logger LOGGER = LoggerFactory.getLogger(PublisherDigestServiceImpl.class); + + /** + * store publishers + */ + @Autowired + private DataStore sessionDataStore; + + /** + * calculate data node url + */ + @Autowired + private NodeManager dataNodeManager; + + @Override + public Map getConnectDigest(String connectId) { + + Map> connectIdPubs = getConnectSnapShot(connectId); + + if(connectIdPubs != null && !connectIdPubs.isEmpty()){ + Map digestMap = new HashMap<>(); + connectIdPubs.forEach((dataIP,publishers)-> digestMap.put(dataIP, String.valueOf(PublisherDigest.getDigestValueSum(publishers)))); + + return digestMap; + } + + return null; + } + + @Override + public Map> getConnectSnapShot(String connectId) { + + Map pubMap = sessionDataStore.queryByConnectId(connectId); + + if(pubMap != null && !pubMap.isEmpty()){ + + Map> connectIdPubs = new ConcurrentHashMap<>(); + + pubMap.values().forEach(publisher->{ + + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + + List connPublishers = connectIdPubs.computeIfAbsent(dataNode.getNodeUrl().getIpAddress(), k-> new ArrayList<>()); + + connPublishers.add(publisher); + }); + + return connectIdPubs; + } else { + LOGGER.error("Cannot get publishers by connectId:{}!",connectId); + } + + return null; + } +} \ No newline at end of file From c3d9a3eaab2fe89cfa6eb3ce5f1d378c355dd4b7 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 3 Jun 2019 15:31:28 +0800 Subject: [PATCH 031/161] fix word cache clientid --- .../com/alipay/sofa/registry/common/model/store/BaseInfo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java index 7c4983356..2242e5354 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java @@ -193,7 +193,7 @@ public void setAttributes(Map attributes) { Map newAttributes = new HashMap<>(); if (attributes != null && !attributes.isEmpty()) { attributes.forEach((key, value) -> newAttributes - .put(WordCache.getInstance().getWordCache(key), value)); + .put(key, value)); } this.attributes = newAttributes; } @@ -273,7 +273,7 @@ public String getClientId() { * @param clientId value to be assigned to property clientId */ public void setClientId(String clientId) { - this.clientId = WordCache.getInstance().getWordCache(clientId); + this.clientId = clientId; } /** From ca87bcffd76ff062bbe567549461990573a54a4f Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 3 Jun 2019 17:37:51 +0800 Subject: [PATCH 032/161] data renew module --- ...erDigest.java => PublisherDigestUtil.java} | 37 +++--- .../SessionServerRegisterRequest.java | 18 +-- .../server/data/cache/DatumCache.java | 64 ++++++---- .../change/event/DataChangeEventQueue.java | 34 +++--- .../SessionServerConnectionFactory.java | 57 ++++----- .../disconnect/ClientDisconnectEvent.java | 16 +-- .../disconnect/DisconnectEventHandler.java | 29 ++--- .../handler/DatumSnapshotHandler.java | 21 ++-- .../handler/PublishDataHandler.java | 2 +- .../handler/RenewDatumHandler.java | 112 ++++++++++++++++++ .../handler/SessionServerRegisterHandler.java | 17 +-- .../data/resource/DataDigestResource.java | 38 +++--- .../PublisherDigestServiceImpl.java | 19 +-- .../task/SessionRegisterDataTask.java | 16 +-- .../registry/test/BaseIntegrationTest.java | 49 ++++---- 15 files changed, 332 insertions(+), 197 deletions(-) rename server/common/model/src/main/java/com/alipay/sofa/registry/common/model/{PublisherDigest.java => PublisherDigestUtil.java} (51%) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigestUtil.java similarity index 51% rename from server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java rename to server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigestUtil.java index 24e55645b..67ad72236 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/PublisherDigestUtil.java @@ -16,32 +16,35 @@ */ package com.alipay.sofa.registry.common.model; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.consistency.hash.MD5HashFunction; - import java.util.Collection; -import java.util.concurrent.atomic.AtomicLong; + +import com.alipay.sofa.registry.common.model.store.Publisher; /** * + * @author kezhu.wukz * @author shangyu.wh - * @version $Id: PublisherDigest.java, v 0.1 2019-05-30 20:58 shangyu.wh Exp $ + * @version $Id: PublisherDigestUtil.java, v 0.1 2019-05-30 20:58 shangyu.wh Exp $ */ -public class PublisherDigest { +public class PublisherDigestUtil { - public static Long getDigestValueSum(Collection publishers){ - AtomicLong digest = new AtomicLong(); - if(publishers != null && !publishers.isEmpty()) { - publishers.forEach(publisher -> digest.addAndGet(getDigestValue(publisher))); + public static long getDigestValueSum(Collection publishers) { + long digest = 0L; + if (publishers != null && !publishers.isEmpty()) { + for (Publisher publisher : publishers) { + digest += getDigestValue(publisher); + } } - return digest.get(); + return digest; } - public static int getDigestValue(Publisher publisher) { - MD5HashFunction md5HashFunction = new MD5HashFunction(); - StringBuilder sb = new StringBuilder(); - sb.append(publisher.getRegisterId()).append(publisher.getVersion()) - .append(publisher.getRegisterTimestamp()); - return md5HashFunction.hash(sb.toString()); + public static long getDigestValue(Publisher publisher) { + String registerId = publisher.getRegisterId(); + Long version = publisher.getVersion(); + long registerTimestamp = publisher.getRegisterTimestamp(); + long result = registerId != null ? registerId.hashCode() : 0; + result = 31 * result + (version != null ? version.hashCode() : 0); + result = 31 * result + (int) (registerTimestamp ^ (registerTimestamp >>> 32)); + return result; } } \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/SessionServerRegisterRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/SessionServerRegisterRequest.java index 16f00f56b..b852aa3ef 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/SessionServerRegisterRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/SessionServerRegisterRequest.java @@ -30,16 +30,16 @@ public class SessionServerRegisterRequest implements Serializable { private String processId; - private Set clientHosts; + private Set connectIds; /** * constructor * @param processId - * @param clientHosts + * @param connectIds */ - public SessionServerRegisterRequest(String processId, Set clientHosts) { + public SessionServerRegisterRequest(String processId, Set connectIds) { this.processId = processId; - this.clientHosts = clientHosts; + this.connectIds = connectIds; } /** @@ -61,17 +61,17 @@ public void setProcessId(String processId) { } /** - * Getter method for property clientHosts. + * Getter method for property connectIds. * - * @return property value of clientHosts + * @return property value of connectIds */ - public Set getClientHosts() { - return clientHosts; + public Set getConnectIds() { + return connectIds; } @Override public String toString() { return new StringBuilder("[SessionServerRegisterRequest] processId=") - .append(this.processId).append(", clientHosts=").append(this.clientHosts).toString(); + .append(this.processId).append(", connectIds=").append(this.connectIds).toString(); } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 6b17f7702..80d73477b 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -16,11 +16,6 @@ */ package com.alipay.sofa.registry.server.data.cache; -import com.alipay.sofa.registry.common.model.dataserver.Datum; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; -import org.springframework.util.StringUtils; - import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -28,6 +23,12 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.apache.commons.lang.StringUtils; + +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; + /** * cache of datum, providing query function to the upper module * @@ -36,21 +37,26 @@ */ public class DatumCache { - public static final long ERROR_DATUM_VERSION = -2L; + public static final long ERROR_DATUM_VERSION = -2L; /** * row: dataCenter * column: dataInfoId * value: datum */ - private static final Map> DATUM_MAP = new ConcurrentHashMap<>(); + private static final Map> DATUM_MAP = new ConcurrentHashMap<>(); /** * row: ip:port * column: registerId * value: publisher */ - private static final Map> CLIENT_PUB_MAP = new ConcurrentHashMap<>(); + private static final Map> CONNECT_ID_PUB_MAP = new ConcurrentHashMap<>(); + + /** + * record the latest heartbeat time for each connId, format: connId -> lastRenewTimestamp + */ + private static final Map CONNECT_ID_RENEW_TIMESTAMP_MAP = new ConcurrentHashMap<>(); /** * get datum by specific dataCenter and dataInfoId @@ -118,11 +124,21 @@ public static Map> getAll() { /** * * - * @param host + * @param connectId + * @return + */ + public static Map getByConnectId(String connectId) { + return CONNECT_ID_PUB_MAP.getOrDefault(connectId, null); + } + + /** + * + * + * @param connectId * @return */ - public static Map getByHost(String host) { - return CLIENT_PUB_MAP.getOrDefault(host, null); + public static void renew(String connectId) { + CONNECT_ID_RENEW_TIMESTAMP_MAP.put(connectId, System.currentTimeMillis()); } /** @@ -162,7 +178,7 @@ public static MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { String registerId = publisher.getRegisterId(); Map clientRegisterMap = new ConcurrentHashMap<>(); clientRegisterMap.put(registerId, publisher); - Map retMap = CLIENT_PUB_MAP.putIfAbsent(publisher + Map retMap = CONNECT_ID_PUB_MAP.putIfAbsent(publisher .getSourceAddress().getAddressString(), clientRegisterMap); if (retMap != null) { retMap.putAll(clientRegisterMap); @@ -204,8 +220,8 @@ public static boolean cleanDatum(String dataCenter, String dataInfoId) { //remove from cache if (cachePub != null) { cachePubMap.remove(registerId); - CLIENT_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( - registerId); + CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()) + .remove(registerId); } } return true; @@ -234,7 +250,7 @@ private static MergeResult mergeDatum(Datum datum) { if (cachePub != null && pub.getRegisterTimestamp() > cachePub.getRegisterTimestamp()) { cachePubMap.remove(registerId); - CLIENT_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( + CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( registerId); isChanged = true; } @@ -250,13 +266,13 @@ private static MergeResult mergeDatum(Datum datum) { // if version of both pub and cachePub are not equal, or sourceAddress of both are not equal, update // eg: sessionserver crash, client reconnect to other sessionserver, sourceAddress changed, version not changed // eg: client restart, sourceAddress and version are both changed - if (CLIENT_PUB_MAP.containsKey(cachePubAddr)) { - CLIENT_PUB_MAP.get(cachePubAddr).remove(registerId); + if (CONNECT_ID_PUB_MAP.containsKey(cachePubAddr)) { + CONNECT_ID_PUB_MAP.get(cachePubAddr).remove(registerId); } - if (!CLIENT_PUB_MAP.containsKey(pubAddr)) { - CLIENT_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); + if (!CONNECT_ID_PUB_MAP.containsKey(pubAddr)) { + CONNECT_ID_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); } - CLIENT_PUB_MAP.get(pubAddr).put(registerId, pub); + CONNECT_ID_PUB_MAP.get(pubAddr).put(registerId, pub); isChanged = true; } } @@ -286,10 +302,10 @@ private static Long coverDatum(Datum datum) { String registerId = pubEntry.getKey(); Publisher pub = pubEntry.getValue(); String pubAddr = pub.getSourceAddress().getAddressString(); - if (!CLIENT_PUB_MAP.containsKey(pubAddr)) { - CLIENT_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); + if (!CONNECT_ID_PUB_MAP.containsKey(pubAddr)) { + CONNECT_ID_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); } - CLIENT_PUB_MAP.get(pubAddr).put(registerId, pub); + CONNECT_ID_PUB_MAP.get(pubAddr).put(registerId, pub); Publisher cachePub = cachePubMap.get(registerId); if (cachePub != null && pubAddr.equals(cachePub.getSourceAddress().getAddressString())) { @@ -298,7 +314,7 @@ private static Long coverDatum(Datum datum) { } if (!cachePubMap.isEmpty()) { for (Publisher cachePub : cachePubMap.values()) { - CLIENT_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( + CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( cachePub.getRegisterId()); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index ffe4b4286..ef0c08a1a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -209,12 +209,13 @@ public void start() { } private void handleClientOff(ClientChangeEvent event) { - String clientHost = event.getHost(); - synchronized (Interners.newWeakInterner().intern(clientHost)) { - Map pubMap = DatumCache.getByHost(clientHost); + String connectId = event.getHost(); + synchronized (Interners.newWeakInterner().intern(connectId)) { + Map pubMap = DatumCache.getByConnectId(connectId); if (pubMap != null && !pubMap.isEmpty()) { - LOGGER.info("[{}] client off begin, host={}, occurTimestamp={},all pub size={}", - getName(), clientHost, event.getOccurredTimestamp(), pubMap.size()); + LOGGER.info( + "[{}] client off begin, connectId={}, occurTimestamp={}, all pubSize={}", + getName(), connectId, event.getOccurredTimestamp(), pubMap.size()); int count = 0; for (Publisher publisher : pubMap.values()) { // Only care dataInfoIds which belong to this queue @@ -236,11 +237,11 @@ private void handleClientOff(ClientChangeEvent event) { } LOGGER .info( - "[{}] client off handle, host={}, occurTimestamp={},version={},handle pub size={}", - getName(), clientHost, event.getOccurredTimestamp(), event.getVersion(), + "[{}] client off handle, connectId={}, occurTimestamp={}, version={}, handle pubSize={}", + getName(), connectId, event.getOccurredTimestamp(), event.getVersion(), count); } else { - LOGGER.info("[{}] no datum to handle, host={}", getName(), clientHost); + LOGGER.info("[{}] no datum to handle, connectId={}", getName(), connectId); } } } @@ -285,14 +286,12 @@ private void handleDatum(DataChangeTypeEnum changeType, DataSourceTypeEnum sourc } private void handleSnapshot(DatumSnapshotEvent event) { - String clientHost = event.getHost(); + String connectId = event.getHost(); Map snapshotPubMap = event.getPubMap(); - synchronized (Interners.newWeakInterner().intern(clientHost)) { - Map pubMap = DatumCache.getByHost(clientHost); - LOGGER - .info("[{}] snapshot begin, host={}, old pub size={}, snapshot pub size={}", - getName(), clientHost, pubMap != null ? pubMap.size() : null, - snapshotPubMap.size()); + synchronized (Interners.newWeakInterner().intern(connectId)) { + Map pubMap = DatumCache.getByConnectId(connectId); + LOGGER.info("[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", + getName(), connectId, pubMap != null ? pubMap.size() : null, snapshotPubMap.size()); int unpubSize = 0; if (pubMap != null) { for (Publisher publisher : pubMap.values()) { @@ -324,8 +323,9 @@ private void handleSnapshot(DatumSnapshotEvent event) { Datum datum = new Datum(publisher, event.getDataCenter(), currentTimeStamp); handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); } - LOGGER.info("[{}] snapshot handle, host={}, handle unpub size={}, handle pub size={}", - getName(), clientHost, unpubSize, snapshotPubMap.size()); + LOGGER.info( + "[{}] snapshot handle, connectId={}, handle unpubSize={}, handle pubSize={}", + getName(), connectId, unpubSize, snapshotPubMap.size()); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java index e8072e5ca..0ee31edf1 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java @@ -16,14 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver; -import com.alipay.remoting.Connection; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.net.NetUtil; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.SessionServerDisconnectEvent; -import org.springframework.beans.factory.annotation.Autowired; - import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -32,6 +24,15 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.remoting.Connection; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.SessionServerDisconnectEvent; + /** * the factory to hold sesseionserver connections * @@ -39,29 +40,29 @@ * @version $Id: SessionServerConnectionFactory.java, v 0.1 2017-12-06 15:48 qian.lqlq Exp $ */ public class SessionServerConnectionFactory { - private static final Logger LOGGER = LoggerFactory - .getLogger(SessionServerConnectionFactory.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(SessionServerConnectionFactory.class); - private static final int DELAY = 30 * 1000; + private static final int DELAY = 30 * 1000; /** * collection of connections * key : processId * value : connection */ - private final Map MAP = new ConcurrentHashMap<>(); + private final Map MAP = new ConcurrentHashMap<>(); /** * key : sessionserver host * value: sesseionserver processId */ - private final Map PROCESSID_MAP = new ConcurrentHashMap<>(); + private final Map PROCESS_ID_MAP = new ConcurrentHashMap<>(); /** * key : sessionserver processId * value: ip:port of clients */ - private final Map> PROCESSID_CLIENT_MAP = new ConcurrentHashMap<>(); + private final Map> PROCESS_ID_CONNECT_ID_MAP = new ConcurrentHashMap<>(); @Autowired private DisconnectEventHandler disconnectEventHandler; @@ -70,41 +71,41 @@ public class SessionServerConnectionFactory { * register connection * * @param processId - * @param clientHosts + * @param connectIds * @param connection */ - public void register(String processId, Set clientHosts, Connection connection) { + public void register(String processId, Set connectIds, Connection connection) { String serverHost = NetUtil.toAddressString(connection.getRemoteAddress()); if (LOGGER.isInfoEnabled()) { LOGGER.info("session({}, processId={}) registered", serverHost, processId); } MAP.put(processId, new Pair(serverHost, connection)); - Set ret = PROCESSID_CLIENT_MAP.getOrDefault(processId, null); + Set ret = PROCESS_ID_CONNECT_ID_MAP.getOrDefault(processId, null); if (ret == null) { - PROCESSID_CLIENT_MAP.putIfAbsent(processId, new HashSet<>()); + PROCESS_ID_CONNECT_ID_MAP.putIfAbsent(processId, new HashSet<>()); } - PROCESSID_CLIENT_MAP.get(processId).addAll(clientHosts); - PROCESSID_MAP.put(serverHost, processId); + PROCESS_ID_CONNECT_ID_MAP.get(processId).addAll(connectIds); + PROCESS_ID_MAP.put(serverHost, processId); } /** * * @param processId - * @param clientAddress + * @param connectId */ - public void registerClient(String processId, String clientAddress) { - Set ret = PROCESSID_CLIENT_MAP.getOrDefault(processId, null); + public void registerConnectId(String processId, String connectId) { + Set ret = PROCESS_ID_CONNECT_ID_MAP.getOrDefault(processId, null); if (ret == null) { - PROCESSID_CLIENT_MAP.putIfAbsent(processId, new HashSet<>()); + PROCESS_ID_CONNECT_ID_MAP.putIfAbsent(processId, new HashSet<>()); } - PROCESSID_CLIENT_MAP.get(processId).add(clientAddress); + PROCESS_ID_CONNECT_ID_MAP.get(processId).add(connectId); } /** * remove connection by specific host */ public void removeProcess(String sessionServerHost) { - String processId = PROCESSID_MAP.remove(sessionServerHost); + String processId = PROCESS_ID_MAP.remove(sessionServerHost); if (LOGGER.isInfoEnabled()) { LOGGER.info("session({}, processId={}) unregistered", sessionServerHost, processId); } @@ -118,8 +119,8 @@ public void removeProcess(String sessionServerHost) { * * @param processId */ - public Set removeClients(String processId) { - return PROCESSID_CLIENT_MAP.remove(processId); + public Set removeConnectIds(String processId) { + return PROCESS_ID_CONNECT_ID_MAP.remove(processId); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/ClientDisconnectEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/ClientDisconnectEvent.java index 3659db591..c3f233133 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/ClientDisconnectEvent.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/ClientDisconnectEvent.java @@ -23,16 +23,16 @@ */ public class ClientDisconnectEvent extends DisconnectEvent { - private String host; + private String connectId; /** * constructor - * @param host + * @param connectId * @param registerTimestamp * @param timeoutMs */ - public ClientDisconnectEvent(String host, long registerTimestamp, int timeoutMs) { - this.host = host; + public ClientDisconnectEvent(String connectId, long registerTimestamp, int timeoutMs) { + this.connectId = connectId; setRegisterTimestamp(registerTimestamp); setGmtOccur(System.currentTimeMillis()); setTimeoutMs(timeoutMs); @@ -40,12 +40,12 @@ public ClientDisconnectEvent(String host, long registerTimestamp, int timeoutMs) } /** - * Getter method for property host. + * Getter method for property connectId. * - * @return property value of host + * @return property value of connectId */ - public String getHost() { - return host; + public String getConnectId() { + return connectId; } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java index be8303982..d386f21f0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java @@ -83,7 +83,8 @@ public void receive(DisconnectEvent event) { sessionServerDisconnectEvent.getProcessId()); } else if (event.getType() == DisconnectTypeEnum.CLIENT) { ClientDisconnectEvent clientDisconnectEvent = (ClientDisconnectEvent) event; - LOGGER.info("receive client off event: clientHost={}", clientDisconnectEvent.getHost()); + LOGGER.info("receive client off event: connectId={}", + clientDisconnectEvent.getConnectId()); } if (dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING) { @@ -128,22 +129,22 @@ public void afterPropertiesSet() { try { DisconnectEvent disconnectEvent = EVENT_QUEUE.take(); if (disconnectEvent.getType() == DisconnectTypeEnum.SESSION_SERVER) { - SessionServerDisconnectEvent event = (SessionServerDisconnectEvent) disconnectEvent; - String processId = event.getProcessId(); + SessionServerDisconnectEvent event = (SessionServerDisconnectEvent) disconnectEvent; + String processId = event.getProcessId(); //check processId confirm remove,and not be registered again when delay time String sessionServerHost = event.getSessionServerHost(); if (sessionServerConnectionFactory .removeProcessIfMatch(processId, sessionServerHost)) { - Set clientHosts = sessionServerConnectionFactory - .removeClients(processId); + Set connectIds = sessionServerConnectionFactory + .removeConnectIds(processId); - LOGGER.info("session off is triggered: sessionServerHost={}, clientHost={}, processId={}", + LOGGER.info("session off is triggered: sessionServerHost={}, connectId={}, processId={}", sessionServerHost, - clientHosts, processId); + connectIds, processId); - if (clientHosts != null && !clientHosts.isEmpty()) { - for (String host : clientHosts) { - unPub(host, event.getRegisterTimestamp()); + if (connectIds != null && !connectIds.isEmpty()) { + for (String connectId : connectIds) { + unPub(connectId, event.getRegisterTimestamp()); } } } else { @@ -152,7 +153,7 @@ public void afterPropertiesSet() { } } else { ClientDisconnectEvent event = (ClientDisconnectEvent) disconnectEvent; - unPub(event.getHost(), event.getRegisterTimestamp()); + unPub(event.getConnectId(), event.getRegisterTimestamp()); } } catch (Throwable e) { LOGGER.error("handle client disconnect event failed", e); @@ -164,11 +165,11 @@ public void afterPropertiesSet() { /** * - * @param host + * @param connectId * @param registerTimestamp */ - private void unPub(String host, long registerTimestamp) { - dataChangeEventCenter.onChange(new ClientChangeEvent(host, dataServerConfig + private void unPub(String connectId, long registerTimestamp) { + dataChangeEventCenter.onChange(new ClientChangeEvent(connectId, dataServerConfig .getLocalDataCenter(), registerTimestamp)); } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index f1f6b421b..1718696d4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -33,8 +33,8 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; +import com.alipay.sofa.registry.util.ParaCheckUtil; /** * handling snapshot request @@ -45,26 +45,21 @@ public class DatumSnapshotHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory.getLogger(DatumSnapshotHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(DatumSnapshotHandler.class); @Autowired - private ForwardService forwardService; + private ForwardService forwardService; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataChangeEventCenter dataChangeEventCenter; @Autowired - private DisconnectEventHandler disconnectEventHandler; - - @Autowired - private DataChangeEventCenter dataChangeEventCenter; - - @Autowired - private DataServerConfig dataServerConfig; + private DataServerConfig dataServerConfig; @Override public void checkParam(DatumSnapshotRequest request) throws RuntimeException { - // ParaCheckUtil.checkNotEmpty(request.getHosts(), "ClientOffRequest.hosts"); + ParaCheckUtil.checkNotBlank(request.getConnectId(), "DatumSnapshotRequest.connectId"); + ParaCheckUtil.checkNotEmpty(request.getPublishers(), "DatumSnapshotRequest.publishers"); } @Override @@ -73,7 +68,7 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { LOGGER.warn("[forward] Snapshot request refused, request: {}", request); CommonResponse response = new CommonResponse(); response.setSuccess(false); - response.setMessage("Request refused, Server status is not working"); + response.setMessage("Snapshot request refused, Server status is not working"); return response; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java index 1fa7d876e..3be20d5a9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java @@ -105,7 +105,7 @@ public Object doHandle(Channel channel, PublishDataRequest request) { dataChangeEventCenter.onChange(publisher, dataServerConfig.getLocalDataCenter()); if (publisher.getPublishType() != PublishType.TEMPORARY) { - sessionServerConnectionFactory.registerClient(request.getSessionServerProcessId(), + sessionServerConnectionFactory.registerConnectId(request.getSessionServerProcessId(), publisher.getSourceAddress().getAddressString()); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java new file mode 100644 index 000000000..1cade47f6 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; + +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.GenericResponse; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.PublisherDigestUtil; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; +import com.alipay.sofa.registry.util.ParaCheckUtil; + +/** + * handling snapshot request + * + * @author kezhu.wukz + * @version $Id: ClientOffProcessor.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ + */ +public class RenewDatumHandler extends AbstractServerHandler { + + /** LOGGER */ + private static final Logger LOGGER = LoggerFactory.getLogger(RenewDatumHandler.class); + + @Autowired + private ForwardService forwardService; + + @Override + public void checkParam(ReNewDatumRequest request) throws RuntimeException { + ParaCheckUtil.checkNotBlank(request.getConnectId(), "ReNewDatumRequest.connectId"); + ParaCheckUtil.checkNotBlank(request.getDigestSum(), "ReNewDatumRequest.digestSum"); + } + + @Override + public Object doHandle(Channel channel, ReNewDatumRequest request) { + if (forwardService.needForward()) { + LOGGER.warn("[forward] Renew request refused, request: {}", request); + CommonResponse response = new CommonResponse(); + response.setSuccess(false); + response.setMessage("Renew request refused, Server status is not working"); + return response; + } + + boolean isDiff = renewDatum(request); + + return new GenericResponse().fillSucceed(isDiff); + } + + @Override + public CommonResponse buildFailedResponse(String msg) { + return CommonResponse.buildFailedResponse(msg); + } + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + public Class interest() { + return ClientOffRequest.class; + } + + @Override + protected Node.NodeType getConnectNodeType() { + return Node.NodeType.DATA; + } + + /** + * 1. Update the timestamp corresponding to connectId in DatumCache + * 2. Compare checksum: Get all pubs corresponding to the connId from DatumCache and calculate checksum. + */ + private boolean renewDatum(ReNewDatumRequest request) { + String connectId = request.getConnectId(); + DatumCache.renew(connectId); + Map publisherMap = DatumCache.getByConnectId(connectId); + + String renewDigest = request.getDigestSum(); + String cacheDigest = null; + if (publisherMap != null && publisherMap.values().size() > 0) { + cacheDigest = String.valueOf(PublisherDigestUtil.getDigestValueSum(publisherMap + .values())); + } + + return StringUtils.equals(renewDigest, cacheDigest); + } +} diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java index a136fa06f..d4ff45166 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java @@ -16,6 +16,11 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; @@ -24,10 +29,6 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashSet; -import java.util.Set; /** * @@ -47,11 +48,11 @@ public void checkParam(SessionServerRegisterRequest request) throws RuntimeExcep @Override public Object doHandle(Channel channel, SessionServerRegisterRequest request) { - Set clientHosts = request.getClientHosts(); - if (clientHosts == null) { - clientHosts = new HashSet<>(); + Set connectIds = request.getConnectIds(); + if (connectIds == null) { + connectIds = new HashSet<>(); } - sessionServerConnectionFactory.register(request.getProcessId(), clientHosts, + sessionServerConnectionFactory.register(request.getProcessId(), connectIds, ((BoltChannel) channel).getConnection()); return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java index d61ea6da3..a34a7104a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java @@ -16,6 +16,25 @@ */ package com.alipay.sofa.registry.server.data.resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.DataInfo; @@ -27,23 +46,6 @@ import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.stream.Collectors; /** * @@ -99,7 +101,7 @@ public Map> getPublishersByConnectId(Map { String connectId = NetUtil.genHost(ip, Integer.valueOf(port)); if (!connectId.isEmpty()) { - Map publisherMap = DatumCache.getByHost(connectId); + Map publisherMap = DatumCache.getByConnectId(connectId); if (publisherMap != null && !publisherMap.isEmpty()) { ret.put(connectId, publisherMap); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java index 8ef886221..e8ef8b63b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java @@ -16,20 +16,21 @@ */ package com.alipay.sofa.registry.server.session.correction; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.PublisherDigest; +import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.store.DataStore; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** * @@ -59,7 +60,7 @@ public class PublisherDigestServiceImpl implements PublisherDigestService { if(connectIdPubs != null && !connectIdPubs.isEmpty()){ Map digestMap = new HashMap<>(); - connectIdPubs.forEach((dataIP,publishers)-> digestMap.put(dataIP, String.valueOf(PublisherDigest.getDigestValueSum(publishers)))); + connectIdPubs.forEach((dataIP,publishers)-> digestMap.put(dataIP, String.valueOf(PublisherDigestUtil.getDigestValueSum(publishers)))); return digestMap; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java index 925bc27a5..732d3fb64 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -29,10 +33,6 @@ import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - /** * * @author shangyu.wh @@ -84,11 +84,11 @@ public void setTaskEvent(TaskEvent taskEvent) { if (sessionServer != null) { Collection chs = sessionServer.getChannels(); - Set clientHosts = new HashSet<>(); - chs.forEach(channel -> clientHosts.add(NetUtil.toAddressString(channel.getRemoteAddress()))); + Set connectIds = new HashSet<>(); + chs.forEach(channel -> connectIds.add(NetUtil.toAddressString(channel.getRemoteAddress()))); sessionServerRegisterRequest = new SessionServerRegisterRequest( - SessionProcessIdGenerator.getSessionProcessId(), clientHosts); + SessionProcessIdGenerator.getSessionProcessId(), connectIds); } else { LOGGER.error("get null session server,please check server started before register!port {}", sessionServerConfig.getServerPort()); @@ -106,7 +106,7 @@ public void execute() { public String toString() { return "SESSION_REGISTER_DATA_TASK{" + "taskId='" + taskId + '\'' + ", sessionServerRegisterRequest=" + sessionServerRegisterRequest.getProcessId() - + ", clientList=" + sessionServerRegisterRequest.getClientHosts().size() + + ", clientList=" + sessionServerRegisterRequest.getConnectIds().size() + ", dataUrl=" + dataUrl + '}'; } } \ No newline at end of file diff --git a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java index 5ddcb99f8..de5859910 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java @@ -16,6 +16,31 @@ */ package com.alipay.sofa.registry.test; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; + +import org.junit.Before; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ConfigurableApplicationContext; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.client.api.RegistryClientConfig; import com.alipay.sofa.registry.client.api.SubscriberDataObserver; @@ -35,28 +60,6 @@ import com.alipay.sofa.registry.remoting.jersey.JerseyClient; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.test.TestRegistryMain; -import org.junit.Before; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ConfigurableApplicationContext; - -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static org.junit.Assert.assertTrue; /** * @author xuanbei 18/12/1 @@ -188,7 +191,7 @@ protected static void clearData() throws Exception { NetUtil.genHost(LOCAL_ADDRESS, getSourcePort(registryClient1)), NetUtil.genHost(LOCAL_ADDRESS, getSourcePort(registryClient2)))); for (String connectId : connectIds) { - Map publisherMap = DatumCache.getByHost(connectId); + Map publisherMap = DatumCache.getByConnectId(connectId); if (publisherMap != null) { publisherMap.clear(); } From 6b1b559b79c1cd116cae60551f5e580f5fcb11a5 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 4 Jun 2019 20:59:44 +0800 Subject: [PATCH 033/161] data renew/expired module --- .../registry/timer/AsyncHashedWheelTimer.java | 29 +++- .../DataServerBeanConfiguration.java | 43 +++-- .../data/bootstrap/DataServerBootstrap.java | 37 +++-- .../data/bootstrap/DataServerConfig.java | 27 ++- .../server/data/cache/DatumCache.java | 21 +-- .../data/correction/DatumLeaseManager.java | 154 ++++++++++++++++++ .../datasync/sync/AbstractAcceptorStore.java | 15 +- .../handler/ClientOffHandler.java | 11 +- .../handler/DatumSnapshotHandler.java | 7 + .../handler/PublishDataHandler.java | 9 +- ...tumHandler.java => ReNewDatumHandler.java} | 17 +- .../handler/UnPublishDataHandler.java | 31 ++++ .../src/main/resources/logback-spring.xml | 25 +++ .../src/main/resources/logback-spring.xml | 25 +++ 14 files changed, 377 insertions(+), 74 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java rename server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/{RenewDatumHandler.java => ReNewDatumHandler.java} (90%) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java index 675ed779b..15174664a 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.timer; -import io.netty.util.HashedWheelTimer; -import io.netty.util.Timeout; -import io.netty.util.TimerTask; - import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.SynchronousQueue; @@ -27,10 +23,14 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timeout; +import io.netty.util.TimerTask; + /** * based on HashedWheelTimer, add function: exec TimerTask async * - * @author kezhu.wukz + * @author kezhu.wukz * @version $Id: AsyncHashedWheelTimer.java, v 0.1 2019-01-11 10:54 AM kezhu.wukz Exp $ */ public class AsyncHashedWheelTimer extends HashedWheelTimer { @@ -51,10 +51,25 @@ public class AsyncHashedWheelTimer extends HashedWheelTimer { public AsyncHashedWheelTimer(ThreadFactory threadFactory, long tickDuration, TimeUnit unit, int ticksPerWheel, ThreadFactory asyncThreadFactory, TaskFailedCallback taskFailedCallback) { + this(threadFactory, tickDuration, unit, ticksPerWheel, + new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, + new SynchronousQueue<>(), asyncThreadFactory), taskFailedCallback); + } + + /** + * + * @param threadFactory + * @param tickDuration + * @param unit + * @param ticksPerWheel + * @param asyncExecutor + */ + public AsyncHashedWheelTimer(ThreadFactory threadFactory, long tickDuration, TimeUnit unit, + int ticksPerWheel, Executor asyncExecutor, + TaskFailedCallback taskFailedCallback) { super(threadFactory, tickDuration, unit, ticksPerWheel); - this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, - new SynchronousQueue<>(), asyncThreadFactory); + this.executor = asyncExecutor; this.taskFailedCallback = taskFailedCallback; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 776982906..9f9baefec 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -16,6 +16,19 @@ */ package com.alipay.sofa.registry.server.data.bootstrap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.jersey.exchange.JerseyExchange; @@ -26,6 +39,7 @@ import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.change.notify.SessionServerNotifier; import com.alipay.sofa.registry.server.data.change.notify.TempPublisherNotifier; +import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; import com.alipay.sofa.registry.server.data.correction.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.datasync.AcceptorStore; import com.alipay.sofa.registry.server.data.datasync.SyncDataService; @@ -68,26 +82,16 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardServiceImpl; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.ClientOffHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.DataServerConnectionHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.DatumSnapshotHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataVersionsHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.PublishDataHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.ReNewDatumHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.SessionServerRegisterHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.UnPublishDataHandler; import com.alipay.sofa.registry.server.data.resource.DataDigestResource; import com.alipay.sofa.registry.server.data.resource.HealthResource; import com.alipay.sofa.registry.util.PropertySplitter; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; /** * @@ -243,6 +247,16 @@ public AbstractServerHandler clientOffHandler() { return new ClientOffHandler(); } + @Bean + public AbstractServerHandler datumSnapshotHandler() { + return new DatumSnapshotHandler(); + } + + @Bean + public AbstractServerHandler reNewDatumHandler() { + return new ReNewDatumHandler(); + } + @Bean public AbstractServerHandler publishDataProcessor(DataServerConfig dataServerBootstrapConfig) { return new PublishDataHandler(dataServerBootstrapConfig); @@ -378,6 +392,11 @@ public LocalDataServerCleanHandler localDataServerCleanHandler() { return new LocalDataServerCleanHandler(); } + @Bean + public DatumLeaseManager datumLeaseManager() { + return new DatumLeaseManager(); + } + @Bean public GetSyncDataHandler getSyncDataHandler() { return new GetSyncDataHandler(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index e42293b84..622fd7c84 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -16,6 +16,23 @@ */ package com.alipay.sofa.registry.server.data.bootstrap; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -31,21 +48,6 @@ import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; /** * @@ -192,8 +194,9 @@ private void startScheduler() { syncDataScheduler.startScheduler(); // start all startTask except renew task eventCenter.post(new StartTaskEvent( - Arrays.stream(StartTaskTypeEnum.values()).filter(type->type != StartTaskTypeEnum.RENEW).collect( - Collectors.toSet()))); + Arrays.stream(StartTaskTypeEnum.values()).filter(type -> type != StartTaskTypeEnum.RENEW) + .collect( + Collectors.toSet()))); //start dump log new CacheDigestTask().start(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 58eeb29cd..cbafd4127 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -16,15 +16,16 @@ */ package com.alipay.sofa.registry.server.data.bootstrap; -import com.alipay.sofa.registry.net.NetUtil; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import com.alipay.sofa.registry.net.NetUtil; + /** * * @@ -97,6 +98,8 @@ public class DataServerConfig { private int publishExecutorQueueSize = 10000; + private int datumTimeToLiveSec = 120; + /** * constructor * @param commonConfig @@ -619,4 +622,22 @@ public int getNotifySessionRetryTimes() { public void setNotifySessionRetryTimes(int notifySessionRetryTimes) { this.notifySessionRetryTimes = notifySessionRetryTimes; } + + /** + * Getter method for property datumTimeToLiveSec. + * + * @return property value of datumTimeToLiveSec + */ + public int getDatumTimeToLiveSec() { + return datumTimeToLiveSec; + } + + /** + * Setter method for property datumTimeToLiveSec . + * + * @param datumTimeToLiveSec value to be assigned to property datumTimeToLiveSec + */ + public void setDatumTimeToLiveSec(int datumTimeToLiveSec) { + this.datumTimeToLiveSec = datumTimeToLiveSec; + } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 80d73477b..4cfbd0dd2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -37,26 +37,21 @@ */ public class DatumCache { - public static final long ERROR_DATUM_VERSION = -2L; + public static final long ERROR_DATUM_VERSION = -2L; /** * row: dataCenter * column: dataInfoId * value: datum */ - private static final Map> DATUM_MAP = new ConcurrentHashMap<>(); + private static final Map> DATUM_MAP = new ConcurrentHashMap<>(); /** * row: ip:port * column: registerId * value: publisher */ - private static final Map> CONNECT_ID_PUB_MAP = new ConcurrentHashMap<>(); - - /** - * record the latest heartbeat time for each connId, format: connId -> lastRenewTimestamp - */ - private static final Map CONNECT_ID_RENEW_TIMESTAMP_MAP = new ConcurrentHashMap<>(); + private static final Map> CONNECT_ID_PUB_MAP = new ConcurrentHashMap<>(); /** * get datum by specific dataCenter and dataInfoId @@ -131,16 +126,6 @@ public static Map getByConnectId(String connectId) { return CONNECT_ID_PUB_MAP.getOrDefault(connectId, null); } - /** - * - * - * @param connectId - * @return - */ - public static void renew(String connectId) { - CONNECT_ID_RENEW_TIMESTAMP_MAP.put(connectId, System.currentTimeMillis()); - } - /** * put datum into cache * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java new file mode 100644 index 000000000..8e572f6f6 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.correction; + +import java.util.Map; +import java.util.TimeZone; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang.time.DateFormatUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; +import com.alipay.sofa.registry.util.NamedThreadFactory; +import com.google.common.util.concurrent.ThreadFactoryBuilder; + +/** + * + * @author kezhu.wukz + * @version $Id: DatumExpiredCleaner.java, v 0.1 2019-06-03 21:08 kezhu.wukz Exp $ + */ +public class DatumLeaseManager { + private static final Logger LOGGER = LoggerFactory + .getLogger(DatumLeaseManager.class); + private static final TimeZone TIME_ZONE = TimeZone + .getTimeZone("Asia/Shanghai"); + + /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ + private final Map connectIdReNewTimestampMap = new ConcurrentHashMap<>(); + + /** lock for connectId , format: connectId -> true */ + private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); + + private final AsyncHashedWheelTimer datumAsyncHashedWheelTimer; + private final ThreadPoolExecutor datumExpiredCheckExecutor; + + @Autowired + private DataServerConfig dataServerConfig; + + @Autowired + private DisconnectEventHandler disconnectEventHandler; + + /** + * constructor + */ + public DatumLeaseManager() { + datumExpiredCheckExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(), new NamedThreadFactory( + "Scheduler-DatumExpiredCheckExecutor")); + ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); + threadFactoryBuilder.setDaemon(true); + datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( + "Scheduler-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, + datumExpiredCheckExecutor, new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + LOGGER.error("executionRejected: " + e.getMessage(), e); + } + + @Override + public void executionFailed(Throwable e) { + LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); + } + + /** + * record the reNew timestamp + */ + public void reNew(String connectId) { + // record the reNew timestamp + connectIdReNewTimestampMap.put(connectId, System.currentTimeMillis()); + // try to trigger evict task + scheduleEvictTask(connectId, 0); + } + + /** + * trigger evict task: if connectId expired, create ClientDisconnectEvent to cleanup datums bind to the connectId + * PS: every connectId allows only one task to be created + */ + private void scheduleEvictTask(String connectId, long delaySec) { + delaySec = (delaySec <= 0) ? dataServerConfig.getDatumTimeToLiveSec() : delaySec; + + // lock for connectId: every connectId allows only one task to be created + Boolean ifAbsent = locksForConnectId.putIfAbsent(connectId, true); + if (ifAbsent != null) { + return; + } + + datumAsyncHashedWheelTimer.newTimeout(_timeout -> { + boolean continued = true; + long nextDelaySec = 0; + try { + // release lock + locksForConnectId.remove(connectId); + + // get lastReNewTime of this connectId + long lastReNewTime = connectIdReNewTimestampMap.get(connectId); + + /* + * 1. lastReNewTime expires, then: + * - build ClientOffEvent and hand it to DataChangeEventCenter. + * - It will not be scheduled next time, so terminated. + * 2. lastReNewTime not expires, then: + * - trigger the next schedule + */ + boolean isExpired = + System.currentTimeMillis() - lastReNewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; + if (isExpired) { + LOGGER.info("ConnectId({}) expired, lastReNewTime is {}", connectId, + DateFormatUtils.format(lastReNewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE)); + connectIdReNewTimestampMap.remove(connectId, lastReNewTime); + disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), + dataServerConfig.getClientOffDelayMs() * 10)); + continued = false; + } else { + nextDelaySec = + dataServerConfig.getDatumTimeToLiveSec() - + (System.currentTimeMillis() - lastReNewTime) / 1000L; + nextDelaySec = nextDelaySec <= 0 ? 1 : nextDelaySec; + } + + } catch (Exception e) { + LOGGER.error("Error in task of datumAsyncHashedWheelTimer", e); + } + if (continued) { + scheduleEvictTask(connectId, nextDelaySec); + } + }, delaySec, TimeUnit.SECONDS); + + } +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java index 70e644c0e..124d306cb 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.data.datasync.sync; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.DelayQueue; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.NotifyDataSyncRequest; @@ -32,12 +39,6 @@ import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.util.DelayItem; import com.alipay.sofa.registry.server.data.util.TimeUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.DelayQueue; /** * @@ -234,6 +235,8 @@ public void changeDataCheck() { removeCache(acceptor); // compare and remove } catch (InterruptedException e) { break; + } catch (Throwable e) { + LOGGER.error(e.getMessage(), e); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java index 2ebd53d7f..d0ad8dfe9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; @@ -25,9 +29,6 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; /** * processor to remove data of specific clients immediately @@ -38,7 +39,7 @@ public class ClientOffHandler extends AbstractServerHandler { @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DisconnectEventHandler disconnectEventHandler; @@ -53,7 +54,7 @@ public Object doHandle(Channel channel, ClientOffRequest request) { List hosts = request.getHosts(); for (String host : hosts) { disconnectEventHandler.receive(new ClientDisconnectEvent(host, request.getGmtOccur(), - dataServerBootstrapConfig.getClientOffDelayMs() * 10)); + dataServerConfig.getClientOffDelayMs() * 10)); } return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 1718696d4..ef7560800 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -32,6 +32,7 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; +import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -56,6 +57,9 @@ public class DatumSnapshotHandler extends AbstractServerHandler { +public class ReNewDatumHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory.getLogger(RenewDatumHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ReNewDatumHandler.class); @Autowired private ForwardService forwardService; + @Autowired + private DatumLeaseManager datumLeaseManager; + @Override public void checkParam(ReNewDatumRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getConnectId(), "ReNewDatumRequest.connectId"); @@ -66,7 +70,7 @@ public Object doHandle(Channel channel, ReNewDatumRequest request) { return response; } - boolean isDiff = renewDatum(request); + boolean isDiff = reNewDatum(request); return new GenericResponse().fillSucceed(isDiff); } @@ -95,9 +99,9 @@ protected Node.NodeType getConnectNodeType() { * 1. Update the timestamp corresponding to connectId in DatumCache * 2. Compare checksum: Get all pubs corresponding to the connId from DatumCache and calculate checksum. */ - private boolean renewDatum(ReNewDatumRequest request) { + private boolean reNewDatum(ReNewDatumRequest request) { String connectId = request.getConnectId(); - DatumCache.renew(connectId); + Map publisherMap = DatumCache.getByConnectId(connectId); String renewDigest = request.getDigestSum(); @@ -107,6 +111,9 @@ private boolean renewDatum(ReNewDatumRequest request) { .values())); } + // record the reNew timestamp + datumLeaseManager.reNew(connectId); + return StringUtils.equals(renewDigest, cacheDigest); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 8662db602..1b710534e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -16,17 +16,23 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.UnPublishDataRequest; +import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.cache.UnPublisher; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; +import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -51,6 +57,9 @@ public class UnPublishDataHandler extends AbstractServerHandler pubMap = datum.getPubMap(); + if (pubMap != null) { + Publisher publisher = pubMap.get(request.getRegisterId()); + return publisher.getSourceAddress().getAddressString(); + } + return null; + } + @Override public CommonResponse buildFailedResponse(String msg) { return CommonResponse.buildFailedResponse(msg); diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index fe4dcb027..269a9746b 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -233,6 +233,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-datum-lease.log + + ${DATA_LOG_HOME}/registry-datum-lease.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -307,6 +327,11 @@ + + + + + diff --git a/server/server/integration/src/main/resources/logback-spring.xml b/server/server/integration/src/main/resources/logback-spring.xml index 167ae8744..30c158ca9 100644 --- a/server/server/integration/src/main/resources/logback-spring.xml +++ b/server/server/integration/src/main/resources/logback-spring.xml @@ -281,6 +281,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-datum-lease.log + + ${DATA_LOG_HOME}/registry-datum-lease.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -496,6 +516,11 @@ + + + + + From 8f6075178b84e679b7dc96807aee1d68e938abfe Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 5 Jun 2019 13:59:40 +0800 Subject: [PATCH 034/161] add renew datuem request --- .../scheduler/AsyncHashedWheelTimerTask.java | 114 +++++++++++++++++ .../bootstrap/SessionServerConfig.java | 12 +- .../bootstrap/SessionServerConfigBean.java | 117 +++++++++++++----- .../bootstrap/SessionServerConfiguration.java | 11 ++ .../{ => service}/PublisherDigestService.java | 2 +- .../PublisherDigestServiceImpl.java | 2 +- .../session/node/service/DataNodeService.java | 2 + .../node/service/DataNodeServiceImpl.java | 42 +++++++ .../server/session/registry/Registry.java | 5 + .../session/registry/SessionRegistry.java | 40 ++++++ .../handler/ClientNodeConnectionHandler.java | 37 +++++- .../session/scheduler/ExecutorManager.java | 36 ++++-- 12 files changed, 373 insertions(+), 47 deletions(-) create mode 100644 server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/{ => service}/PublisherDigestService.java (95%) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/{ => service}/PublisherDigestServiceImpl.java (97%) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java new file mode 100644 index 000000000..3f2680893 --- /dev/null +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.task.scheduler; + +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timeout; +import io.netty.util.TimerTask; + +import java.util.concurrent.TimeUnit; +import java.util.function.BooleanSupplier; + +/** + * + * @author shangyu.wh + * @version 123: AsyncHashedWheelTimerTask.java, v 0.1 2019-06-03 16:11 shangyu.wh Exp $ + */ +public class AsyncHashedWheelTimerTask extends HashedWheelTimer { + + private static final Logger LOGGER = LoggerFactory.getLogger(AsyncHashedWheelTimerTask.class); + + private final String name; + + private final long tickDuration; + + private final int ticksPerWheel; + + public AsyncHashedWheelTimerTask(String name, long tickDuration, TimeUnit tickUnit, + int ticksPerWheel) { + super((new ThreadFactoryBuilder()).setNameFormat(name).build(), tickDuration, tickUnit, + ticksPerWheel); + this.name = name; + this.tickDuration = tickDuration; + this.ticksPerWheel = ticksPerWheel; + } + + public Timeout newTimeout(String taskName, TimerTask task, long delay, TimeUnit unit, + BooleanSupplier checkCondition) { + + return super.newTimeout(new OngoingTimerTask(taskName, task, delay, unit, checkCondition), + delay, unit); + } + + public class OngoingTimerTask implements TimerTask { + + private final String taskName; + + private final TimerTask task; + + private final long delay; + + private final TimeUnit delayUnit; + + private final BooleanSupplier checkCondition; + + public OngoingTimerTask(String taskName, TimerTask task, long delay, TimeUnit unit, + BooleanSupplier checkCondition) { + this.taskName = taskName; + this.task = task; + this.delay = delay; + this.delayUnit = unit; + this.checkCondition = checkCondition; + } + + @Override + public void run(Timeout timeout) throws Exception { + + try { + task.run(timeout); + } catch (Exception e) { + LOGGER.error(taskName + "executionFailed: " + e.getMessage(), e); + } finally { + if (checkCondition.getAsBoolean()) { + AsyncHashedWheelTimerTask.this.newTimeout(taskName, task, delay, delayUnit, + checkCondition); + } + } + } + + /** + * Getter method for property delay. + * + * @return property value of delay + */ + public long getDelay() { + return delay; + } + + /** + * Getter method for property delayUnit. + * + * @return property value of delayUnit + */ + public TimeUnit getDelayUnit() { + return delayUnit; + } + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 98668f574..c4cf36bc4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -109,11 +109,11 @@ public interface SessionServerConfig { long getPushTaskExecutorKeepAliveTime(); - int getDisconnectClientExecutorMinPoolSize(); + int getConnectClientExecutorMinPoolSize(); - int getDisconnectClientExecutorMaxPoolSize(); + int getConnectClientExecutorMaxPoolSize(); - int getDisconnectClientExecutorQueueSize(); + int getConnectClientExecutorQueueSize(); int getDataChangeFetchTaskMaxBufferSize(); @@ -127,6 +127,12 @@ public interface SessionServerConfig { long getPushDataTaskRetryIncrementDelay(); + int getReNewDatumWheelTicksSize(); + + int getReNewDatumWheelTicksDuration(); + + long getReNewDatumWheelTaskDelay(); + int getNumberOfReplicas(); boolean isStopPushSwitch(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 916c5d641..4b0d433d4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -118,11 +118,11 @@ public class SessionServerConfigBean implements SessionServerConfig { private long dataChangeExecutorKeepAliveTime = 60; - private int disconnectClientExecutorMinPoolSize = 40; + private int connectClientExecutorMinPoolSize = 60; - private int disconnectClientExecutorMaxPoolSize = 200; + private int connectClientExecutorMaxPoolSize = 400; - private int disconnectClientExecutorQueueSize = 10000; + private int connectClientExecutorQueueSize = 10000; private int dataChangeFetchTaskMaxBufferSize = 1000000; @@ -140,6 +140,12 @@ public class SessionServerConfigBean implements SessionServerConfig { private int userDataPushRetryWheelTicksDuration = 100; + private int reNewDatumWheelTicksSize = 2048; + + private int reNewDatumWheelTicksDuration = 500; + + private long reNewDatumWheelTaskDelay = 30; + private int pushDataTaskRetryFirstDelay = 500; private long pushDataTaskRetryIncrementDelay = 500; @@ -1147,60 +1153,57 @@ public void setDefaultSessionExecutorKeepAliveTime(long defaultSessionExecutorKe } /** - * Getter method for property disconnectClientExecutorMinPoolSize. + * Getter method for property connectClientExecutorMinPoolSize. * - * @return property value of disconnectClientExecutorMinPoolSize + * @return property value of connectClientExecutorMinPoolSize */ - @Override - public int getDisconnectClientExecutorMinPoolSize() { - return disconnectClientExecutorMinPoolSize; + public int getConnectClientExecutorMinPoolSize() { + return connectClientExecutorMinPoolSize; } /** - * Setter method for property disconnectClientExecutorMinPoolSize. + * Getter method for property connectClientExecutorMaxPoolSize. * - * @param disconnectClientExecutorMinPoolSize value to be assigned to property disconnectClientExecutorMinPoolSize + * @return property value of connectClientExecutorMaxPoolSize */ - public void setDisconnectClientExecutorMinPoolSize(int disconnectClientExecutorMinPoolSize) { - this.disconnectClientExecutorMinPoolSize = disconnectClientExecutorMinPoolSize; + public int getConnectClientExecutorMaxPoolSize() { + return connectClientExecutorMaxPoolSize; } /** - * Getter method for property disconnectClientExecutorMaxPoolSize. + * Getter method for property connectClientExecutorQueueSize. * - * @return property value of disconnectClientExecutorMaxPoolSize + * @return property value of connectClientExecutorQueueSize */ - @Override - public int getDisconnectClientExecutorMaxPoolSize() { - return disconnectClientExecutorMaxPoolSize; + public int getConnectClientExecutorQueueSize() { + return connectClientExecutorQueueSize; } /** - * Setter method for property disconnectClientExecutorMaxPoolSize. + * Setter method for property connectClientExecutorMinPoolSize. * - * @param disconnectClientExecutorMaxPoolSize value to be assigned to property disconnectClientExecutorMaxPoolSize + * @param connectClientExecutorMinPoolSize value to be assigned to property connectClientExecutorMinPoolSize */ - public void setDisconnectClientExecutorMaxPoolSize(int disconnectClientExecutorMaxPoolSize) { - this.disconnectClientExecutorMaxPoolSize = disconnectClientExecutorMaxPoolSize; + public void setConnectClientExecutorMinPoolSize(int connectClientExecutorMinPoolSize) { + this.connectClientExecutorMinPoolSize = connectClientExecutorMinPoolSize; } /** - * Getter method for property disconnectClientExecutorQueueSize. + * Setter method for property connectClientExecutorMaxPoolSize. * - * @return property value of disconnectClientExecutorQueueSize + * @param connectClientExecutorMaxPoolSize value to be assigned to property connectClientExecutorMaxPoolSize */ - @Override - public int getDisconnectClientExecutorQueueSize() { - return disconnectClientExecutorQueueSize; + public void setConnectClientExecutorMaxPoolSize(int connectClientExecutorMaxPoolSize) { + this.connectClientExecutorMaxPoolSize = connectClientExecutorMaxPoolSize; } /** - * Setter method for property disconnectClientExecutorQueueSize. + * Setter method for property connectClientExecutorQueueSize. * - * @param disconnectClientExecutorQueueSize value to be assigned to property disconnectClientExecutorQueueSize + * @param connectClientExecutorQueueSize value to be assigned to property connectClientExecutorQueueSize */ - public void setDisconnectClientExecutorQueueSize(int disconnectClientExecutorQueueSize) { - this.disconnectClientExecutorQueueSize = disconnectClientExecutorQueueSize; + public void setConnectClientExecutorQueueSize(int connectClientExecutorQueueSize) { + this.connectClientExecutorQueueSize = connectClientExecutorQueueSize; } /** @@ -1308,6 +1311,60 @@ public long getPushDataTaskRetryIncrementDelay() { return pushDataTaskRetryIncrementDelay; } + /** + * Getter method for property reNewDatumWheelTicksSize. + * + * @return property value of reNewDatumWheelTicksSize + */ + public int getReNewDatumWheelTicksSize() { + return reNewDatumWheelTicksSize; + } + + /** + * Getter method for property reNewDatumWheelTicksDuration. + * + * @return property value of reNewDatumWheelTicksDuration + */ + public int getReNewDatumWheelTicksDuration() { + return reNewDatumWheelTicksDuration; + } + + /** + * Getter method for property reNewDatumWheelTaskDelay. + * + * @return property value of reNewDatumWheelTaskDelay + */ + public long getReNewDatumWheelTaskDelay() { + return reNewDatumWheelTaskDelay; + } + + /** + * Setter method for property reNewDatumWheelTaskDelay. + * + * @param reNewDatumWheelTaskDelay value to be assigned to property reNewDatumWheelTaskDelay + */ + public void setReNewDatumWheelTaskDelay(long reNewDatumWheelTaskDelay) { + this.reNewDatumWheelTaskDelay = reNewDatumWheelTaskDelay; + } + + /** + * Setter method for property reNewDatumWheelTicksSize. + * + * @param reNewDatumWheelTicksSize value to be assigned to property reNewDatumWheelTicksSize + */ + public void setReNewDatumWheelTicksSize(int reNewDatumWheelTicksSize) { + this.reNewDatumWheelTicksSize = reNewDatumWheelTicksSize; + } + + /** + * Setter method for property reNewDatumWheelTicksDuration. + * + * @param reNewDatumWheelTicksDuration value to be assigned to property reNewDatumWheelTicksDuration + */ + public void setReNewDatumWheelTicksDuration(int reNewDatumWheelTicksDuration) { + this.reNewDatumWheelTicksDuration = reNewDatumWheelTicksDuration; + } + /** * Setter method for property pushDataTaskRetryIncrementDelay. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 63dff75e1..abb036d8d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -24,6 +24,8 @@ import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumCacheGenerator; import com.alipay.sofa.registry.server.session.cache.SessionCacheService; +import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; +import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestServiceImpl; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchCloudTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchTaskListener; @@ -602,4 +604,13 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { return new DefaultReceivedConfigDataPushTaskStrategy(); } } + + @Configuration + public static class SessionReNewDatumConfiguration { + + @Bean + public PublisherDigestService publisherDigestService() { + return new PublisherDigestServiceImpl(); + } + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java similarity index 95% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java index ec3a8fa71..85fe0e2a9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.session.correction; +package com.alipay.sofa.registry.server.session.correction.service; import com.alipay.sofa.registry.common.model.store.Publisher; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java similarity index 97% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java index 8ef886221..370ad7277 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/PublisherDigestServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.session.correction; +package com.alipay.sofa.registry.server.session.correction.service; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublisherDigest; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java index df1180ba8..5c9eeb46d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java @@ -97,4 +97,6 @@ public interface DataNodeService { void registerSessionProcessId(SessionServerRegisterRequest sessionServerRegisterRequest, URL dataUrl); + Boolean reNewDatum(String dataIpAddress, String connectId, String digest); + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 4337f2432..f1152c637 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -19,6 +19,7 @@ import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; @@ -466,4 +467,45 @@ private URL getUrl(String dataInfoId) { return null; } + public Boolean reNewDatum(String dataIpAddress, String connectId, String digest) { + try { + + Request request = new Request() { + @Override + public ReNewDatumRequest getRequestBody() { + return new ReNewDatumRequest(connectId, dataIpAddress, digest); + } + + @Override + public URL getRequestUrl() { + return new URL(dataIpAddress, sessionServerConfig.getDataServerPort()); + } + }; + + Response response = dataNodeExchanger.request(request); + + Object result = response.getResult(); + if (result instanceof GenericResponse) { + GenericResponse genericResponse = (GenericResponse) result; + if (genericResponse.isSuccess()) { + return (Boolean) genericResponse.getData(); + + } else { + LOGGER.error("reNewDatum has not get fail response!msg:{}", + genericResponse.getMessage()); + throw new RuntimeException("reNewDatum has not get fail response! msg:" + + genericResponse.getMessage()); + } + } else { + LOGGER.error("reNewDatum has not get response or response type illegal!"); + throw new RuntimeException( + "reNewDatum has not get response or response type illegal!"); + } + + } catch (RequestException e) { + LOGGER.error("ReNewDatum request error! " + e.getRequestMessage(), e); + throw new RuntimeException("ReNewDatum request error! " + e.getRequestMessage(), e); + } + } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 6d4920f14..129407cc7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -61,4 +61,9 @@ public interface Registry { * for fetchChangData first invoke */ void fetchChangDataProcess(); + + /** + * Regularly send update Datum with same connectID valid time request service + */ + void reNewDatum(String connectId); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index fe40e3a48..cb74154da 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -29,6 +29,7 @@ import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -43,8 +44,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -104,6 +108,9 @@ public class SessionRegistry implements Registry { @Autowired private SessionRegistryStrategy sessionRegistryStrategy; + @Autowired + private PublisherDigestService publisherDigestService; + @Override public void register(StoreData storeData) { @@ -255,6 +262,39 @@ private void checkConnect(StoreData storeData) { } + @Override + public void reNewDatum(String connectId) { + + //TODO check update time to cancel + Map connectDigest = publisherDigestService.getConnectDigest(connectId); + + Set remainDataIps = new HashSet<>(connectDigest.keySet()); + for (Entry entry : connectDigest.entrySet()) { + String dataIp = entry.getKey(); + String digest = entry.getValue(); + try { + Boolean result = dataNodeService.reNewDatum(dataIp, connectId, digest); + if (!result) { + LOGGER + .info( + "ReNew datum request to dataNode got sub digest different!dataIp={},connectId={},digest={}", + dataIp, connectId, digest); + break; + } else { + remainDataIps.remove(dataIp); + } + } catch (Exception e) { + LOGGER.error( + "ReNew datum request to dataNode error!dataIp={},connectId={},digest={}", + dataIp, connectId, digest, e); + } + } + + if (!remainDataIps.isEmpty()) { + //TODO SNAPSHOT + } + } + /** * Getter method for property sessionInterests. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java index 6c0dab457..a7935ad66 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java @@ -16,11 +16,15 @@ */ package com.alipay.sofa.registry.server.session.remoting.handler; +import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.net.NetUtil; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.RemotingException; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -31,6 +35,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * @@ -56,20 +61,32 @@ public class ClientNodeConnectionHandler extends AbstractServerHandler { @Autowired private ExecutorManager executorManager; + @Autowired + private SessionServerConfig sessionServerConfig; + + @Autowired + private Exchange boltExchange; + @Override public HandlerType getType() { return HandlerType.LISENTER; } + @Override + public void connected(Channel channel) throws RemotingException { + super.connected(channel); + fireReNewDatum(channel); + } + @Override public void disconnected(Channel channel) throws RemotingException { super.disconnected(channel); fireCancelClient(channel); } - public void fireCancelClient(Channel channel) { + private void fireCancelClient(Channel channel) { //avoid block connect ConnectionEventExecutor thread pool - executorManager.getDisconnectClientExecutor().execute(()->{ + executorManager.getConnectClientExecutor().execute(()->{ String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); if(checkCache(connectId)) { @@ -103,4 +120,20 @@ private boolean checkWatcher(String connectId) { Map subMap = sessionWatchers.queryByConnectId(connectId); return subMap != null && !subMap.isEmpty(); } + + private void fireReNewDatum(Channel channel){ + + executorManager.getConnectClientExecutor().execute(()-> { + String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); + executorManager.getAsyncHashedWheelTimerTask().newTimeout(connectId, timerOut -> sessionRegistry.reNewDatum(connectId), + sessionServerConfig.getReNewDatumWheelTaskDelay(), TimeUnit.MILLISECONDS, + () -> { + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + + Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); + + return channelClient != null && channel.isConnected(); + }); + }); + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index cd11a6ae6..378a1fa66 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -21,7 +21,9 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.task.scheduler.AsyncHashedWheelTimerTask; import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.util.NamedThreadFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -57,7 +59,9 @@ public class ExecutorManager { private final ThreadPoolExecutor accessDataExecutor; private final ThreadPoolExecutor dataChangeRequestExecutor; private final ThreadPoolExecutor pushTaskExecutor; - private final ThreadPoolExecutor disconnectClientExecutor; + private final ThreadPoolExecutor connectClientExecutor; + + private AsyncHashedWheelTimer asyncHashedWheelTimer; private SessionServerConfig sessionServerConfig; @@ -79,6 +83,8 @@ public class ExecutorManager { @Autowired private NodeExchanger dataNodeExchanger; + private AsyncHashedWheelTimerTask asyncHashedWheelTimerTask; + private Map reportExecutors = new HashMap<>(); private static final String PUSH_TASK_EXECUTOR = "PushTaskExecutor"; @@ -91,7 +97,7 @@ public class ExecutorManager { private static final String PUSH_TASK_CLOSURE_CHECK_EXECUTOR = "PushTaskClosureCheckExecutor"; - private static final String DISCONNECT_CLIENT_EXECUTOR = "DisconnectClientExecutor"; + private static final String CONNECT_CLIENT_EXECUTOR = "ConnectClientExecutor"; public ExecutorManager(SessionServerConfig sessionServerConfig) { @@ -159,13 +165,17 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(10000), new NamedThreadFactory("PushTaskClosureCheck", true))); - disconnectClientExecutor = reportExecutors.computeIfAbsent(DISCONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( - DISCONNECT_CLIENT_EXECUTOR, sessionServerConfig.getDisconnectClientExecutorMinPoolSize(), - sessionServerConfig.getDisconnectClientExecutorMaxPoolSize(), 60L, + connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( + CONNECT_CLIENT_EXECUTOR, sessionServerConfig.getConnectClientExecutorMinPoolSize(), + sessionServerConfig.getConnectClientExecutorMaxPoolSize(), 60L, TimeUnit.SECONDS, - new LinkedBlockingQueue(sessionServerConfig.getDisconnectClientExecutorQueueSize()), + new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), new NamedThreadFactory("DisconnectClientExecutor", true))); + + asyncHashedWheelTimerTask = new AsyncHashedWheelTimerTask("Registry-ReNewDatumTask-WheelTimer", + sessionServerConfig.getReNewDatumWheelTicksDuration(),TimeUnit.MILLISECONDS, + sessionServerConfig.getReNewDatumWheelTicksSize()); } public void startScheduler() { @@ -207,6 +217,8 @@ public void startScheduler() { sessionServerConfig.getSchedulerConnectDataExpBackOffBound(), () -> dataNodeExchanger.connectServer()), sessionServerConfig.getSchedulerConnectDataFirstDelay(), TimeUnit.SECONDS); + + } public void stopScheduler() { @@ -257,8 +269,8 @@ public void stopScheduler() { pushTaskClosureExecutor.shutdown(); } - if (disconnectClientExecutor != null && !disconnectClientExecutor.isShutdown()) { - disconnectClientExecutor.shutdown(); + if (connectClientExecutor != null && !connectClientExecutor.isShutdown()) { + connectClientExecutor.shutdown(); } } @@ -286,8 +298,12 @@ public ExecutorService getPushTaskClosureExecutor() { return pushTaskClosureExecutor; } - public ThreadPoolExecutor getDisconnectClientExecutor() { - return disconnectClientExecutor; + public ThreadPoolExecutor getConnectClientExecutor() { + return connectClientExecutor; + } + + public AsyncHashedWheelTimerTask getAsyncHashedWheelTimerTask() { + return asyncHashedWheelTimerTask; } } \ No newline at end of file From 175af5be842851c82fb6eb8e7877b1e4af8b1f16 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 11 Jun 2019 15:15:15 +0800 Subject: [PATCH 035/161] add WriteDataAcceptor --- .../bootstrap/SessionServerConfiguration.java | 7 ++ .../session/correction/WriteDataAcceptor.java | 50 +++++++++ .../correction/WriteDataAcceptorImpl.java | 71 ++++++++++++ .../correction/WriteDataProcessor.java | 101 ++++++++++++++++++ .../session/correction/WriteDataRequest.java | 43 ++++++++ .../session/node/service/DataNodeService.java | 15 +++ .../node/service/DataNodeServiceImpl.java | 26 ++++- .../session/registry/SessionRegistry.java | 24 ++++- 8 files changed, 335 insertions(+), 2 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index abb036d8d..a1d8316e6 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -24,6 +24,8 @@ import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumCacheGenerator; import com.alipay.sofa.registry.server.session.cache.SessionCacheService; +import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptor; +import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptorImpl; import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestServiceImpl; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; @@ -612,5 +614,10 @@ public static class SessionReNewDatumConfiguration { public PublisherDigestService publisherDigestService() { return new PublisherDigestServiceImpl(); } + + @Bean + public WriteDataAcceptor writeDataAcceptor() { + return new WriteDataAcceptorImpl(); + } } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java new file mode 100644 index 000000000..88a672acb --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +/** + * + * @author shangyu.wh + * @version 1.0: WriteDataAcceptor.java, v 0.1 2019-06-11 15:08 shangyu.wh Exp $ + */ +public interface WriteDataAcceptor { + + /** + * accept all write data request + * @param request + */ + void accept(WriteDataRequest request); + + /** + * halt write data process of connectId + * @param connectId + * @return + */ + boolean halt(String connectId); + + /** + * resume write data process of connectId + * @param connectId + */ + void resume(String connectId); + + /** + * remove processor of connectId + * @param connectId + */ + void remove(String connectId); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java new file mode 100644 index 000000000..f7822c739 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * + * @author shangyu.wh + * @version 1.0: WriteDataAcceptor.java, v 0.1 2019-06-06 12:45 shangyu.wh Exp $ + */ +public class WriteDataAcceptorImpl implements WriteDataAcceptor { + + private static final Logger LOGGER = LoggerFactory + .getLogger(WriteDataAcceptorImpl.class); + + /** + * acceptor for all write data request + * key:connectId + * value:writeRequest processor + * + */ + private Map writeDataProcessors = new ConcurrentHashMap(); + + public void accept(WriteDataRequest request){ + + String connectId = request.getConnectId(); + WriteDataProcessor writeDataProcessor = writeDataProcessors.computeIfAbsent(connectId, + key -> new WriteDataProcessor(connectId)); + + writeDataProcessor.process(request); + } + + public boolean halt(String connectId) { + + WriteDataProcessor writeDataProcessor = writeDataProcessors.get(connectId); + if (writeDataProcessor != null) { + return writeDataProcessor.halt(); + } + return false; + } + + public void resume(String connectId) { + WriteDataProcessor writeDataProcessor = writeDataProcessors.get(connectId); + if (writeDataProcessor != null) { + writeDataProcessor.resume(); + } + } + + public void remove(String connectId) { + writeDataProcessors.remove(connectId); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java new file mode 100644 index 000000000..6c82f3147 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; + +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +/** + * + * @author shangyu.wh + * @version 1.0: WriteDataProcessor.java, v 0.1 2019-06-06 12:50 shangyu.wh Exp $ + */ +public class WriteDataProcessor { + + private static final Logger LOGGER = LoggerFactory + .getLogger(WriteDataAcceptorImpl.class); + + private long beginTimestamp; + + private AtomicLong lastUpdateTimestamp = new AtomicLong(0); + + private AtomicBoolean writeDataLock = new AtomicBoolean(false); + + private BlockingDeque acceptorQueue = new LinkedBlockingDeque(); + + private final String connectId; + + public WriteDataProcessor(String connectId) { + this.connectId = connectId; + this.beginTimestamp = System.currentTimeMillis(); + this.lastUpdateTimestamp.set(beginTimestamp); + } + + public void refreashUpdateTime() { + lastUpdateTimestamp.set(System.currentTimeMillis()); + } + + public boolean checkLastUpdateTimes(long duration) { + final long age = System.currentTimeMillis() - lastUpdateTimestamp.get(); + return age > duration; + } + + public long getLastUpdateTimestap() { + return lastUpdateTimestamp.get(); + } + + public boolean halt() { + return writeDataLock.compareAndSet(false, true); + } + + public void resume() { + writeDataLock.compareAndSet(true, false); + } + + public void process(WriteDataRequest request) { + + if (writeDataLock.get()) { + acceptorQueue.add(request); + } else { + while (!acceptorQueue.isEmpty()) { + WriteDataRequest writeDataRequest = acceptorQueue.poll(); + doHandle(writeDataRequest); + } + doHandle(request); + } + + } + + private void doHandle(WriteDataRequest request) { + switch (request.getRequestType()) { + case PUBLISHER: + break; + case CLIENT_OFF: + break; + case UN_PUBLISHER: + break; + default: + LOGGER.warn("request type, {}", request); + + } + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java new file mode 100644 index 000000000..1b31ad234 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.correction; + +/** + * + * @author shangyu.wh + * @version 1.0: WriteDataRequest.java, v 0.1 2019-06-06 18:42 shangyu.wh Exp $ + */ +public interface WriteDataRequest { + + /** + * The enum for request type + */ + enum WriteDataRequestType { + PUBLISHER, UN_PUBLISHER, CLIENT_OFF + } + + /** + * Gets request body. + * + * @return the request body + */ + T getRequestBody(); + + WriteDataRequestType getRequestType(); + + String getConnectId(); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java index 5c9eeb46d..73d74ddbb 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java @@ -97,6 +97,21 @@ public interface DataNodeService { void registerSessionProcessId(SessionServerRegisterRequest sessionServerRegisterRequest, URL dataUrl); + /** + * check publisher digest same as session current store,and reNew the lastUpdateTime of this connectId + * @param dataIpAddress + * @param connectId + * @param digest + * @return + */ Boolean reNewDatum(String dataIpAddress, String connectId, String digest); + /** + * Correct the publishers information of this connectId on dataServer + * @param connectId + * @param dataIpAddress + * @param publishers + */ + void rectifyDatum(String connectId, String dataIpAddress, List publishers); + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index f1152c637..d6e7b4d32 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.session.node.service; import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.ReNewDatumRequest; @@ -467,7 +468,7 @@ private URL getUrl(String dataInfoId) { return null; } - public Boolean reNewDatum(String dataIpAddress, String connectId, String digest) { + public Boolean reNewDatum(String connectId, String dataIpAddress, String digest) { try { Request request = new Request() { @@ -508,4 +509,27 @@ public URL getRequestUrl() { } } + public void rectifyDatum(String connectId, String dataIpAddress, List publishers) { + + try { + Request request = new Request() { + @Override + public DatumSnapshotRequest getRequestBody() { + return new DatumSnapshotRequest(connectId, dataIpAddress, publishers); + } + + @Override + public URL getRequestUrl() { + return new URL(dataIpAddress, sessionServerConfig.getDataServerPort()); + } + }; + + dataNodeExchanger.request(request); + + } catch (RequestException e) { + LOGGER.error("DataNodeService rectify Datum error! " + e.getRequestMessage(), e); + throw new RuntimeException("DataNodeService rectify Datum error! " + + e.getRequestMessage(), e); + } + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index cb74154da..f6545fcfc 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -29,6 +29,8 @@ import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptor; +import com.alipay.sofa.registry.server.session.correction.WriteDataRequest; import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; @@ -111,6 +113,9 @@ public class SessionRegistry implements Registry { @Autowired private PublisherDigestService publisherDigestService; + @Autowired + private WriteDataAcceptor writeDataAcceptor; + @Override public void register(StoreData storeData) { @@ -121,7 +126,24 @@ public void register(StoreData storeData) { case PUBLISHER: Publisher publisher = (Publisher) storeData; - dataNodeService.register(publisher); + //dataNodeService.register(publisher); + + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return publisher; + } + + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.PUBLISHER; + } + + @Override + public String getConnectId() { + return publisher.getClientId(); + } + }); sessionDataStore.add(publisher); From 5456972e3a8f7e7279e9aae5cab7937ca7796125 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 17 Jun 2019 19:46:27 +0800 Subject: [PATCH 036/161] session renew/expired module --- pom.xml | 2 +- .../common/model/DatumSnapshotRequest.java | 38 ++- .../common/model/ReNewDatumRequest.java | 39 ++- .../model/constants/ValueConstants.java | 2 + .../registry/task/listener/TaskEvent.java | 15 +- .../DataServerBeanConfiguration.java | 2 + .../data/bootstrap/DataServerBootstrap.java | 2 +- .../data/correction/DatumLeaseManager.java | 34 ++- .../LocalDataServerCleanHandler.java | 15 +- .../handler/MetaServerChangeEventHandler.java | 15 +- .../handler/DatumSnapshotHandler.java | 23 +- .../handler/ReNewDatumHandler.java | 14 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/logback-spring.xml | 25 ++ .../src/main/resources/application.properties | 6 +- .../src/main/resources/logback-spring.xml | 25 ++ .../server/meta/registry/Registry.java | 6 +- .../server/meta/store/StoreService.java | 10 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/logback-spring.xml | 25 ++ .../WriteDataAcceptor.java | 16 +- .../WriteDataAcceptorImpl.java | 39 +-- .../session/acceptor/WriteDataProcessor.java | 262 ++++++++++++++++++ .../WriteDataRequest.java | 5 +- .../bootstrap/SessionServerConfig.java | 10 + .../bootstrap/SessionServerConfigBean.java | 108 +++++++- .../bootstrap/SessionServerConfiguration.java | 64 +++-- .../correction/WriteDataProcessor.java | 101 ------- .../service/PublisherDigestService.java | 44 --- .../service/PublisherDigestServiceImpl.java | 96 ------- .../listener/DatumSnapshotTaskListener.java | 74 +++++ .../listener/PublishDataTaskListener.java | 74 +++++ .../listener/ReNewDatumTaskListener.java | 79 ++++++ .../listener/UnpublishDataTaskListener.java | 95 +++++++ .../session/node/service/DataNodeService.java | 21 +- .../node/service/DataNodeServiceImpl.java | 50 ++-- .../server/session/registry/Registry.java | 6 +- .../session/registry/SessionRegistry.java | 254 +++++++++++------ .../handler/ClientNodeConnectionHandler.java | 49 ++-- .../scheduler/task/CancelDataTask.java | 27 +- .../scheduler/task/DatumSnapshotTask.java | 76 +++++ .../scheduler/task/PublishDataTask.java | 72 +++++ .../scheduler/task/ReNewDatumTask.java | 99 +++++++ .../scheduler/task/UnpublishDataTask.java | 74 +++++ .../session/store/SessionDataStore.java | 44 +-- .../src/main/resources/application.properties | 6 +- .../src/main/resources/logback-spring.xml | 25 ++ 47 files changed, 1594 insertions(+), 582 deletions(-) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/{correction => acceptor}/WriteDataAcceptor.java (78%) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/{correction => acceptor}/WriteDataAcceptorImpl.java (62%) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/{correction => acceptor}/WriteDataRequest.java (88%) delete mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java delete mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java delete mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java diff --git a/pom.xml b/pom.xml index 1b15dc405..13a3e8cb5 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 1.2.4 4.0.2 2.4 - [9.4.17.v20190418,) + 9.4.17.v20190418 ${user.dir} -Dnetwork_interface_denylist=docker0 diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java index 2270f5c54..19ca2d5e1 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java @@ -16,27 +16,29 @@ */ package com.alipay.sofa.registry.common.model; -import com.alipay.sofa.registry.common.model.store.Publisher; - +import java.io.Serializable; import java.util.List; +import com.alipay.sofa.registry.common.model.store.Publisher; + /** * * @author shangyu.wh * @version $Id: DatumSnapshotRequest.java, v 0.1 2019-05-30 11:09 shangyu.wh Exp $ */ -public class DatumSnapshotRequest { +public class DatumSnapshotRequest implements Serializable { + + private static final long serialVersionUID = 2193212935059863551L; private final String connectId; - private final String dataServerAddress; + private final String dataServerIp; private final List publishers; - public DatumSnapshotRequest(String connectId, String dataServerAddress, - List publishers) { + public DatumSnapshotRequest(String connectId, String dataServerIp, List publishers) { this.connectId = connectId; - this.dataServerAddress = dataServerAddress; + this.dataServerIp = dataServerIp; this.publishers = publishers; } @@ -50,12 +52,12 @@ public String getConnectId() { } /** - * Getter method for property dataServerAddress. + * Getter method for property dataServerIp. * - * @return property value of dataServerAddress + * @return property value of dataServerIp */ - public String getDataServerAddress() { - return dataServerAddress; + public String getDataServerIp() { + return dataServerIp; } /** @@ -66,4 +68,18 @@ public String getDataServerAddress() { public List getPublishers() { return publishers; } + + /** + * @see Object#toString() + */ + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("DatumSnapshotRequest{"); + sb.append("connectId='").append(connectId).append('\''); + sb.append(", dataServerIp='").append(dataServerIp).append('\''); + sb.append(", publishers=").append(publishers); + sb.append(", super=").append(super.toString()); + sb.append('}'); + return sb.toString(); + } } \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java index bcd4e43fa..6399606e1 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java @@ -16,22 +16,27 @@ */ package com.alipay.sofa.registry.common.model; +import java.io.Serializable; + /** * * @author shangyu.wh + * @author kezhu.wukz * @version $Id: RenewRequest.java, v 0.1 2019-05-30 10:58 shangyu.wh Exp $ */ -public class ReNewDatumRequest { +public class ReNewDatumRequest implements Serializable { + + private static final long serialVersionUID = 683097441984338311L; - private final String connectId; + private final String connectId; - private final String dataServerAddress; + private final String dataServerIp; - private final String digestSum; + private final String digestSum; - public ReNewDatumRequest(String connectId, String dataServerAddress, String digestSum) { + public ReNewDatumRequest(String connectId, String dataServerIp, String digestSum) { this.connectId = connectId; - this.dataServerAddress = dataServerAddress; + this.dataServerIp = dataServerIp; this.digestSum = digestSum; } @@ -45,12 +50,12 @@ public String getConnectId() { } /** - * Getter method for property dataServerAddress. + * Getter method for property dataServerIp. * - * @return property value of dataServerAddress + * @return property value of dataServerIp */ - public String getDataServerAddress() { - return dataServerAddress; + public String getDataServerIp() { + return dataServerIp; } /** @@ -61,4 +66,18 @@ public String getDataServerAddress() { public String getDigestSum() { return digestSum; } + + /** + * @see Object#toString() + */ + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ReNewDatumRequest{"); + sb.append("connectId='").append(connectId).append('\''); + sb.append(", dataServerIp='").append(dataServerIp).append('\''); + sb.append(", digestSum='").append(digestSum).append('\''); + sb.append(", super=").append(super.toString()); + sb.append('}'); + return sb.toString(); + } } \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java index bd6f20409..45fc40782 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java @@ -56,4 +56,6 @@ public class ValueConstants { public static final String STOP_PUSH_DATA_SWITCH_DATA_ID = "session.stop.push.data.switch#@#9600#@#CONFIG"; + public static final String LOGGER_NAME_RENEW = "RENEW-LOGGER"; + } diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index 3e1d354a4..6f8cd2ae6 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -16,12 +16,12 @@ */ package com.alipay.sofa.registry.task.listener; -import com.alipay.sofa.registry.task.TaskClosure; - import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.alipay.sofa.registry.task.TaskClosure; + /** * * @author shangyu.wh @@ -43,9 +43,12 @@ public enum TaskType { "SyncPublisherTask"), SYNC_SUBSCRIBER_TASK( "SyncSubscriberTask"), SESSION_REGISTER_DATA_TASK( "SessionRegisterDataTask"), PROVIDE_DATA_CHANGE_FETCH_TASK( - "ProvideDataChangeFetchTask"), - - SUBSCRIBER_MULTI_FETCH_TASK("SubscriberMultiFetchTask"), + "ProvideDataChangeFetchTask"), SUBSCRIBER_MULTI_FETCH_TASK( + "SubscriberMultiFetchTask"), PUBLISH_DATA_TASK( + "PublishDataTask"), UNPUBLISH_DATA_TASK( + "UnpublishDataTask"), RENEW_DATUM_TASK( + "ReNewDatumTask"), DATUM_SNAPSHOT_TASK( + "DatumSnapshotTask"), //Session Adapter task USER_DATA_ELEMENT_PUSH_TASK("UserDataElementPushTask"), USER_DATA_ELEMENT_MULTI_PUSH_TASK( @@ -55,7 +58,7 @@ public enum TaskType { SESSION_NODE_CHANGE_PUSH_TASK("SessionNodeChangePushTask"), DATA_NODE_CHANGE_PUSH_TASK( "DataNodeChangePushTask"), RECEIVE_STATUS_CONFIRM_NOTIFY_TASK( "ReceiveStatusConfirmNotifyTask"), PERSISTENCE_DATA_CHANGE_NOTIFY_TASK( - "PersistenceDataChangeNotifyTask"); + "PersistenceDataChangeNotifyTask"), ; private String name; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 9f9baefec..e750da1b7 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -190,6 +190,8 @@ public Collection serverHandlers(DataServerConfig dataSer list.add(sessionServerRegisterHandler()); list.add(unPublishDataHandler()); list.add(dataServerConnectionHandler()); + list.add(reNewDatumHandler()); + list.add(datumSnapshotHandler()); return list; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index 622fd7c84..f340d9a3d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -192,7 +192,7 @@ private void startScheduler() { try { if (schedulerStarted.compareAndSet(false, true)) { syncDataScheduler.startScheduler(); - // start all startTask except renew task + // start all startTask except correction task eventCenter.post(new StartTaskEvent( Arrays.stream(StartTaskTypeEnum.values()).filter(type -> type != StartTaskTypeEnum.RENEW) .collect( diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java index 8e572f6f6..f1a9524e6 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java @@ -26,6 +26,7 @@ import org.apache.commons.lang.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; @@ -46,6 +47,10 @@ public class DatumLeaseManager { .getLogger(DatumLeaseManager.class); private static final TimeZone TIME_ZONE = TimeZone .getTimeZone("Asia/Shanghai"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DatumLeaseManager]"); /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ private final Map connectIdReNewTimestampMap = new ConcurrentHashMap<>(); @@ -54,6 +59,7 @@ public class DatumLeaseManager { private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); private final AsyncHashedWheelTimer datumAsyncHashedWheelTimer; + private final ThreadPoolExecutor datumExpiredCheckExecutor; @Autowired @@ -90,6 +96,10 @@ public void executionFailed(Throwable e) { * record the reNew timestamp */ public void reNew(String connectId) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("reNew: connectId={}", connectId); + } + // record the reNew timestamp connectIdReNewTimestampMap.put(connectId, System.currentTimeMillis()); // try to trigger evict task @@ -110,8 +120,8 @@ private void scheduleEvictTask(String connectId, long delaySec) { } datumAsyncHashedWheelTimer.newTimeout(_timeout -> { - boolean continued = true; - long nextDelaySec = 0; + boolean continued = true; + long nextDelaySec = 0; try { // release lock locksForConnectId.remove(connectId); @@ -119,6 +129,10 @@ private void scheduleEvictTask(String connectId, long delaySec) { // get lastReNewTime of this connectId long lastReNewTime = connectIdReNewTimestampMap.get(connectId); + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("EvictTask: connectId={}, lastReNewTime={}", connectId, format(lastReNewTime)); + } + /* * 1. lastReNewTime expires, then: * - build ClientOffEvent and hand it to DataChangeEventCenter. @@ -129,16 +143,14 @@ private void scheduleEvictTask(String connectId, long delaySec) { boolean isExpired = System.currentTimeMillis() - lastReNewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; if (isExpired) { - LOGGER.info("ConnectId({}) expired, lastReNewTime is {}", connectId, - DateFormatUtils.format(lastReNewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE)); + LOGGER.info("ConnectId({}) expired, lastReNewTime is {}", connectId, format(lastReNewTime)); connectIdReNewTimestampMap.remove(connectId, lastReNewTime); disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), dataServerConfig.getClientOffDelayMs() * 10)); continued = false; } else { - nextDelaySec = - dataServerConfig.getDatumTimeToLiveSec() - - (System.currentTimeMillis() - lastReNewTime) / 1000L; + nextDelaySec = dataServerConfig.getDatumTimeToLiveSec() + - (System.currentTimeMillis() - lastReNewTime) / 1000L; nextDelaySec = nextDelaySec <= 0 ? 1 : nextDelaySec; } @@ -150,5 +162,13 @@ private void scheduleEvictTask(String connectId, long delaySec) { } }, delaySec, TimeUnit.SECONDS); + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("scheduleEvictTask: connectId={}, delaySec={}", connectId, delaySec); + } + + } + + private String format(long lastReNewTime) { + return DateFormatUtils.format(lastReNewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE); } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java index fe498dbae..fe5f919dc 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.data.correction; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.consistency.hash.ConsistentHash; @@ -29,13 +37,6 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.util.DelayItem; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.DelayQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; /** * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java index 9b035c98b..e516f5160 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.data.event.handler; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + import com.alipay.remoting.Connection; import com.alipay.sofa.jraft.entity.PeerId; import com.alipay.sofa.registry.common.model.metaserver.DataNode; @@ -36,13 +44,6 @@ import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; import com.alipay.sofa.registry.server.data.util.TimeUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; /** * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index ef7560800..3bdd3b315 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -24,7 +24,7 @@ import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -46,7 +46,12 @@ public class DatumSnapshotHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory.getLogger(DatumSnapshotHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DatumSnapshotHandler.class); + + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DatumSnapshotHandler]"); @Autowired private ForwardService forwardService; @@ -68,6 +73,10 @@ public void checkParam(DatumSnapshotRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, DatumSnapshotRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doHandle: request={}", request); + } + if (forwardService.needForward()) { LOGGER.warn("[forward] Snapshot request refused, request: {}", request); CommonResponse response = new CommonResponse(); @@ -76,10 +85,10 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { return response; } - Map pubMap = request.getPublishers().stream().collect( - Collectors.toMap(p -> p.getRegisterId(), p -> p)); - dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), dataServerConfig - .getLocalDataCenter(), pubMap)); + Map pubMap = request.getPublishers().stream() + .collect(Collectors.toMap(p -> p.getRegisterId(), p -> p)); + dataChangeEventCenter.onChange( + new DatumSnapshotEvent(request.getConnectId(), dataServerConfig.getLocalDataCenter(), pubMap)); // record the reNew timestamp datumLeaseManager.reNew(request.getConnectId()); @@ -99,7 +108,7 @@ public HandlerType getType() { @Override public Class interest() { - return ClientOffRequest.class; + return DatumSnapshotRequest.class; } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java index 50a95dabb..4a1776cd1 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java @@ -26,7 +26,7 @@ import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.ReNewDatumRequest; -import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -46,7 +46,11 @@ public class ReNewDatumHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory.getLogger(ReNewDatumHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ReNewDatumHandler.class); + + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[ReNewDatumHandler]"); @Autowired private ForwardService forwardService; @@ -62,6 +66,10 @@ public void checkParam(ReNewDatumRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, ReNewDatumRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doHandle: request={}", request); + } + if (forwardService.needForward()) { LOGGER.warn("[forward] Renew request refused, request: {}", request); CommonResponse response = new CommonResponse(); @@ -87,7 +95,7 @@ public HandlerType getType() { @Override public Class interest() { - return ClientOffRequest.class; + return ReNewDatumRequest.class; } @Override diff --git a/server/server/data/src/main/resources/application.properties b/server/server/data/src/main/resources/application.properties index 6a28ef486..af1a4799c 100644 --- a/server/server/data/src/main/resources/application.properties +++ b/server/server/data/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.main.banner-mode=LOG -#nodes.metaNode=: -#nodes.localDataCenter= +nodes.metaNode=DefaultDataCenter:localhost +nodes.localDataCenter=DefaultDataCenter #data.server.logging.level=INFO #data.server.logging.home=/home/admin/logs/registry/data diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index 269a9746b..710066ae3 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -71,6 +71,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${DATA_LOG_HOME}/registry-renew.log + + ${DATA_LOG_HOME}/registry-renew.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -265,6 +285,11 @@ + + + + + diff --git a/server/server/integration/src/main/resources/application.properties b/server/server/integration/src/main/resources/application.properties index 08a6b78f2..e5b9f95bb 100644 --- a/server/server/integration/src/main/resources/application.properties +++ b/server/server/integration/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.main.banner-mode=LOG -#nodes.metaNode=: -#nodes.localDataCenter= -#nodes.localRegion= +nodes.metaNode=DefaultDataCenter:localhost +nodes.localDataCenter=DefaultDataCenter +nodes.localRegion=DEFAULT_ZONE #server.logging.home=/home/admin/logs/registry #meta.server.logging.level=INFO diff --git a/server/server/integration/src/main/resources/logback-spring.xml b/server/server/integration/src/main/resources/logback-spring.xml index 30c158ca9..d7c5f558f 100644 --- a/server/server/integration/src/main/resources/logback-spring.xml +++ b/server/server/integration/src/main/resources/logback-spring.xml @@ -97,6 +97,26 @@ + + true + + DEBUG + + + ERROR + DENY + + ${LOG_HOME}/registry-renew.log + + ${LOG_HOME}/registry-renew.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -471,6 +491,11 @@ + + + + + diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java index 2bda79a84..9a5ee8ce3 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java @@ -16,13 +16,13 @@ */ package com.alipay.sofa.registry.server.meta.registry; +import java.util.List; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; -import java.util.List; - /** * * @author shangyu.wh @@ -59,7 +59,7 @@ public interface Registry { void evict(); /** - * renew node expire time + * reNew node expire time * @param node */ void reNew(T node, int duration); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java index 05d38de1b..d2bf3700d 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java @@ -16,15 +16,15 @@ */ package com.alipay.sofa.registry.server.meta.store; +import java.util.Collection; +import java.util.List; +import java.util.Map; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; -import java.util.Collection; -import java.util.List; -import java.util.Map; - /** * interface for node store service * @author shangyu.wh @@ -41,7 +41,7 @@ public interface StoreService { NodeChangeResult setNodes(List nodes); /** - * add new node,when renew request not found node will be add again + * add new node,when reNew request not found node will be add again * @param node * @return */ diff --git a/server/server/meta/src/main/resources/application.properties b/server/server/meta/src/main/resources/application.properties index 2449af5b3..4ad2a2b2d 100644 --- a/server/server/meta/src/main/resources/application.properties +++ b/server/server/meta/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.main.banner-mode=LOG -#nodes.metaNode=: -#nodes.localDataCenter= +nodes.metaNode=DefaultDataCenter:localhost +nodes.localDataCenter=DefaultDataCenter #meta.server.logging.level=INFO #meta.server.logging.home=/home/admin/logs/registry/meta diff --git a/server/server/meta/src/main/resources/logback-spring.xml b/server/server/meta/src/main/resources/logback-spring.xml index 0d5cb2faa..d248c369d 100644 --- a/server/server/meta/src/main/resources/logback-spring.xml +++ b/server/server/meta/src/main/resources/logback-spring.xml @@ -71,6 +71,26 @@ + + true + + ${LOG_LEVEL} + + + ERROR + DENY + + ${META_LOG_HOME}/registry-renew.log + + ${META_LOG_HOME}/registry-renew.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -257,6 +277,11 @@ + + + + + diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptor.java similarity index 78% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptor.java index 88a672acb..3f844b234 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptor.java @@ -14,10 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.session.correction; +package com.alipay.sofa.registry.server.session.acceptor; /** * + * @author kezhu.wukz * @author shangyu.wh * @version 1.0: WriteDataAcceptor.java, v 0.1 2019-06-11 15:08 shangyu.wh Exp $ */ @@ -29,19 +30,6 @@ public interface WriteDataAcceptor { */ void accept(WriteDataRequest request); - /** - * halt write data process of connectId - * @param connectId - * @return - */ - boolean halt(String connectId); - - /** - * resume write data process of connectId - * @param connectId - */ - void resume(String connectId); - /** * remove processor of connectId * @param connectId diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java similarity index 62% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java index f7822c739..fb0918768 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataAcceptorImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java @@ -14,23 +14,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.session.correction; - -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; +package com.alipay.sofa.registry.server.session.acceptor; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; + /** * + * @author kezhu.wukz * @author shangyu.wh * @version 1.0: WriteDataAcceptor.java, v 0.1 2019-06-06 12:45 shangyu.wh Exp $ */ public class WriteDataAcceptorImpl implements WriteDataAcceptor { - private static final Logger LOGGER = LoggerFactory - .getLogger(WriteDataAcceptorImpl.class); + @Autowired + private TaskListenerManager taskListenerManager; + + @Autowired + private SessionServerConfig sessionServerConfig; /** * acceptor for all write data request @@ -40,31 +46,14 @@ public class WriteDataAcceptorImpl implements WriteDataAcceptor { */ private Map writeDataProcessors = new ConcurrentHashMap(); - public void accept(WriteDataRequest request){ - + public void accept(WriteDataRequest request) { String connectId = request.getConnectId(); WriteDataProcessor writeDataProcessor = writeDataProcessors.computeIfAbsent(connectId, - key -> new WriteDataProcessor(connectId)); + key -> new WriteDataProcessor(connectId, taskListenerManager, sessionServerConfig)); writeDataProcessor.process(request); } - public boolean halt(String connectId) { - - WriteDataProcessor writeDataProcessor = writeDataProcessors.get(connectId); - if (writeDataProcessor != null) { - return writeDataProcessor.halt(); - } - return false; - } - - public void resume(String connectId) { - WriteDataProcessor writeDataProcessor = writeDataProcessors.get(connectId); - if (writeDataProcessor != null) { - writeDataProcessor.resume(); - } - } - public void remove(String connectId) { writeDataProcessors.remove(connectId); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java new file mode 100644 index 000000000..b931a4ccd --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -0,0 +1,262 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.acceptor; + +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.acceptor.WriteDataRequest.WriteDataRequestType; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import com.google.common.collect.Lists; + +/** + * + * @author kezhu.wukz + * @author shangyu.wh + * @version 1.0: WriteDataProcessor.java, v 0.1 2019-06-06 12:50 shangyu.wh Exp $ + */ +public class WriteDataProcessor { + + private static final Logger LOGGER = LoggerFactory + .getLogger(WriteDataProcessor.class); + + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[WriteDataProcessor]"); + + private final TaskListenerManager taskListenerManager; + + private final SessionServerConfig sessionServerConfig; + + private long beginTimestamp; + + private AtomicLong lastUpdateTimestamp = new AtomicLong(0); + + private AtomicBoolean writeDataLock = new AtomicBoolean(false); + + private ConcurrentLinkedQueue acceptorQueue = new ConcurrentLinkedQueue(); + + private final String connectId; + + public WriteDataProcessor(String connectId, TaskListenerManager taskListenerManager, + SessionServerConfig sessionServerConfig) { + this.connectId = connectId; + this.taskListenerManager = taskListenerManager; + this.sessionServerConfig = sessionServerConfig; + + this.beginTimestamp = System.currentTimeMillis(); + this.lastUpdateTimestamp.set(beginTimestamp); + } + + private boolean halt() { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("halt: connectId={}", connectId); + } + return writeDataLock.compareAndSet(false, true); + } + + public void resume() { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("resume: connectId={}", connectId); + } + flushQueue(); + writeDataLock.compareAndSet(true, false); + flushQueue(); + } + + public void process(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("process: connectId={}, requestType={}, requestBody={}", connectId, + request.getRequestType(), request.getRequestBody()); + } + if (request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT) { + doHandle(request); + } else { + if (writeDataLock.get()) { + acceptorQueue.add(request); + } else { + flushQueue(); + doHandle(request); + } + } + + if (isWriteRequest(request)) { + refreshUpdateTime(); + } + + } + + /** + * + * @param request + * @return + */ + private boolean isWriteRequest(WriteDataRequest request) { + return request.getRequestType() != WriteDataRequestType.RENEW_DATUM; + } + + /** + * Ensure that the queue data is sent out + */ + private void flushQueue() { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("flushQueue: connectId={}", connectId); + } + + while (!acceptorQueue.isEmpty()) { + WriteDataRequest writeDataRequest = acceptorQueue.poll(); + if (writeDataRequest == null) { + break; + } + doHandle(writeDataRequest); + } + } + + private void doHandle(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doHandle: connectId={}, requestType={}, requestBody={}", connectId, + request.getRequestType(), request.getRequestBody()); + } + + switch (request.getRequestType()) { + case PUBLISHER: { + // refreshUpdateTime(); + doPublishAsync(request); + } + break; + case UN_PUBLISHER: { + // refreshUpdateTime(); + doUnPublishAsync(request); + } + break; + case CLIENT_OFF: { + // refreshUpdateTime(); + doClientOffAsync(request); + } + break; + case RENEW_DATUM: { + if (inRenewAndSnapshotSilentPeriod()) { + return; + } + doReNewAsync(request); + } + break; + case DATUM_SNAPSHOT: { + if (inRenewAndSnapshotSilentPeriod()) { + return; + } + halt(); + doSnapshotAsync(request); + resume(); + } + break; + default: + LOGGER.warn("Unknown request type, requestType={}, requestBody={}", connectId, + request.getRequestType(), request.getRequestBody()); + + } + } + + private void doReNewAsync(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doReNewAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); + } + + ReNewDatumRequest reNewDatumRequest = (ReNewDatumRequest) request.getRequestBody(); + TaskEvent taskEvent = new TaskEvent(reNewDatumRequest, TaskType.RENEW_DATUM_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void doClientOffAsync(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doClientOffAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); + } + + String connectId = request.getConnectId(); + TaskEvent taskEvent = new TaskEvent(Lists.newArrayList(connectId), + TaskType.CANCEL_DATA_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void doUnPublishAsync(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doUnPublishAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); + } + + Publisher unPublisher = (Publisher) request.getRequestBody(); + TaskEvent taskEvent = new TaskEvent(unPublisher, TaskType.UNPUBLISH_DATA_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void doPublishAsync(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doPublishAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); + } + + Publisher publisher = (Publisher) request.getRequestBody(); + TaskEvent taskEvent = new TaskEvent(publisher, TaskType.PUBLISH_DATA_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void doSnapshotAsync(WriteDataRequest request) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("doSnapshotAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); + } + + DatumSnapshotRequest datumSnapshotRequest = (DatumSnapshotRequest) request.getRequestBody(); + TaskEvent taskEvent = new TaskEvent(datumSnapshotRequest, TaskType.DATUM_SNAPSHOT_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + + /** + * In silence, do not renew and snapshot + */ + private boolean inRenewAndSnapshotSilentPeriod() { + boolean inRenewAndSnapshotSilentPeriod = System.currentTimeMillis() + - this.lastUpdateTimestamp.get() < this.sessionServerConfig + .getRenewAndSnapshotSilentPeriodSec() * 1000L; + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug( + "inRenewAndSnapshotSilentPeriod: connectId={}, inRenewAndSnapshotSilentPeriod={}", + connectId, inRenewAndSnapshotSilentPeriod); + } + return inRenewAndSnapshotSilentPeriod; + } + + private void refreshUpdateTime() { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("refreshUpdateTime: connectId={}", connectId); + } + lastUpdateTimestamp.set(System.currentTimeMillis()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java similarity index 88% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java index 1b31ad234..a15c90025 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataRequest.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java @@ -14,10 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.session.correction; +package com.alipay.sofa.registry.server.session.acceptor; /** * + * @author kezhu.wukz * @author shangyu.wh * @version 1.0: WriteDataRequest.java, v 0.1 2019-06-06 18:42 shangyu.wh Exp $ */ @@ -27,7 +28,7 @@ public interface WriteDataRequest { * The enum for request type */ enum WriteDataRequestType { - PUBLISHER, UN_PUBLISHER, CLIENT_OFF + PUBLISHER, UN_PUBLISHER, CLIENT_OFF, RENEW_DATUM, DATUM_SNAPSHOT } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index c4cf36bc4..621f1dbfa 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -67,6 +67,14 @@ public interface SessionServerConfig { long getCancelDataTaskRetryIncrementDelay(); + int getPublishDataTaskRetryTimes(); + + int getUnpublishDataTaskRetryTimes(); + + int getDatumSnapshotTaskRetryTimes(); + + int getReNewDatumTaskRetryTimes(); + int getDataChangeFetchTaskRetryTimes(); int getSubscriberRegisterFetchRetryTimes(); @@ -146,4 +154,6 @@ public interface SessionServerConfig { boolean isInvalidForeverZone(String zoneId); boolean isInvalidIgnored(String dataId); + + int getRenewAndSnapshotSilentPeriodSec(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 4b0d433d4..93ba8d86f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -16,13 +16,13 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * The type Session server config bean. * @author shangyu.wh @@ -80,6 +80,14 @@ public class SessionServerConfigBean implements SessionServerConfig { private long cancelDataTaskRetryIncrementDelay = 200; + private int publishDataTaskRetryTimes = 3; + + private int unpublishDataTaskRetryTimes = 3; + + private int datumSnapshotTaskRetryTimes = 3; + + private int reNewDatumTaskRetryTimes = 3; + private int dataChangeFetchTaskRetryTimes = 3; private int subscriberRegisterFetchRetryTimes = 3; @@ -173,6 +181,8 @@ public class SessionServerConfigBean implements SessionServerConfig { private Set pushEmptyDataDataIdPrefixesSet; + private int renewAndSnapshotSilentPeriodSec = 20; + //end config for enterprise version private CommonConfig commonConfig; @@ -185,6 +195,100 @@ public SessionServerConfigBean(CommonConfig commonConfig) { this.commonConfig = commonConfig; } + /** + * Getter method for property renewAndSnapshotSilentPeriodSec. + * + * @return property value of renewAndSnapshotSilentPeriodSec + */ + public int getRenewAndSnapshotSilentPeriodSec() { + return renewAndSnapshotSilentPeriodSec; + } + + /** + * Setter method for property renewAndSnapshotSilentPeriodSec . + * + * @param renewAndSnapshotSilentPeriodSec value to be assigned to property renewAndSnapshotSilentPeriodSec + */ + public void setRenewAndSnapshotSilentPeriodSec(int renewAndSnapshotSilentPeriodSec) { + this.renewAndSnapshotSilentPeriodSec = renewAndSnapshotSilentPeriodSec; + } + + /** + * Getter method for property publishDataTaskRetryTimes. + * + * @return property value of publishDataTaskRetryTimes + */ + @Override + public int getPublishDataTaskRetryTimes() { + return publishDataTaskRetryTimes; + } + + /** + * Setter method for property publishDataTaskRetryTimes . + * + * @param publishDataTaskRetryTimes value to be assigned to property publishDataTaskRetryTimes + */ + public void setPublishDataTaskRetryTimes(int publishDataTaskRetryTimes) { + this.publishDataTaskRetryTimes = publishDataTaskRetryTimes; + } + + /** + * Getter method for property unpublishDataTaskRetryTimes. + * + * @return property value of unpublishDataTaskRetryTimes + */ + @Override + public int getUnpublishDataTaskRetryTimes() { + return unpublishDataTaskRetryTimes; + } + + /** + * Setter method for property unpublishDataTaskRetryTimes . + * + * @param unpublishDataTaskRetryTimes value to be assigned to property unpublishDataTaskRetryTimes + */ + public void setUnpublishDataTaskRetryTimes(int unpublishDataTaskRetryTimes) { + this.unpublishDataTaskRetryTimes = unpublishDataTaskRetryTimes; + } + + /** + * Getter method for property datumSnapshotTaskRetryTimes. + * + * @return property value of datumSnapshotTaskRetryTimes + */ + @Override + public int getDatumSnapshotTaskRetryTimes() { + return datumSnapshotTaskRetryTimes; + } + + /** + * Setter method for property datumSnapshotTaskRetryTimes . + * + * @param datumSnapshotTaskRetryTimes value to be assigned to property datumSnapshotTaskRetryTimes + */ + public void setDatumSnapshotTaskRetryTimes(int datumSnapshotTaskRetryTimes) { + this.datumSnapshotTaskRetryTimes = datumSnapshotTaskRetryTimes; + } + + /** + * Getter method for property reNewDatumTaskRetryTimes. + * + * @return property value of reNewDatumTaskRetryTimes + */ + @Override + public int getReNewDatumTaskRetryTimes() { + return reNewDatumTaskRetryTimes; + } + + /** + * Setter method for property reNewDatumTaskRetryTimes . + * + * @param reNewDatumTaskRetryTimes value to be assigned to property reNewDatumTaskRetryTimes + */ + public void setReNewDatumTaskRetryTimes(int reNewDatumTaskRetryTimes) { + this.reNewDatumTaskRetryTimes = reNewDatumTaskRetryTimes; + } + /** * Getter method for property serverPort. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index a1d8316e6..743358b7a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -16,28 +16,41 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; +import java.util.ArrayList; +import java.util.Collection; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; import com.alipay.sofa.registry.remoting.jersey.exchange.JerseyExchange; +import com.alipay.sofa.registry.server.session.acceptor.WriteDataAcceptor; +import com.alipay.sofa.registry.server.session.acceptor.WriteDataAcceptorImpl; import com.alipay.sofa.registry.server.session.cache.CacheGenerator; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumCacheGenerator; import com.alipay.sofa.registry.server.session.cache.SessionCacheService; -import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptor; -import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptorImpl; -import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; -import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestServiceImpl; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchCloudTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.DataPushTaskListener; +import com.alipay.sofa.registry.server.session.listener.DatumSnapshotTaskListener; import com.alipay.sofa.registry.server.session.listener.ProvideDataChangeFetchTaskListener; +import com.alipay.sofa.registry.server.session.listener.PublishDataTaskListener; +import com.alipay.sofa.registry.server.session.listener.ReNewDatumTaskListener; import com.alipay.sofa.registry.server.session.listener.ReceivedConfigDataPushTaskListener; import com.alipay.sofa.registry.server.session.listener.ReceivedDataMultiPushTaskListener; import com.alipay.sofa.registry.server.session.listener.SessionRegisterDataTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberMultiFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberRegisterFetchTaskListener; +import com.alipay.sofa.registry.server.session.listener.UnpublishDataTaskListener; import com.alipay.sofa.registry.server.session.listener.WatcherRegisterFetchTaskListener; import com.alipay.sofa.registry.server.session.node.DataNodeManager; import com.alipay.sofa.registry.server.session.node.MetaNodeManager; @@ -113,16 +126,6 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import java.util.ArrayList; -import java.util.Collection; /** * @@ -512,6 +515,34 @@ public TaskListener cancelDataTaskListener(TaskListenerManager taskListenerManag return taskListener; } + @Bean + public TaskListener datumSnapshotTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new DatumSnapshotTaskListener(); + taskListenerManager.addTaskListener(taskListener); + return taskListener; + } + + @Bean + public TaskListener publishDataTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new PublishDataTaskListener(); + taskListenerManager.addTaskListener(taskListener); + return taskListener; + } + + @Bean + public TaskListener reNewDatumTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new ReNewDatumTaskListener(); + taskListenerManager.addTaskListener(taskListener); + return taskListener; + } + + @Bean + public TaskListener unpublishDataTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new UnpublishDataTaskListener(); + taskListenerManager.addTaskListener(taskListener); + return taskListener; + } + @Bean public TaskListenerManager taskListenerManager() { return new DefaultTaskListenerManager(); @@ -610,11 +641,6 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { @Configuration public static class SessionReNewDatumConfiguration { - @Bean - public PublisherDigestService publisherDigestService() { - return new PublisherDigestServiceImpl(); - } - @Bean public WriteDataAcceptor writeDataAcceptor() { return new WriteDataAcceptorImpl(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java deleted file mode 100644 index 6c82f3147..000000000 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/WriteDataProcessor.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.server.session.correction; - -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; - -import java.util.concurrent.BlockingDeque; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; - -/** - * - * @author shangyu.wh - * @version 1.0: WriteDataProcessor.java, v 0.1 2019-06-06 12:50 shangyu.wh Exp $ - */ -public class WriteDataProcessor { - - private static final Logger LOGGER = LoggerFactory - .getLogger(WriteDataAcceptorImpl.class); - - private long beginTimestamp; - - private AtomicLong lastUpdateTimestamp = new AtomicLong(0); - - private AtomicBoolean writeDataLock = new AtomicBoolean(false); - - private BlockingDeque acceptorQueue = new LinkedBlockingDeque(); - - private final String connectId; - - public WriteDataProcessor(String connectId) { - this.connectId = connectId; - this.beginTimestamp = System.currentTimeMillis(); - this.lastUpdateTimestamp.set(beginTimestamp); - } - - public void refreashUpdateTime() { - lastUpdateTimestamp.set(System.currentTimeMillis()); - } - - public boolean checkLastUpdateTimes(long duration) { - final long age = System.currentTimeMillis() - lastUpdateTimestamp.get(); - return age > duration; - } - - public long getLastUpdateTimestap() { - return lastUpdateTimestamp.get(); - } - - public boolean halt() { - return writeDataLock.compareAndSet(false, true); - } - - public void resume() { - writeDataLock.compareAndSet(true, false); - } - - public void process(WriteDataRequest request) { - - if (writeDataLock.get()) { - acceptorQueue.add(request); - } else { - while (!acceptorQueue.isEmpty()) { - WriteDataRequest writeDataRequest = acceptorQueue.poll(); - doHandle(writeDataRequest); - } - doHandle(request); - } - - } - - private void doHandle(WriteDataRequest request) { - switch (request.getRequestType()) { - case PUBLISHER: - break; - case CLIENT_OFF: - break; - case UN_PUBLISHER: - break; - default: - LOGGER.warn("request type, {}", request); - - } - } -} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java deleted file mode 100644 index 85fe0e2a9..000000000 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestService.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.server.session.correction.service; - -import com.alipay.sofa.registry.common.model.store.Publisher; - -import java.util.List; -import java.util.Map; - -/** - * - * @author shangyu.wh - * @version $Id: PublisherDigestService.java, v 0.1 2019-05-30 21:08 shangyu.wh Exp $ - */ -public interface PublisherDigestService { - - /** - * get session store all publisher digest sum group by dataServerAddress,at same client connectId - * @param connectId - * @return dataServerIp+digestValue - */ - Map getConnectDigest(String connectId); - - /** - * get session store all publishers group by dataServerAddress,at same client connectId - * @param connectId - * @return - */ - Map> getConnectSnapShot(String connectId); -} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java deleted file mode 100644 index 97d0a5b39..000000000 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/correction/service/PublisherDigestServiceImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.server.session.correction.service; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.beans.factory.annotation.Autowired; - -import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.PublisherDigestUtil; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.server.session.node.NodeManager; -import com.alipay.sofa.registry.server.session.store.DataStore; - -/** - * - * @author shangyu.wh - * @version $Id: PublisherDigestServiceImpl.java, v 0.1 2019-05-30 21:17 shangyu.wh Exp $ - */ -public class PublisherDigestServiceImpl implements PublisherDigestService { - - private static final Logger LOGGER = LoggerFactory.getLogger(PublisherDigestServiceImpl.class); - - /** - * store publishers - */ - @Autowired - private DataStore sessionDataStore; - - /** - * calculate data node url - */ - @Autowired - private NodeManager dataNodeManager; - - @Override - public Map getConnectDigest(String connectId) { - - Map> connectIdPubs = getConnectSnapShot(connectId); - - if(connectIdPubs != null && !connectIdPubs.isEmpty()){ - Map digestMap = new HashMap<>(); - connectIdPubs.forEach((dataIP,publishers)-> digestMap.put(dataIP, String.valueOf(PublisherDigestUtil.getDigestValueSum(publishers)))); - - return digestMap; - } - - return null; - } - - @Override - public Map> getConnectSnapShot(String connectId) { - - Map pubMap = sessionDataStore.queryByConnectId(connectId); - - if(pubMap != null && !pubMap.isEmpty()){ - - Map> connectIdPubs = new ConcurrentHashMap<>(); - - pubMap.values().forEach(publisher->{ - - Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); - - List connPublishers = connectIdPubs.computeIfAbsent(dataNode.getNodeUrl().getIpAddress(), k-> new ArrayList<>()); - - connPublishers.add(publisher); - }); - - return connectIdPubs; - } else { - LOGGER.error("Cannot get publishers by connectId:{}!",connectId); - } - - return null; - } -} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java new file mode 100644 index 000000000..13d059a54 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.listener; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.scheduler.task.DatumSnapshotTask; +import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.task.batcher.TaskDispatcher; +import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import com.alipay.sofa.registry.task.batcher.TaskProcessor; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListener; + +/** + * + * @author kezhu.wukz + * @version $Id: RenewDatumTaskListener.java, v 0.1 2019-06-14 12:02 kezhu.wukz Exp $ + */ +public class DatumSnapshotTaskListener implements TaskListener { + + @Autowired + private DataNodeService dataNodeService; + + @Autowired + private SessionServerConfig sessionServerConfig; + + private TaskDispatcher singleTaskDispatcher; + + @Autowired + private TaskProcessor dataNodeSingleTaskProcessor; + + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.DATUM_SNAPSHOT_TASK.getName()), 100000, 32, + 1000, 1000, dataNodeSingleTaskProcessor); + } + + @Override + public boolean support(TaskEvent event) { + return TaskType.DATUM_SNAPSHOT_TASK.equals(event.getTaskType()); + } + + @Override + public void handleEvent(TaskEvent event) { + SessionTask datumSnapshotTask = new DatumSnapshotTask(sessionServerConfig, dataNodeService); + + datumSnapshotTask.setTaskEvent(event); + + singleTaskDispatcher.dispatch(datumSnapshotTask.getTaskId(), datumSnapshotTask, + datumSnapshotTask.getExpiryTime()); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java new file mode 100644 index 000000000..88068b16f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.listener; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; +import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.task.batcher.TaskDispatcher; +import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import com.alipay.sofa.registry.task.batcher.TaskProcessor; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListener; + +/** + * + * @author kezhu.wukz + * @version $Id: PublishDataTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ + */ +public class PublishDataTaskListener implements TaskListener { + + @Autowired + private DataNodeService dataNodeService; + + @Autowired + private SessionServerConfig sessionServerConfig; + + private TaskDispatcher singleTaskDispatcher; + + @Autowired + private TaskProcessor dataNodeSingleTaskProcessor; + + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.PUBLISH_DATA_TASK.getName()), 100000, 32, + 1000, 1000, dataNodeSingleTaskProcessor); + } + + @Override + public boolean support(TaskEvent event) { + return TaskType.PUBLISH_DATA_TASK.equals(event.getTaskType()); + } + + @Override + public void handleEvent(TaskEvent event) { + SessionTask publishDataTask = new PublishDataTask(sessionServerConfig, dataNodeService); + + publishDataTask.setTaskEvent(event); + + singleTaskDispatcher.dispatch(publishDataTask.getTaskId(), publishDataTask, + publishDataTask.getExpiryTime()); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java new file mode 100644 index 000000000..ea200140e --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.listener; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.registry.SessionRegistry; +import com.alipay.sofa.registry.server.session.scheduler.task.ReNewDatumTask; +import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.task.batcher.TaskDispatcher; +import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import com.alipay.sofa.registry.task.batcher.TaskProcessor; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListener; + +/** + * + * @author kezhu.wukz + * @version $Id: ReNewDatumTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ + */ +public class ReNewDatumTaskListener implements TaskListener { + + @Autowired + private DataNodeService dataNodeService; + + @Autowired + private SessionServerConfig sessionServerConfig; + + private TaskDispatcher singleTaskDispatcher; + + @Autowired + private TaskProcessor dataNodeSingleTaskProcessor; + + @Autowired + private SessionRegistry sessionRegistry; + + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.RENEW_DATUM_TASK.getName()), 100000, 32, + 1000, 1000, dataNodeSingleTaskProcessor); + } + + @Override + public boolean support(TaskEvent event) { + return TaskType.RENEW_DATUM_TASK.equals(event.getTaskType()); + } + + @Override + public void handleEvent(TaskEvent event) { + SessionTask reNewDatumTask = new ReNewDatumTask(sessionServerConfig, dataNodeService, + sessionRegistry); + + reNewDatumTask.setTaskEvent(event); + + singleTaskDispatcher.dispatch(reNewDatumTask.getTaskId(), reNewDatumTask, + reNewDatumTask.getExpiryTime()); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java new file mode 100644 index 000000000..8054b61e6 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.listener; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; +import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.server.session.store.DataStore; +import com.alipay.sofa.registry.server.session.store.Interests; +import com.alipay.sofa.registry.server.session.store.Watchers; +import com.alipay.sofa.registry.task.batcher.TaskDispatcher; +import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import com.alipay.sofa.registry.task.batcher.TaskProcessor; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListener; + +/** + * + * @author kezhu.wukz + * @version $Id: UnpublishDataTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ + */ +public class UnpublishDataTaskListener implements TaskListener { + + /** + * store subscribers + */ + @Autowired + private Interests sessionInterests; + + /** + * store publishers + */ + @Autowired + private DataStore sessionDataStore; + + @Autowired + private Watchers sessionWatchers; + + /** + * transfer data to DataNode + */ + @Autowired + private DataNodeService dataNodeService; + + @Autowired + private SessionServerConfig sessionServerConfig; + + private TaskDispatcher singleTaskDispatcher; + + @Autowired + private TaskProcessor dataNodeSingleTaskProcessor; + + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.UNPUBLISH_DATA_TASK.getName()), 100000, 32, + 1000, 1000, dataNodeSingleTaskProcessor); + } + + @Override + public boolean support(TaskEvent event) { + return TaskType.UNPUBLISH_DATA_TASK.equals(event.getTaskType()); + } + + @Override + public void handleEvent(TaskEvent event) { + SessionTask publishDataTask = new PublishDataTask(sessionServerConfig, dataNodeService); + + publishDataTask.setTaskEvent(event); + + singleTaskDispatcher.dispatch(publishDataTask.getTaskId(), publishDataTask, + publishDataTask.getExpiryTime()); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java index 73d74ddbb..cc013f95b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java @@ -16,15 +16,17 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.URL; -import java.util.Collection; -import java.util.List; -import java.util.Map; - /** * * @author shangyu.wh @@ -99,19 +101,12 @@ void registerSessionProcessId(SessionServerRegisterRequest sessionServerRegister /** * check publisher digest same as session current store,and reNew the lastUpdateTime of this connectId - * @param dataIpAddress - * @param connectId - * @param digest - * @return */ - Boolean reNewDatum(String dataIpAddress, String connectId, String digest); + Boolean reNewDatum(ReNewDatumRequest reNewDatumRequest); /** * Correct the publishers information of this connectId on dataServer - * @param connectId - * @param dataIpAddress - * @param publishers */ - void rectifyDatum(String connectId, String dataIpAddress, List publishers); + void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index d6e7b4d32..123c093d1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -42,14 +51,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * @@ -267,11 +268,10 @@ private void clientOffRetry(Request clientOffRequestRequest) { if (!commonResponse.isSuccess()) { LOGGER.error( "ClientOff retry RequestRequest get response failed!retryTimes={},target url:{},message:{}", - retryTimes, - url, commonResponse.getMessage()); + retryTimes, url, commonResponse.getMessage()); throw new RuntimeException( - "ClientOff retry RequestRequest get response failed! msg:" + - commonResponse.getMessage()); + "ClientOff retry RequestRequest get response failed! msg:" + commonResponse + .getMessage()); } } else { LOGGER.error( @@ -400,7 +400,8 @@ private Map getDatumMap(String dataInfoId) { return getDatumMap(dataInfoId, null); } - @Override public Map getDatumMap(String dataInfoId, String dataCenterId) { + @Override + public Map getDatumMap(String dataInfoId, String dataCenterId) { Map map; @@ -441,8 +442,8 @@ public URL getRequestUrl() { } } else { LOGGER.error("GetDataRequest has not get fail response!msg:{}", genericResponse.getMessage()); - throw new RuntimeException("GetDataRequest has not get fail response! msg:" + - genericResponse.getMessage()); + throw new RuntimeException( + "GetDataRequest has not get fail response! msg:" + genericResponse.getMessage()); } } else { LOGGER.error("GetDataRequest has not get response or response type illegal!"); @@ -450,8 +451,7 @@ public URL getRequestUrl() { } } catch (RequestException e) { LOGGER.error("Get data request to data node error! " + e.getRequestMessage(), e); - throw new RuntimeException( - "Get data request to data node error! " + e.getRequestMessage(), e); + throw new RuntimeException("Get data request to data node error! " + e.getRequestMessage(), e); } return map; @@ -468,18 +468,18 @@ private URL getUrl(String dataInfoId) { return null; } - public Boolean reNewDatum(String connectId, String dataIpAddress, String digest) { + public Boolean reNewDatum(ReNewDatumRequest reNewDatumRequest) { try { - Request request = new Request() { @Override public ReNewDatumRequest getRequestBody() { - return new ReNewDatumRequest(connectId, dataIpAddress, digest); + return reNewDatumRequest; } @Override public URL getRequestUrl() { - return new URL(dataIpAddress, sessionServerConfig.getDataServerPort()); + return new URL(reNewDatumRequest.getDataServerIp(), + sessionServerConfig.getDataServerPort()); } }; @@ -509,18 +509,18 @@ public URL getRequestUrl() { } } - public void rectifyDatum(String connectId, String dataIpAddress, List publishers) { - + public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { try { Request request = new Request() { @Override public DatumSnapshotRequest getRequestBody() { - return new DatumSnapshotRequest(connectId, dataIpAddress, publishers); + return datumSnapshotRequest; } @Override public URL getRequestUrl() { - return new URL(dataIpAddress, sessionServerConfig.getDataServerPort()); + return new URL(datumSnapshotRequest.getDataServerIp(), + sessionServerConfig.getDataServerPort()); } }; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 129407cc7..9cfed72de 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -16,10 +16,10 @@ */ package com.alipay.sofa.registry.server.session.registry; -import com.alipay.sofa.registry.common.model.store.StoreData; - import java.util.List; +import com.alipay.sofa.registry.common.model.store.StoreData; + /** * * @author shangyu.wh @@ -66,4 +66,6 @@ public interface Registry { * Regularly send update Datum with same connectID valid time request service */ void reNewDatum(String connectId); + + void sendDatumSnapshot(String connectId); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index f6545fcfc..c82cda06b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -16,7 +16,22 @@ */ package com.alipay.sofa.registry.server.session.registry; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.PublisherDigestUtil; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.BaseInfo; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.StoreData; @@ -28,42 +43,32 @@ import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.session.acceptor.WriteDataAcceptor; +import com.alipay.sofa.registry.server.session.acceptor.WriteDataRequest; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.correction.WriteDataAcceptor; -import com.alipay.sofa.registry.server.session.correction.WriteDataRequest; -import com.alipay.sofa.registry.server.session.correction.service.PublisherDigestService; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.server.session.strategy.SessionRegistryStrategy; -import com.alipay.sofa.registry.task.listener.TaskEvent; -import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; -import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.TimeUnit; /** * + * @author kezhu.wukz * @author shangyu.wh * @version $Id: AbstractSessionRegistry.java, v 0.1 2017-11-30 18:13 shangyu.wh Exp $ */ public class SessionRegistry implements Registry { - private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, + "[Task]"); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, - "[Task]"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[SessionRegistry]"); /** * store subscribers @@ -89,12 +94,6 @@ public class SessionRegistry implements Registry { @Autowired private DataNodeService dataNodeService; - /** - * trigger task com.alipay.sofa.registry.server.meta.listener process - */ - @Autowired - private TaskListenerManager taskListenerManager; - /** * calculate data node url */ @@ -110,9 +109,6 @@ public class SessionRegistry implements Registry { @Autowired private SessionRegistryStrategy sessionRegistryStrategy; - @Autowired - private PublisherDigestService publisherDigestService; - @Autowired private WriteDataAcceptor writeDataAcceptor; @@ -126,8 +122,10 @@ public void register(StoreData storeData) { case PUBLISHER: Publisher publisher = (Publisher) storeData; - //dataNodeService.register(publisher); + sessionDataStore.add(publisher); + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override public Object getRequestBody() { @@ -141,12 +139,10 @@ public WriteDataRequestType getRequestType() { @Override public String getConnectId() { - return publisher.getClientId(); + return publisher.getSourceAddress().getAddressString(); } }); - sessionDataStore.add(publisher); - sessionRegistryStrategy.afterPublisherRegister(publisher); break; case SUBSCRIBER: @@ -178,7 +174,26 @@ public void unRegister(StoreData storeData) { sessionDataStore.deleteById(storeData.getId(), publisher.getDataInfoId()); - dataNodeService.unregister(publisher); + // dataNodeService.unregister(publisher); + + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return publisher; + } + + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.UN_PUBLISHER; + } + + @Override + public String getConnectId() { + return publisher.getSourceAddress().getAddressString(); + } + }); sessionRegistryStrategy.afterPublisherUnRegister(publisher); break; @@ -204,9 +219,38 @@ public void unRegister(StoreData storeData) { @Override public void cancel(List connectIds) { - TaskEvent taskEvent = new TaskEvent(connectIds, TaskType.CANCEL_DATA_TASK); - TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); - taskListenerManager.sendTaskEvent(taskEvent); + //update local firstly, data node send error depend on reNew check + List connectIdsWithPub = new ArrayList<>(); + for (String connectId : connectIds) { + if (sessionDataStore.deleteByConnectId(connectId)) { + connectIdsWithPub.add(connectId); + } + sessionInterests.deleteByConnectId(connectId); + sessionWatchers.deleteByConnectId(connectId); + } + + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + for (String connectId : connectIdsWithPub) { + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return connectId; + } + + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.CLIENT_OFF; + } + + @Override + public String getConnectId() { + return connectId; + } + }); + writeDataAcceptor.remove(connectId); + } + } @Override @@ -257,10 +301,8 @@ private Map> calculateDataNode(Collection dat if (dataInfoIds != null) { dataInfoIds.forEach(dataInfoId -> { Node dataNode = dataNodeManager.getNode(dataInfoId); - URL url = new URL(dataNode.getNodeUrl().getIpAddress(), - sessionServerConfig.getDataServerPort()); - Collection list = map.computeIfAbsent(url.getAddressString(), - k -> new ArrayList<>()); + URL url = new URL(dataNode.getNodeUrl().getIpAddress(), sessionServerConfig.getDataServerPort()); + Collection list = map.computeIfAbsent(url.getAddressString(), k -> new ArrayList<>()); list.add(dataInfoId); }); } @@ -286,61 +328,101 @@ private void checkConnect(StoreData storeData) { @Override public void reNewDatum(String connectId) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("reNewDatum: connectId={}", connectId); + } - //TODO check update time to cancel - Map connectDigest = publisherDigestService.getConnectDigest(connectId); + List reNewDatumRequests = getReNewDatumRequests(connectId); + if (reNewDatumRequests != null) { + for (ReNewDatumRequest reNewDatumRequest : reNewDatumRequests) { + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return reNewDatumRequest; + } - Set remainDataIps = new HashSet<>(connectDigest.keySet()); - for (Entry entry : connectDigest.entrySet()) { - String dataIp = entry.getKey(); - String digest = entry.getValue(); - try { - Boolean result = dataNodeService.reNewDatum(dataIp, connectId, digest); - if (!result) { - LOGGER - .info( - "ReNew datum request to dataNode got sub digest different!dataIp={},connectId={},digest={}", - dataIp, connectId, digest); - break; - } else { - remainDataIps.remove(dataIp); - } - } catch (Exception e) { - LOGGER.error( - "ReNew datum request to dataNode error!dataIp={},connectId={},digest={}", - dataIp, connectId, digest, e); + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.RENEW_DATUM; + } + + @Override + public String getConnectId() { + return connectId; + } + }); } } + } - if (!remainDataIps.isEmpty()) { - //TODO SNAPSHOT + @Override + public void sendDatumSnapshot(String connectId) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("sendDatumSnapshot: connectId={}", connectId); } - } - /** - * Getter method for property sessionInterests. - * - * @return property value of sessionInterests - */ - public Interests getSessionInterests() { - return sessionInterests; + List datumSnapshotRequests = getDatumSnapshotRequests(connectId); + if (datumSnapshotRequests != null) { + for (DatumSnapshotRequest datumSnapshotRequest : datumSnapshotRequests) { + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return datumSnapshotRequest; + } + + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.DATUM_SNAPSHOT; + } + + @Override + public String getConnectId() { + return connectId; + } + }); + } + } } - /** - * Getter method for property sessionDataStore. - * - * @return property value of sessionDataStore - */ - public DataStore getSessionDataStore() { - return sessionDataStore; + private List getReNewDatumRequests(String connectId) { + List datumSnapshotRequests = getDatumSnapshotRequests(connectId); + if (datumSnapshotRequests != null && !datumSnapshotRequests.isEmpty()) { + return datumSnapshotRequests.stream() + .map(datumSnapshotRequest -> new ReNewDatumRequest(datumSnapshotRequest.getConnectId(), + datumSnapshotRequest.getDataServerIp(), String.valueOf( + PublisherDigestUtil.getDigestValueSum(datumSnapshotRequest.getPublishers())))) + .collect(Collectors.toList()); + } + return null; } - /** - * Getter method for property taskListenerManager. - * - * @return property value of taskListenerManager - */ - public TaskListenerManager getTaskListenerManager() { - return taskListenerManager; + private List getDatumSnapshotRequests(String connectId) { + Map pubMap = sessionDataStore.queryByConnectId(connectId); + if (pubMap != null && !pubMap.isEmpty()) { + Map> dataServerIpToPubs = new ConcurrentHashMap<>(); + List list = new ArrayList<>(); + pubMap.values().forEach(publisher -> { + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + List publishers = dataServerIpToPubs + .computeIfAbsent(dataNode.getNodeUrl().getIpAddress(), k -> new ArrayList<>()); + publishers.add(publisher); + }); + for (Map.Entry> entry : dataServerIpToPubs.entrySet()) { + List publishers = entry.getValue(); + if (!publishers.isEmpty()) { + DatumSnapshotRequest datumSnapshotRequest = new DatumSnapshotRequest(connectId, entry.getKey(), + publishers); + list.add(datumSnapshotRequest); + } + } + return list; + } else { + LOGGER.warn("No publishers of connectId:{}!", connectId); + } + return null; } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java index a7935ad66..68aa8ef43 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.session.remoting.handler; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -30,12 +38,6 @@ import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; /** * @@ -44,7 +46,10 @@ */ public class ClientNodeConnectionHandler extends AbstractServerHandler { - private static final Logger LOGGER = LoggerFactory.getLogger("SESSION-CONNECT"); + private static final Logger LOGGER = LoggerFactory.getLogger("SESSION-CONNECT"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[ClientNodeConnectionHandler]"); @Autowired private Registry sessionRegistry; @@ -86,10 +91,10 @@ public void disconnected(Channel channel) throws RemotingException { private void fireCancelClient(Channel channel) { //avoid block connect ConnectionEventExecutor thread pool - executorManager.getConnectClientExecutor().execute(()->{ + executorManager.getConnectClientExecutor().execute(() -> { String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); - if(checkCache(connectId)) { + if (checkCache(connectId)) { List connectIds = new ArrayList<>(); connectIds.add(connectId); sessionRegistry.cancel(connectIds); @@ -121,19 +126,21 @@ private boolean checkWatcher(String connectId) { return subMap != null && !subMap.isEmpty(); } - private void fireReNewDatum(Channel channel){ - - executorManager.getConnectClientExecutor().execute(()-> { + private void fireReNewDatum(Channel channel) { + executorManager.getConnectClientExecutor().execute(() -> { String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); - executorManager.getAsyncHashedWheelTimerTask().newTimeout(connectId, timerOut -> sessionRegistry.reNewDatum(connectId), - sessionServerConfig.getReNewDatumWheelTaskDelay(), TimeUnit.MILLISECONDS, - () -> { - Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); - - Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); - - return channelClient != null && channel.isConnected(); - }); + RENEW_LOGGER.info("Renew task is started: {}", connectId); + executorManager.getAsyncHashedWheelTimerTask() + .newTimeout(connectId, timerOut -> sessionRegistry.reNewDatum(connectId), + sessionServerConfig.getReNewDatumWheelTaskDelay(), TimeUnit.SECONDS, () -> { + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); + boolean shouldContinue = channelClient != null && channel.isConnected(); + if (!shouldContinue) { + RENEW_LOGGER.info("Renew task is stop: {}", connectId); + } + return shouldContinue; + }); }); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java index 17ef2a827..f07a089e2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/CancelDataTask.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.List; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -23,9 +25,6 @@ import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.task.listener.TaskEvent; -import java.util.ArrayList; -import java.util.List; - /** * * @author shangyu.wh @@ -61,23 +60,7 @@ public CancelDataTask(Interests sessionInterests, DataStore sessionDataStore, @Override public void execute() { - if (connectIds.isEmpty()) { - throw new IllegalArgumentException("Input clientOff connectIds error!"); - } - - //remove local first,data node send error depend on other task check - List connectIdsPub = new ArrayList<>(); - for (String connectId : connectIds) { - - if (sessionDataStore.deleteByConnectId(connectId)) { - connectIdsPub.add(connectId); - } - sessionInterests.deleteByConnectId(connectId); - - sessionWatchers.deleteByConnectId(connectId); - } - - dataNodeService.clientOff(connectIdsPub); + dataNodeService.clientOff(connectIds); } @Override @@ -89,9 +72,11 @@ public void setTaskEvent(TaskEvent taskEvent) { } Object obj = taskEvent.getEventObj(); - if (obj instanceof List) { this.connectIds = (List) obj; + if (connectIds.isEmpty()) { + throw new IllegalArgumentException("Input clientOff connectIds error!"); + } } else { throw new IllegalArgumentException("Input task event object error!"); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java new file mode 100644 index 000000000..46dfeed16 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.scheduler.task; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.task.listener.TaskEvent; + +/** + * + * @author kezhu.wukz + * @version $Id: DatumSnapshotTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + */ +public class DatumSnapshotTask extends AbstractSessionTask { + /** + * transfer data to DataNode + */ + private final DataNodeService dataNodeService; + + private final SessionServerConfig sessionServerConfig; + + private DatumSnapshotRequest datumSnapshotRequest; + + public DatumSnapshotTask(SessionServerConfig sessionServerConfig, + DataNodeService dataNodeService) { + this.sessionServerConfig = sessionServerConfig; + this.dataNodeService = dataNodeService; + } + + @Override + public void execute() { + dataNodeService.sendDatumSnapshot(datumSnapshotRequest); + } + + @Override + public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + + Object obj = taskEvent.getEventObj(); + if (obj instanceof DatumSnapshotRequest) { + this.datumSnapshotRequest = (DatumSnapshotRequest) obj; + } else { + throw new IllegalArgumentException("Input task event object error!"); + } + } + + @Override + public String toString() { + return "DATUM_SNAPSHOT_TASK{" + "taskId='" + getTaskId() + '\'' + ", datumSnapshotRequest=" + + datumSnapshotRequest + ", retry='" + + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + } + + @Override + public boolean checkRetryTimes() { + return checkRetryTimes(sessionServerConfig.getDatumSnapshotTaskRetryTimes()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java new file mode 100644 index 000000000..1403d2c16 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.scheduler.task; + +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.task.listener.TaskEvent; + +/** + * + * @author kezhu.wukz + * @version $Id: PublishDataTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + */ +public class PublishDataTask extends AbstractSessionTask { + + private final DataNodeService dataNodeService; + + private final SessionServerConfig sessionServerConfig; + + private Publisher publisher; + + public PublishDataTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService) { + this.sessionServerConfig = sessionServerConfig; + this.dataNodeService = dataNodeService; + } + + @Override + public void execute() { + dataNodeService.register(publisher); + } + + @Override + public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + + Object obj = taskEvent.getEventObj(); + if (obj instanceof Publisher) { + this.publisher = (Publisher) obj; + } else { + throw new IllegalArgumentException("Input task event object error!"); + } + } + + @Override + public String toString() { + return "PUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", publisher=" + publisher + + ", retry='" + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + } + + @Override + public boolean checkRetryTimes() { + return checkRetryTimes(sessionServerConfig.getPublishDataTaskRetryTimes()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java new file mode 100644 index 000000000..f7e7fb6b6 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.scheduler.task; + +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.registry.SessionRegistry; +import com.alipay.sofa.registry.task.listener.TaskEvent; + +/** + * + * @author kezhu.wukz + * @version $Id: ReNewDatumTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + */ +public class ReNewDatumTask extends AbstractSessionTask { + + private final static Logger LOGGER = LoggerFactory.getLogger(ReNewDatumTask.class, + "[Task]"); + + private final DataNodeService dataNodeService; + + private final SessionServerConfig sessionServerConfig; + + private final SessionRegistry sessionRegistry; + + private ReNewDatumRequest reNewDatumRequest; + + public ReNewDatumTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService, + SessionRegistry sessionRegistry) { + this.sessionServerConfig = sessionServerConfig; + this.dataNodeService = dataNodeService; + this.sessionRegistry = sessionRegistry; + } + + @Override + public void execute() { + + try { + Boolean result = dataNodeService.reNewDatum(reNewDatumRequest); + if (!result) { + LOGGER + .info( + "ReNew datum request to dataNode got sub digest different! reNewDatumRequest={}", + reNewDatumRequest); + + // send snapshot datum for the corresponding connId + sessionRegistry.sendDatumSnapshot(reNewDatumRequest.getConnectId()); + + } + } catch (Exception e) { + LOGGER.error("ReNew datum request to dataNode error! reNewDatumRequest={}", + reNewDatumRequest, e); + } + } + + @Override + public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + + Object obj = taskEvent.getEventObj(); + if (obj instanceof ReNewDatumRequest) { + this.reNewDatumRequest = (ReNewDatumRequest) obj; + } else { + throw new IllegalArgumentException("Input task event object error!"); + } + } + + @Override + public String toString() { + return "RENEW_DATUM_TASK{" + "taskId='" + getTaskId() + '\'' + ", reNewDatumRequest=" + + reNewDatumRequest + ", retry='" + + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + } + + @Override + public boolean checkRetryTimes() { + return checkRetryTimes(sessionServerConfig.getReNewDatumTaskRetryTimes()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java new file mode 100644 index 000000000..52883467a --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.scheduler.task; + +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.task.listener.TaskEvent; + +/** + * + * @author kezhu.wukz + * @version $Id: UnpublishDataTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + */ +public class UnpublishDataTask extends AbstractSessionTask { + + private final DataNodeService dataNodeService; + + private final SessionServerConfig sessionServerConfig; + + private Publisher unpublisher; + + public UnpublishDataTask(SessionServerConfig sessionServerConfig, + DataNodeService dataNodeService) { + this.sessionServerConfig = sessionServerConfig; + this.dataNodeService = dataNodeService; + } + + @Override + public void execute() { + dataNodeService.unregister(unpublisher); + } + + @Override + public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + + Object obj = taskEvent.getEventObj(); + if (obj instanceof Publisher) { + this.unpublisher = (Publisher) obj; + } else { + throw new IllegalArgumentException("Input task event object error!"); + } + } + + @Override + public String toString() { + return "UNPUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", unpublisher=" + + unpublisher + ", retry='" + sessionServerConfig.getUnpublishDataTaskRetryTimes() + + '\'' + '}'; + } + + @Override + public boolean checkRetryTimes() { + return checkRetryTimes(sessionServerConfig.getUnpublishDataTaskRetryTimes()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java index ffe24cf8b..83a8cbd0c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.server.session.store; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; - import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -28,6 +24,10 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; + /** * * @author shangyu.wh @@ -41,16 +41,14 @@ public class SessionDataStore implements DataStore { private final Lock write = readWriteLock .writeLock(); - /** - * publisher store - */ + /*** publisher store */ private Map> registry = new ConcurrentHashMap<>(); + /*** index */ private Map> connectIndex = new ConcurrentHashMap<>(); @Override public void add(Publisher publisher) { - write.lock(); try { Map publishers = registry.get(publisher.getDataInfoId()); @@ -103,7 +101,7 @@ public void add(Publisher publisher) { } publishers.put(publisher.getRegisterId(), publisher); - addIndex(publisher); + addToConnectIndex(publisher); } finally { write.unlock(); @@ -112,7 +110,6 @@ public void add(Publisher publisher) { @Override public boolean deleteById(String registerId, String dataInfoId) { - write.lock(); try { Map publishers = registry.get(dataInfoId); @@ -132,7 +129,7 @@ public boolean deleteById(String registerId, String dataInfoId) { return false; } else { - removeIndex(publisherTodelete); + removeFromConnectIndex(publisherTodelete); return true; } } @@ -148,7 +145,6 @@ public Map queryByConnectId(String connectId) { @Override public boolean deleteByConnectId(String connectId) { - write.lock(); try { for (Map map : registry.values()) { @@ -157,10 +153,10 @@ public boolean deleteByConnectId(String connectId) { if (publisher != null && connectId.equals(publisher.getSourceAddress().getAddressString())) { it.remove(); - invalidateIndex(publisher); } } } + connectIndex.remove(connectId); return true; } catch (Exception e) { LOGGER.error("Delete publisher by connectId {} error!", connectId, e); @@ -209,12 +205,7 @@ public long count() { return count.get(); } - private void addIndex(Publisher publisher) { - - addConnectIndex(publisher); - } - - private void addConnectIndex(Publisher publisher) { + private void addToConnectIndex(Publisher publisher) { String connectId = publisher.getSourceAddress().getAddressString(); Map publisherMap = connectIndex.get(connectId); @@ -229,11 +220,7 @@ private void addConnectIndex(Publisher publisher) { publisherMap.put(publisher.getRegisterId(), publisher); } - private void removeIndex(Publisher publisher) { - removeConnectIndex(publisher); - } - - private void removeConnectIndex(Publisher publisher) { + private void removeFromConnectIndex(Publisher publisher) { String connectId = publisher.getSourceAddress().getAddressString(); Map publisherMap = connectIndex.get(connectId); if (publisherMap != null) { @@ -243,13 +230,4 @@ private void removeConnectIndex(Publisher publisher) { } } - private void invalidateIndex(Publisher publisher) { - String connectId = publisher.getSourceAddress().getAddressString(); - invalidateConnectIndex(connectId); - } - - private void invalidateConnectIndex(String connectId) { - connectIndex.remove(connectId); - } - } \ No newline at end of file diff --git a/server/server/session/src/main/resources/application.properties b/server/server/session/src/main/resources/application.properties index 9df254384..10fbd7925 100644 --- a/server/server/session/src/main/resources/application.properties +++ b/server/server/session/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.main.banner-mode=LOG -#nodes.metaNode=: -#nodes.localDataCenter= -#nodes.localRegion= +nodes.metaNode=DefaultDataCenter:localhost +nodes.localDataCenter=DefaultDataCenter +nodes.localRegion=DEFAULT_ZONE #session.server.logging.level=INFO #session.server.logging.home=/home/admin/logs/registry/session diff --git a/server/server/session/src/main/resources/logback-spring.xml b/server/server/session/src/main/resources/logback-spring.xml index 48d7db9f3..29683e0f1 100644 --- a/server/server/session/src/main/resources/logback-spring.xml +++ b/server/server/session/src/main/resources/logback-spring.xml @@ -71,6 +71,26 @@ + + true + + DEBUG + + + ERROR + DENY + + ${SESSION_LOG_HOME}/registry-renew.log + + ${SESSION_LOG_HOME}/registry-renew.log.%d{yyyy-MM-dd} + 30 + + + [%d{ISO8601}][%p][%t][%c{0}] - %m%n + ${LOG_ENCODE} + + + @@ -273,6 +293,11 @@ + + + + + From 3a7b6e56ea12d613b3d325f1d832d97adce6eb7b Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 18 Jun 2019 17:38:54 +0800 Subject: [PATCH 037/161] 1. bugfix ReNewDatumHandler: getByConnectId -> getOwnByConnectId 2. reactor DatumCache from static to instance --- .../common/model/DatumSnapshotRequest.java | 1 - .../common/model/ReNewDatumRequest.java | 1 - .../DataServerBeanConfiguration.java | 18 ++ .../data/bootstrap/DataServerBootstrap.java | 8 +- .../server/data/cache/CacheDigestTask.java | 35 ++-- .../server/data/cache/DatumCache.java | 191 ++++++++++++------ .../server/data/change/DataChangeHandler.java | 47 ++--- .../change/event/DataChangeEventCenter.java | 23 ++- .../change/event/DataChangeEventQueue.java | 9 +- .../change/notify/SessionServerNotifier.java | 18 +- .../LocalDataServerCleanHandler.java | 8 +- .../datasync/sync/AbstractAcceptorStore.java | 7 +- .../server/data/datasync/sync/Acceptor.java | 23 ++- .../LocalDataServerChangeEventHandler.java | 32 +-- .../dataserver/handler/FetchDataHandler.java | 11 +- .../handler/NotifyDataSyncHandler.java | 36 ++-- .../handler/NotifyFetchDatumHandler.java | 31 ++- .../sessionserver/handler/GetDataHandler.java | 6 +- .../handler/GetDataVersionsHandler.java | 20 +- .../handler/ReNewDatumHandler.java | 13 +- .../handler/UnPublishDataHandler.java | 9 +- .../data/resource/DataDigestResource.java | 44 ++-- .../registry/server/data/TestSyncData.java | 14 +- .../scheduler/task/ReNewDatumTask.java | 10 +- .../registry/test/BaseIntegrationTest.java | 5 +- 25 files changed, 377 insertions(+), 243 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java index 19ca2d5e1..49ae1da8e 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java @@ -78,7 +78,6 @@ public String toString() { sb.append("connectId='").append(connectId).append('\''); sb.append(", dataServerIp='").append(dataServerIp).append('\''); sb.append(", publishers=").append(publishers); - sb.append(", super=").append(super.toString()); sb.append('}'); return sb.toString(); } diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java index 6399606e1..35ea685ba 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java @@ -76,7 +76,6 @@ public String toString() { sb.append("connectId='").append(connectId).append('\''); sb.append(", dataServerIp='").append(dataServerIp).append('\''); sb.append(", digestSum='").append(digestSum).append('\''); - sb.append(", super=").append(super.toString()); sb.append('}'); return sb.toString(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index e750da1b7..881e4d5e5 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -32,7 +32,9 @@ import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.jersey.exchange.JerseyExchange; +import com.alipay.sofa.registry.server.data.cache.CacheDigestTask; import com.alipay.sofa.registry.server.data.cache.DataServerCache; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.change.DataChangeHandler; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.notify.BackUpNotifier; @@ -127,10 +129,26 @@ public DataNodeStatus dataNodeStatus() { return new DataNodeStatus(); } + @Bean + public DatumCache datumCache() { + return new DatumCache(); + } + @Bean(name = "PropertySplitter") public PropertySplitter propertySplitter() { return new PropertySplitter(); } + + } + + @Configuration + public static class LogTaskConfigConfiguration { + + @Bean + public CacheDigestTask cacheDigestTask() { + return new CacheDigestTask(); + } + } @Configuration diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index f340d9a3d..523f23679 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -84,6 +84,9 @@ public class DataServerBootstrap { @Autowired private EventCenter eventCenter; + @Autowired + private CacheDigestTask cacheDigestTask; + @Resource(name = "serverHandlers") private Collection serverHandlers; @@ -195,11 +198,10 @@ private void startScheduler() { // start all startTask except correction task eventCenter.post(new StartTaskEvent( Arrays.stream(StartTaskTypeEnum.values()).filter(type -> type != StartTaskTypeEnum.RENEW) - .collect( - Collectors.toSet()))); + .collect(Collectors.toSet()))); //start dump log - new CacheDigestTask().start(); + cacheDigestTask.start(); } } catch (Exception e) { schedulerStarted.set(false); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java index 5b09ddb31..d301be6c6 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java @@ -16,19 +16,21 @@ */ package com.alipay.sofa.registry.server.data.cache; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.util.NamedThreadFactory; -import org.springframework.util.CollectionUtils; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * @@ -39,20 +41,23 @@ public class CacheDigestTask { private static final Logger LOGGER = LoggerFactory.getLogger(CacheDigestTask.class); + @Autowired + private DatumCache datumCache; + /** * */ public void start() { - ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("CacheDigestTask")); + ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, + new NamedThreadFactory("CacheDigestTask")); executor.scheduleAtFixedRate(() -> { try { - Map> allMap = DatumCache.getAll(); + Map> allMap = datumCache.getAll(); if (!allMap.isEmpty()) { for (Entry> dataCenterEntry : allMap.entrySet()) { String dataCenter = dataCenterEntry.getKey(); Map datumMap = dataCenterEntry.getValue(); - LOGGER.info("[CacheDigestTask] size of datum in {} is {}", - dataCenter, datumMap.size()); + LOGGER.info("[CacheDigestTask] size of datum in {} is {}", dataCenter, datumMap.size()); for (Entry dataInfoEntry : datumMap.entrySet()) { String dataInfoId = dataInfoEntry.getKey(); Datum data = dataInfoEntry.getValue(); @@ -63,14 +68,12 @@ public void start() { pubStr.append(logPublisher(publisher)).append(";"); } } - LOGGER.info( - "[Datum] dataInfoId={}, version={}, dataCenter={}, publishers=[{}]", - dataInfoId, data.getVersion(), dataCenter, pubStr.toString()); + LOGGER.info("[Datum] dataInfoId={}, version={}, dataCenter={}, publishers=[{}]", dataInfoId, + data.getVersion(), dataCenter, pubStr.toString()); } int pubCount = datumMap.values().stream().map(Datum::getPubMap) .filter(map -> map != null && !map.isEmpty()).mapToInt(Map::size).sum(); - LOGGER.info("[CacheDigestTask] size of publisher in {} is {}", - dataCenter, pubCount); + LOGGER.info("[CacheDigestTask] size of publisher in {} is {}", dataCenter, pubCount); } } else { LOGGER.info("[CacheDigestTask] datum cache is empty"); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 4cfbd0dd2..70c0229e2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -24,34 +24,52 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; +import com.alipay.sofa.registry.server.data.node.DataServerNode; +import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; /** * cache of datum, providing query function to the upper module * * @author qian.lqlq - * @version $Id: DatumCache.java, v 0.1 2017-12-06 20:50 qian.lqlq Exp $ + * @version $Id: this.java, v 0.1 2017-12-06 20:50 qian.lqlq Exp $ */ public class DatumCache { - public static final long ERROR_DATUM_VERSION = -2L; + public static final long ERROR_DATUM_VERSION = -2L; /** * row: dataCenter * column: dataInfoId * value: datum */ - private static final Map> DATUM_MAP = new ConcurrentHashMap<>(); + private final Map> DATUM_MAP = new ConcurrentHashMap<>(); /** + * all datum index + * * row: ip:port * column: registerId * value: publisher */ - private static final Map> CONNECT_ID_PUB_MAP = new ConcurrentHashMap<>(); + private final Map> ALL_CONNECT_ID_INDEX = new ConcurrentHashMap<>(); + + /** + * datum index, which only own by this dataServer + * + * row: ip:port + * column: registerId + * value: publisher + */ + private final Map> OWN_CONNECT_ID_INDEX = new ConcurrentHashMap<>(); + + @Autowired + private DataServerConfig dataServerConfig; /** * get datum by specific dataCenter and dataInfoId @@ -60,7 +78,7 @@ public class DatumCache { * @param dataInfoId * @return */ - public static Datum get(String dataCenter, String dataInfoId) { + public Datum get(String dataCenter, String dataInfoId) { if (DATUM_MAP.containsKey(dataCenter)) { Map map = DATUM_MAP.get(dataCenter); if (map.containsKey(dataInfoId)) { @@ -76,7 +94,7 @@ public static Datum get(String dataCenter, String dataInfoId) { * @param dataInfoId * @return */ - public static Map get(String dataInfoId) { + public Map get(String dataInfoId) { Map datumMap = new HashMap<>(); DATUM_MAP.forEach((dataCenter, datums) -> { if (datums.containsKey(dataInfoId)) { @@ -94,12 +112,12 @@ public static Map get(String dataInfoId) { * @param dataInfoId * @return */ - public static Map getDatumGroupByDataCenter(String dataCenter, String dataInfoId) { + public Map getDatumGroupByDataCenter(String dataCenter, String dataInfoId) { Map map = new HashMap<>(); if (StringUtils.isEmpty(dataCenter)) { - map = DatumCache.get(dataInfoId); + map = this.get(dataInfoId); } else { - Datum datum = DatumCache.get(dataCenter, dataInfoId); + Datum datum = this.get(dataCenter, dataInfoId); if (datum != null) { map.put(dataCenter, datum); } @@ -112,7 +130,7 @@ public static Map getDatumGroupByDataCenter(String dataCenter, St * * @return */ - public static Map> getAll() { + public Map> getAll() { return DATUM_MAP; } @@ -122,8 +140,18 @@ public static Map> getAll() { * @param connectId * @return */ - public static Map getByConnectId(String connectId) { - return CONNECT_ID_PUB_MAP.getOrDefault(connectId, null); + public Map getByConnectId(String connectId) { + return ALL_CONNECT_ID_INDEX.getOrDefault(connectId, null); + } + + /** + * + * + * @param connectId + * @return + */ + public Map getOwnByConnectId(String connectId) { + return OWN_CONNECT_ID_INDEX.getOrDefault(connectId, null); } /** @@ -133,7 +161,7 @@ public static Map getByConnectId(String connectId) { * @param datum * @return the last version before datum changed, if datum is not exist, return null */ - public static MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { + public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { MergeResult mergeResult; String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); @@ -160,14 +188,7 @@ public static MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { Entry entry = iterator.next(); Publisher publisher = entry.getValue(); if (!(publisher instanceof UnPublisher)) { - String registerId = publisher.getRegisterId(); - Map clientRegisterMap = new ConcurrentHashMap<>(); - clientRegisterMap.put(registerId, publisher); - Map retMap = CONNECT_ID_PUB_MAP.putIfAbsent(publisher - .getSourceAddress().getAddressString(), clientRegisterMap); - if (retMap != null) { - retMap.putAll(clientRegisterMap); - } + addToConnectIndex(publisher); } else { //first put to cache,UnPublisher data must remove,not so got error pub data exist iterator.remove(); @@ -191,7 +212,7 @@ public static MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { * @param dataInfoId * @return */ - public static boolean cleanDatum(String dataCenter, String dataInfoId) { + public boolean cleanDatum(String dataCenter, String dataInfoId) { Map datumMap = DATUM_MAP.get(dataCenter); if (datumMap != null) { @@ -205,8 +226,7 @@ public static boolean cleanDatum(String dataCenter, String dataInfoId) { //remove from cache if (cachePub != null) { cachePubMap.remove(registerId); - CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()) - .remove(registerId); + removeFromIndex(cachePub); } } return true; @@ -221,7 +241,7 @@ public static boolean cleanDatum(String dataCenter, String dataInfoId) { * @param datum * @return */ - private static MergeResult mergeDatum(Datum datum) { + private MergeResult mergeDatum(Datum datum) { boolean isChanged = false; Datum cacheDatum = DATUM_MAP.get(datum.getDataCenter()).get(datum.getDataInfoId()); Map cachePubMap = cacheDatum.getPubMap(); @@ -230,37 +250,8 @@ private static MergeResult mergeDatum(Datum datum) { String registerId = pubEntry.getKey(); Publisher pub = pubEntry.getValue(); Publisher cachePub = cachePubMap.get(registerId); - if (pub instanceof UnPublisher) { - //remove from cache - if (cachePub != null - && pub.getRegisterTimestamp() > cachePub.getRegisterTimestamp()) { - cachePubMap.remove(registerId); - CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( - registerId); - isChanged = true; - } - } else { - String pubAddr = pub.getSourceAddress().getAddressString(); - long version = pub.getVersion(); - long cacheVersion = cachePub == null ? 0L : cachePub.getVersion(); - String cachePubAddr = cachePub == null ? "" : cachePub.getSourceAddress() - .getAddressString(); - if (cacheVersion <= version) { - cachePubMap.put(registerId, pub); - if (cacheVersion < version || !pubAddr.equals(cachePubAddr)) { - // if version of both pub and cachePub are not equal, or sourceAddress of both are not equal, update - // eg: sessionserver crash, client reconnect to other sessionserver, sourceAddress changed, version not changed - // eg: client restart, sourceAddress and version are both changed - if (CONNECT_ID_PUB_MAP.containsKey(cachePubAddr)) { - CONNECT_ID_PUB_MAP.get(cachePubAddr).remove(registerId); - } - if (!CONNECT_ID_PUB_MAP.containsKey(pubAddr)) { - CONNECT_ID_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); - } - CONNECT_ID_PUB_MAP.get(pubAddr).put(registerId, pub); - isChanged = true; - } - } + if (mergePublisher(pub, cachePubMap, cachePub)) { + isChanged = true; } } Long lastVersion = cacheDatum.getVersion(); @@ -270,12 +261,42 @@ private static MergeResult mergeDatum(Datum datum) { return new MergeResult(lastVersion, isChanged); } + private boolean mergePublisher(Publisher pub, Map cachePubMap, + Publisher cachePub) { + boolean isChanged = false; + String registerId = pub.getRegisterId(); + if (pub instanceof UnPublisher) { + //remove from cache + if (cachePub != null && pub.getRegisterTimestamp() > cachePub.getRegisterTimestamp()) { + cachePubMap.remove(registerId); + removeFromIndex(cachePub); + isChanged = true; + } + } else { + String connectId = getConnectId(pub); + long version = pub.getVersion(); + long cacheVersion = cachePub == null ? 0L : cachePub.getVersion(); + String cacheConnectId = cachePub == null ? "" : getConnectId(cachePub); + if (cacheVersion <= version) { + cachePubMap.put(registerId, pub); + // if version of both pub and cachePub are not equal, or sourceAddress of both are not equal, update + // eg: sessionserver crash, client(RegistryClient but not ConfregClient) reconnect to other sessionserver, sourceAddress changed, version not changed + if (!connectId.equals(cacheConnectId) || cacheVersion < version) { + removeFromIndex(cachePub); + addToConnectIndex(pub); + isChanged = true; + } + } + } + return isChanged; + } + /** * * @param datum * @return */ - private static Long coverDatum(Datum datum) { + private Long coverDatum(Datum datum) { String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); Datum cacheDatum = DATUM_MAP.get(dataCenter).get(dataInfoId); @@ -286,25 +307,63 @@ private static Long coverDatum(Datum datum) { for (Entry pubEntry : pubMap.entrySet()) { String registerId = pubEntry.getKey(); Publisher pub = pubEntry.getValue(); - String pubAddr = pub.getSourceAddress().getAddressString(); - if (!CONNECT_ID_PUB_MAP.containsKey(pubAddr)) { - CONNECT_ID_PUB_MAP.putIfAbsent(pubAddr, new ConcurrentHashMap<>()); - } - CONNECT_ID_PUB_MAP.get(pubAddr).put(registerId, pub); + addToConnectIndex(pub); Publisher cachePub = cachePubMap.get(registerId); - if (cachePub != null - && pubAddr.equals(cachePub.getSourceAddress().getAddressString())) { + if (cachePub != null && getConnectId(pub).equals(getConnectId(cachePub))) { cachePubMap.remove(registerId); } } if (!cachePubMap.isEmpty()) { for (Publisher cachePub : cachePubMap.values()) { - CONNECT_ID_PUB_MAP.get(cachePub.getSourceAddress().getAddressString()).remove( - cachePub.getRegisterId()); + removeFromIndex(cachePub); } } } return cacheDatum.getVersion(); } + private void removeFromIndex(Publisher publisher) { + if (publisher == null) { + return; + } + String connectId = getConnectId(publisher); + + // remove from ALL_CONNECT_ID_INDEX + Map publisherMap = ALL_CONNECT_ID_INDEX.get(connectId); + if (publisherMap != null) { + publisherMap.remove(publisher.getRegisterId()); + } + + // remove from OWN_CONNECT_ID_INDEX + Map ownPublisherMap = OWN_CONNECT_ID_INDEX.get(connectId); + if (ownPublisherMap != null) { + ownPublisherMap.remove(publisher.getRegisterId()); + } + } + + private void addToConnectIndex(Publisher publisher) { + if (publisher == null) { + return; + } + String connectId = getConnectId(publisher); + + // add to ALL_CONNECT_ID_INDEX + Map publisherMap = ALL_CONNECT_ID_INDEX + .computeIfAbsent(connectId, s -> new ConcurrentHashMap<>()); + publisherMap.put(publisher.getRegisterId(), publisher); + + // add to OWN_CONNECT_ID_INDEX + DataServerNode dataServerNode = DataServerNodeFactory + .computeDataServerNode(dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); + if (DataServerConfig.IP.equals(dataServerNode.getIp())) { + Map ownPublisherMap = OWN_CONNECT_ID_INDEX + .computeIfAbsent(connectId, s -> new ConcurrentHashMap<>()); + ownPublisherMap.put(publisher.getRegisterId(), publisher); + } + } + + private String getConnectId(Publisher cachePub) { + return cachePub.getSourceAddress().getAddressString(); + } + } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index 6f9e0104f..306b68bbd 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.data.change; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -27,13 +36,6 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventQueue; import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executor; /** * notify sessionserver when data changed @@ -41,7 +43,7 @@ * @author qian.lqlq * @version $Id: DataChangeHandler.java, v 0.1 2017-12-07 18:44 qian.lqlq Exp $ */ -public class DataChangeHandler implements InitializingBean { +public class DataChangeHandler { private static final Logger LOGGER = LoggerFactory .getLogger(DataChangeHandler.class); @@ -54,26 +56,19 @@ public class DataChangeHandler implements InitializingBean { @Autowired private DataChangeEventCenter dataChangeEventCenter; + @Autowired + private DatumCache datumCache; + @Resource private List dataChangeNotifiers; - @Override - public void afterPropertiesSet() { - //init DataChangeEventCenter - dataChangeEventCenter.init(dataServerBootstrapConfig); - start(); - } - - /** - * - */ + @PostConstruct public void start() { DataChangeEventQueue[] queues = dataChangeEventCenter.getQueues(); int queueCount = queues.length; - Executor executor = ExecutorFactory.newFixedThreadPool(queueCount, - DataChangeHandler.class.getSimpleName()); - Executor notifyExecutor = ExecutorFactory.newFixedThreadPool( - dataServerBootstrapConfig.getQueueCount() * 5, this.getClass().getSimpleName()); + Executor executor = ExecutorFactory.newFixedThreadPool(queueCount, DataChangeHandler.class.getSimpleName()); + Executor notifyExecutor = ExecutorFactory + .newFixedThreadPool(dataServerBootstrapConfig.getQueueCount() * 5, this.getClass().getSimpleName()); for (int idx = 0; idx < queueCount; idx++) { final DataChangeEventQueue dataChangeEventQueue = queues[idx]; final String name = dataChangeEventQueue.getName(); @@ -120,7 +115,7 @@ public void run() { DataChangeTypeEnum changeType = changeData.getChangeType(); try { if (sourceType == DataSourceTypeEnum.CLEAN) { - if (DatumCache.cleanDatum(dataCenter, dataInfoId)) { + if (datumCache.cleanDatum(dataCenter, dataInfoId)) { LOGGER .info( "[DataChangeHandler][{}] clean datum, dataCenter={}, dataInfoId={}, version={},sourceType={}, changeType={}", @@ -135,11 +130,11 @@ public void run() { return; } - MergeResult mergeResult = DatumCache.putDatum(changeType, datum); + MergeResult mergeResult = datumCache.putDatum(changeType, datum); lastVersion = mergeResult.getLastVersion(); if (lastVersion != null - && lastVersion.longValue() == DatumCache.ERROR_DATUM_VERSION) { + && lastVersion.longValue() == datumCache.ERROR_DATUM_VERSION) { LOGGER .error( "[DataChangeHandler][{}] first put unPub datum into cache error, dataCenter={}, dataInfoId={}, version={}, sourceType={},isContainsUnPub={}", @@ -183,7 +178,7 @@ private void notifyTempPub(Datum datum, DataSourceTypeEnum sourceType, String dataInfoId = datum.getDataInfoId(); long version = datum.getVersion(); - Datum existDatum = DatumCache.get(dataCenter, dataInfoId); + Datum existDatum = datumCache.get(dataCenter, dataInfoId); if (existDatum != null) { Map cachePubMap = existDatum.getPubMap(); if (cachePubMap != null && !cachePubMap.isEmpty()) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java index 3383ad748..3834411d8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java @@ -18,10 +18,15 @@ import java.util.concurrent.atomic.AtomicBoolean; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.cache.UnPublisher; import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; @@ -44,16 +49,20 @@ public class DataChangeEventCenter { */ private DataChangeEventQueue[] dataChangeEventQueues; - /** - * - * @param config - */ - public void init(DataServerConfig config) { + @Autowired + private DataServerConfig dataServerBootstrapConfig; + + @Autowired + private DatumCache datumCache; + + @PostConstruct + public void init() { if (isInited.compareAndSet(false, true)) { - queueCount = config.getQueueCount(); + queueCount = dataServerBootstrapConfig.getQueueCount(); dataChangeEventQueues = new DataChangeEventQueue[queueCount]; for (int idx = 0; idx < queueCount; idx++) { - dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, config, this); + dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, + dataServerBootstrapConfig, this, datumCache); dataChangeEventQueues[idx].start(); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index ef0c08a1a..f1d886d77 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -85,13 +85,15 @@ public class DataChangeEventQueue { private DataChangeEventCenter dataChangeEventCenter; + private DatumCache datumCache; + /** * constructor * @param queueIdx * @param dataServerConfig */ public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig, - DataChangeEventCenter dataChangeEventCenter) { + DataChangeEventCenter dataChangeEventCenter, DatumCache datumCache) { this.queueIdx = queueIdx; this.name = String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), queueIdx); this.dataServerConfig = dataServerConfig; @@ -104,6 +106,7 @@ public DataChangeEventQueue(int queueIdx, DataServerConfig dataServerConfig, this.notifyIntervalMs = dataServerConfig.getNotifyIntervalMs(); this.notifyTempDataIntervalMs = dataServerConfig.getNotifyTempDataIntervalMs(); this.dataChangeEventCenter = dataChangeEventCenter; + this.datumCache = datumCache; } /** @@ -211,7 +214,7 @@ public void start() { private void handleClientOff(ClientChangeEvent event) { String connectId = event.getHost(); synchronized (Interners.newWeakInterner().intern(connectId)) { - Map pubMap = DatumCache.getByConnectId(connectId); + Map pubMap = datumCache.getByConnectId(connectId); if (pubMap != null && !pubMap.isEmpty()) { LOGGER.info( "[{}] client off begin, connectId={}, occurTimestamp={}, all pubSize={}", @@ -289,7 +292,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { String connectId = event.getHost(); Map snapshotPubMap = event.getPubMap(); synchronized (Interners.newWeakInterner().intern(connectId)) { - Map pubMap = DatumCache.getByConnectId(connectId); + Map pubMap = datumCache.getByConnectId(connectId); LOGGER.info("[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", getName(), connectId, pubMap != null ? pubMap.size() : null, snapshotPubMap.size()); int unpubSize = 0; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index 727156d35..199815013 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.data.change.notify; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -33,12 +40,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; /** * Notify session DataChangeRequest,if fail get result callback retry @@ -62,6 +63,9 @@ public class SessionServerNotifier implements IDataChangeNotifier { @Autowired private SessionServerConnectionFactory sessionServerConnectionFactory; + @Autowired + private DatumCache datumCache; + public SessionServerNotifier() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); @@ -140,7 +144,7 @@ private void onFailed(NotifyCallback notifyCallback) { connection.getRemoteAddress(), notifyCallback.retryTimes, request)); } //check version, if it's fall behind, stop retry - long currentVersion = DatumCache.get(request.getDataCenter(), request.getDataInfoId()).getVersion(); + long currentVersion = datumCache.get(request.getDataCenter(), request.getDataInfoId()).getVersion(); if (request.getVersion() == currentVersion) { doNotify(notifyCallback); } else { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java index fe5f919dc..0ccb094e6 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java @@ -60,6 +60,9 @@ public class LocalDataServerCleanHandler { @Autowired private DataChangeEventCenter dataChangeEventCenter; + @Autowired + private DatumCache datumCache; + private LocalCleanTask task; /** @@ -71,8 +74,7 @@ public class LocalDataServerCleanHandler { * constructor */ public LocalDataServerCleanHandler() { - Executor executor = ExecutorFactory - .newSingleThreadExecutor(LocalDataServerCleanHandler.class.getSimpleName()); + Executor executor = ExecutorFactory.newSingleThreadExecutor(LocalDataServerCleanHandler.class.getSimpleName()); executor.execute(() -> { while (true) { try { @@ -122,7 +124,7 @@ public void run() { ConsistentHash consistentHash = new ConsistentHash<>( dataServerBootstrapConfig.getNumberOfReplicas(), dataNodeMap.values()); - Map> dataMapAll = DatumCache.getAll(); + Map> dataMapAll = datumCache.getAll(); for (Entry> entryAll : dataMapAll.entrySet()) { String dataCenter = entryAll.getKey(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java index 124d306cb..e32684453 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java @@ -33,6 +33,7 @@ import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.datasync.AcceptorStore; import com.alipay.sofa.registry.server.data.datasync.Operator; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; @@ -67,6 +68,9 @@ public abstract class AbstractAcceptorStore implements AcceptorStore { @Autowired private DataServerConnectionFactory dataServerConnectionFactory; + @Autowired + private DatumCache datumCache; + private Map> acceptors = new ConcurrentHashMap<>(); private Map> notifyAcceptorsCache = new ConcurrentHashMap<>(); @@ -106,7 +110,8 @@ public void addOperator(Operator operator) { Acceptor existAcceptor = acceptorMap.get(dataInfoId); if (existAcceptor == null) { - Acceptor newAcceptor = new Acceptor(DEFAULT_MAX_BUFFER_SIZE, dataInfoId, dataCenter); + Acceptor newAcceptor = new Acceptor(DEFAULT_MAX_BUFFER_SIZE, dataInfoId, + dataCenter, datumCache); existAcceptor = acceptorMap.putIfAbsent(dataInfoId, newAcceptor); if (existAcceptor == null) { existAcceptor = newAcceptor; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java index 5650ea263..89c7886bb 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java @@ -16,13 +16,6 @@ */ package com.alipay.sofa.registry.server.data.datasync.sync; -import com.alipay.sofa.registry.common.model.dataserver.Datum; -import com.alipay.sofa.registry.common.model.dataserver.SyncData; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.server.data.cache.DatumCache; -import com.alipay.sofa.registry.server.data.datasync.Operator; - import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; @@ -36,6 +29,13 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.common.model.dataserver.SyncData; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.datasync.Operator; + /** * * @author shangyu.wh @@ -57,16 +57,19 @@ public class Acceptor { private final Lock read = readWriteLock.readLock(); private final Lock write = readWriteLock.writeLock(); + private final DatumCache datumCache; + /** * constructor * @param maxBufferSize * @param dataInfoId * @param dataCenter */ - public Acceptor(int maxBufferSize, String dataInfoId, String dataCenter) { + public Acceptor(int maxBufferSize, String dataInfoId, String dataCenter, DatumCache datumCache) { this.maxBufferSize = maxBufferSize; this.dataInfoId = dataInfoId; this.dataCenter = dataCenter; + this.datumCache = datumCache; } /** @@ -146,7 +149,7 @@ public SyncData process(Long currentVersion) { //first get all data if (operators.isEmpty()) { wholeDataTag = true; - retList.add(DatumCache.get(dataCenter, dataInfoId)); + retList.add(datumCache.get(dataCenter, dataInfoId)); LOGGER.info("Get all data!dataInfoID:{} dataCenter:{}.All data size{}:", dataInfoId, dataCenter, retList.size()); } else { @@ -162,7 +165,7 @@ public SyncData process(Long currentVersion) { "Append log queue is empty,Maybe all logs record expired or no operator append!So must get all data!dataInfoID:{} dataCenter:{}.queue size{}:", dataInfoId, dataCenter, logOperatorsOrder.size()); wholeDataTag = true; - retList.add(DatumCache.get(dataCenter, dataInfoId)); + retList.add(datumCache.get(dataCenter, dataInfoId)); syncData = new SyncData(dataInfoId, dataCenter, wholeDataTag, retList); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index d2d8cde68..4af96eee0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -16,6 +16,19 @@ */ package com.alipay.sofa.registry.server.data.event.handler; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.NotifyFetchDatumRequest; @@ -40,18 +53,6 @@ import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.google.common.collect.Lists; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.atomic.AtomicBoolean; /** * @@ -80,6 +81,9 @@ public class LocalDataServerChangeEventHandler extends @Autowired private DataNodeStatus dataNodeStatus; + @Autowired + private DatumCache datumCache; + private BlockingQueue events = new LinkedBlockingDeque<>(); private AtomicBoolean isChanged = new AtomicBoolean(false); @@ -182,7 +186,7 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) for (Entry dataTriadEntry : dataTriadMap .entrySet()) { String dataInfoId = dataTriadEntry.getKey(); - Datum datum = DatumCache.get(dataCenter, dataInfoId); + Datum datum = datumCache.get(dataCenter, dataInfoId); if (datum != null) { versionMap.put(dataInfoId, datum.getVersion()); } @@ -236,7 +240,7 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) } //compute new triad for every datum in cache - Map> allMap = DatumCache.getAll(); + Map> allMap = datumCache.getAll(); for (Entry> dataCenterEntry : allMap.entrySet()) { String dataCenter = dataCenterEntry.getKey(); Map datumMap = dataCenterEntry.getValue(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/FetchDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/FetchDataHandler.java index 76c9c0b33..0ebcab135 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/FetchDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/FetchDataHandler.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -25,8 +29,6 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.util.ParaCheckUtil; -import java.util.Map; - /** * processor to get specific data * @@ -35,6 +37,9 @@ */ public class FetchDataHandler extends AbstractClientHandler { + @Autowired + private DatumCache datumCache; + @Override public void checkParam(GetDataRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getDataInfoId(), "GetDataRequest.dataInfoId"); @@ -42,7 +47,7 @@ public void checkParam(GetDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, GetDataRequest request) { - return new GenericResponse>().fillSucceed(DatumCache + return new GenericResponse>().fillSucceed(datumCache .getDatumGroupByDataCenter(request.getDataCenter(), request.getDataInfoId())); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java index af94482d1..82cc09555 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; @@ -39,14 +48,6 @@ import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * @@ -79,6 +80,9 @@ public class NotifyDataSyncHandler extends AbstractClientHandler noWorkQueue = new LinkedBlockingQueue<>(); @Override @@ -98,23 +102,21 @@ public Object doHandle(Channel channel, NotifyDataSyncRequest request) { return CommonResponse.buildSuccessResponse(); } - private void executorRequest(Connection connection,NotifyDataSyncRequest request){ + private void executorRequest(Connection connection, NotifyDataSyncRequest request) { executor.execute(() -> { String dataInfoId = request.getDataInfoId(); String dataCenter = request.getDataCenter(); - Datum datum = DatumCache.get(dataCenter, dataInfoId); + Datum datum = datumCache.get(dataCenter, dataInfoId); Long version = (datum == null) ? null : datum.getVersion(); Long requestVersion = request.getVersion(); if (version == null || requestVersion == 0L || version < requestVersion) { - LOGGER.info( - "[NotifyDataSyncProcessor] begin get sync data, currentVersion={},request={}", version, + LOGGER.info("[NotifyDataSyncProcessor] begin get sync data, currentVersion={},request={}", version, request); - getSyncDataHandler - .syncData(new SyncDataCallback(getSyncDataHandler, connection, new SyncDataRequest(dataInfoId, - dataCenter, version, request.getDataSourceType()), dataChangeEventCenter)); + getSyncDataHandler.syncData(new SyncDataCallback(getSyncDataHandler, connection, + new SyncDataRequest(dataInfoId, dataCenter, version, request.getDataSourceType()), + dataChangeEventCenter)); } else { - LOGGER.info( - "[NotifyDataSyncHandler] not need to sync data, version={}", version); + LOGGER.info("[NotifyDataSyncHandler] not need to sync data, version={}", version); } }); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index cb11bf076..a0e3e2a31 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -16,6 +16,11 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; +import java.util.Map; +import java.util.Map.Entry; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -39,10 +44,6 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Map; -import java.util.Map.Entry; /** * @@ -63,15 +64,15 @@ public class NotifyFetchDatumHandler extends AbstractServerHandler= dataServerCache.getCurVersion()) { if (versionMap.isEmpty()) { - LOGGER - .info( - "[NotifyFetchDatumHandler] get changeVersion map is empty,change version is {},current version is {},ip is {}", - version, dataServerCache.getCurVersion(), ip); + LOGGER.info( + "[NotifyFetchDatumHandler] get changeVersion map is empty,change version is {},current version is {},ip is {}", + version, dataServerCache.getCurVersion(), ip); dataServerCache.synced(version, ip); } else { ExecutorFactory.getCommonExecutor().execute(() -> { @@ -97,7 +97,7 @@ public Object doHandle(Channel channel, NotifyFetchDatumRequest request) { Map map = dataCenterEntry.getValue(); for (Entry dataInfoEntry : map.entrySet()) { String dataInfoId = dataInfoEntry.getKey(); - Datum datum = DatumCache.get(dataCenter, dataInfoId); + Datum datum = datumCache.get(dataCenter, dataInfoId); if (datum != null) { long inVersion = dataInfoEntry.getValue(); long currentVersion = datum.getVersion(); @@ -121,8 +121,7 @@ public Object doHandle(Channel channel, NotifyFetchDatumRequest request) { }); } } else { - LOGGER.info( - "[NotifyFetchDatumHandler] ignore notify because changeVersion {} is less than {},ip is {}", + LOGGER.info("[NotifyFetchDatumHandler] ignore notify because changeVersion {} is less than {},ip is {}", version, dataServerCache.getCurVersion(), ip); } return CommonResponse.buildSuccessResponse(); @@ -136,8 +135,8 @@ public Object doHandle(Channel channel, NotifyFetchDatumRequest request) { * @param dataInfoId */ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { - while ((dataServerCache.getDataServers(dataServerConfig.getLocalDataCenter()).keySet()) - .contains(targetIp)) { + while ((dataServerCache.getDataServers(dataServerBootstrapConfig.getLocalDataCenter()) + .keySet()).contains(targetIp)) { Connection connection = dataServerConnectionFactory.getConnection(targetIp); if (connection == null || !connection.isFine()) { throw new RuntimeException(String.format("connection of %s is not available", diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java index a2a8e448f..e449826ee 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java @@ -49,12 +49,16 @@ public class GetDataHandler extends AbstractServerHandler { /** LOGGER */ private static final Logger LOGGER = LoggerFactory.getLogger(GetDataHandler.class); + @Autowired private ForwardService forwardService; @Autowired private DataServerConfig dataServerBootstrapConfig; + @Autowired + private DatumCache datumCache; + private ThreadPoolExecutor getDataProcessorExecutor; @Override @@ -78,7 +82,7 @@ public Object doHandle(Channel channel, GetDataRequest request) { } } - return new GenericResponse>().fillSucceed(DatumCache + return new GenericResponse>().fillSucceed(datumCache .getDatumGroupByDataCenter(request.getDataCenter(), dataInfoId)); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java index e2fa8e4e4..d894822aa 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -25,12 +33,6 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.util.ParaCheckUtil; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - /** * processor to get versions of specific dataInfoIds * @@ -38,6 +40,10 @@ * @version $Id: GetDataVersionsProcessor.java, v 0.1 2017-12-06 19:56 qian.lqlq Exp $ */ public class GetDataVersionsHandler extends AbstractServerHandler { + + @Autowired + private DatumCache datumCache; + @Override protected void logRequest(Channel channel, GetDataVersionRequest request) { } @@ -52,7 +58,7 @@ public Object doHandle(Channel channel, GetDataVersionRequest request) { Map> map = new HashMap<>(); List dataInfoIds = request.getDataInfoIds(); for (String dataInfoId : dataInfoIds) { - Map datumMap = DatumCache.get(dataInfoId); + Map datumMap = datumCache.get(dataInfoId); Set> entrySet = datumMap.entrySet(); for (Entry entry : entrySet) { String dataCenter = entry.getKey(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java index 4a1776cd1..f85309600 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java @@ -58,6 +58,9 @@ public class ReNewDatumHandler extends AbstractServerHandler @Autowired private DatumLeaseManager datumLeaseManager; + @Autowired + private DatumCache datumCache; + @Override public void checkParam(ReNewDatumRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getConnectId(), "ReNewDatumRequest.connectId"); @@ -104,15 +107,15 @@ protected Node.NodeType getConnectNodeType() { } /** - * 1. Update the timestamp corresponding to connectId in DatumCache - * 2. Compare checksum: Get all pubs corresponding to the connId from DatumCache and calculate checksum. + * 1. Update the timestamp corresponding to connectId in datumCache + * 2. Compare checksum: Get all pubs corresponding to the connId from datumCache and calculate checksum. */ private boolean reNewDatum(ReNewDatumRequest request) { String connectId = request.getConnectId(); - - Map publisherMap = DatumCache.getByConnectId(connectId); - String renewDigest = request.getDigestSum(); + + // Get all pubs corresponding to the connectId from datumCache + Map publisherMap = datumCache.getOwnByConnectId(connectId); String cacheDigest = null; if (publisherMap != null && publisherMap.values().size() > 0) { cacheDigest = String.valueOf(PublisherDigestUtil.getDigestValueSum(publisherMap diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 1b710534e..2adf19c25 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -60,6 +60,9 @@ public class UnPublishDataHandler extends AbstractServerHandler pubMap = datum.getPubMap(); if (pubMap != null) { Publisher publisher = pubMap.get(request.getRegisterId()); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java index a34a7104a..de514156e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java @@ -70,6 +70,9 @@ public class DataDigestResource { @Autowired private DataServerConfig dataServerConfig; + @Autowired + private DatumCache datumCache; + @GET @Path("datum/query") @Produces(MediaType.APPLICATION_JSON) @@ -83,9 +86,9 @@ public Map getDatumByDataInfoId(@QueryParam("dataId") String data String dataInfoId = DataInfo.toDataInfoId(dataId, instanceId, group); if (isBlank(dataCenter)) { - retList = DatumCache.get(dataInfoId); + retList = datumCache.get(dataInfoId); } else { - retList.put(dataCenter, DatumCache.get(dataCenter, dataInfoId)); + retList.put(dataCenter, datumCache.get(dataCenter, dataInfoId)); } } @@ -101,7 +104,7 @@ public Map> getPublishersByConnectId(Map { String connectId = NetUtil.genHost(ip, Integer.valueOf(port)); if (!connectId.isEmpty()) { - Map publisherMap = DatumCache.getByConnectId(connectId); + Map publisherMap = datumCache.getByConnectId(connectId); if (publisherMap != null && !publisherMap.isEmpty()) { ret.put(connectId, publisherMap); } @@ -118,17 +121,15 @@ public String getDatumCount() { StringBuilder sb = new StringBuilder("CacheDigest"); try { - Map> allMap = DatumCache.getAll(); + Map> allMap = datumCache.getAll(); if (!allMap.isEmpty()) { for (Entry> dataCenterEntry : allMap.entrySet()) { String dataCenter = dataCenterEntry.getKey(); Map datumMap = dataCenterEntry.getValue(); - sb.append(String.format(" [Datum] size of datum in %s is %s", - dataCenter, datumMap.size())); + sb.append(String.format(" [Datum] size of datum in %s is %s", dataCenter, datumMap.size())); int pubCount = datumMap.values().stream().map(Datum::getPubMap) .filter(map -> map != null && !map.isEmpty()).mapToInt(Map::size).sum(); - sb.append(String.format(",[Publisher] size of publisher in %s is %s", - dataCenter, pubCount)); + sb.append(String.format(",[Publisher] size of publisher in %s is %s", dataCenter, pubCount)); } } else { sb.append(" datum cache is empty"); @@ -174,24 +175,25 @@ public Map> getServerListAll(@PathParam("type") String type } public List getSessionServerList() { - List connections = sessionServerConnectionFactory.getConnections().stream().filter(connection -> connection != null && connection.isFine()) + List connections = sessionServerConnectionFactory.getConnections().stream() + .filter(connection -> connection != null && connection.isFine()) .map(connection -> connection.getRemoteIP() + ":" + connection.getRemotePort()) .collect(Collectors.toList()); return connections; } - public Map> getDataServerList() { + public Map> getDataServerList() { - Map> map = new HashMap<>(); + Map> map = new HashMap<>(); Set allDataCenter = new HashSet<>(DataServerNodeFactory.getAllDataCenters()); - for (String dataCenter:allDataCenter) { + for (String dataCenter : allDataCenter) { - List list = map.computeIfAbsent(dataCenter,k->new ArrayList<>()); + List list = map.computeIfAbsent(dataCenter, k -> new ArrayList<>()); Map dataNodes = DataServerNodeFactory.getDataServerNodes(dataCenter); - if(dataNodes != null && !dataNodes.isEmpty()){ + if (dataNodes != null && !dataNodes.isEmpty()) { - dataNodes.forEach((ip,dataServerNode)->{ + dataNodes.forEach((ip, dataServerNode) -> { if (ip != null && !ip.equals(DataServerConfig.IP)) { Connection connection = dataServerNode.getConnection(); if (connection != null && connection.isFine()) { @@ -204,18 +206,18 @@ public Map> getDataServerList() { return map; } - public Map> getMetaServerList() { + public Map> getMetaServerList() { - Map> map = new HashMap<>(); + Map> map = new HashMap<>(); Set allDataCenter = new HashSet<>(metaServerConnectionFactory.getAllDataCenters()); - for (String dataCenter:allDataCenter) { + for (String dataCenter : allDataCenter) { - List list = map.computeIfAbsent(dataCenter,k->new ArrayList<>()); + List list = map.computeIfAbsent(dataCenter, k -> new ArrayList<>()); Map metaConnections = metaServerConnectionFactory.getConnections(dataCenter); - if(metaConnections != null && !metaConnections.isEmpty()){ + if (metaConnections != null && !metaConnections.isEmpty()) { - metaConnections.forEach((ip,connection)->{ + metaConnections.forEach((ip, connection) -> { if (connection != null && connection.isFine()) { list.add(connection.getRemoteIP()); } diff --git a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java index d1cf8ebad..d9e2a6afd 100644 --- a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java +++ b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java @@ -16,15 +16,17 @@ */ package com.alipay.sofa.registry.server.data; -import com.alipay.sofa.registry.common.model.dataserver.Datum; -import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; -import com.alipay.sofa.registry.server.data.datasync.Operator; -import com.alipay.sofa.registry.server.data.datasync.sync.Acceptor; +import java.util.Collection; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.util.Collection; +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; +import com.alipay.sofa.registry.server.data.datasync.Operator; +import com.alipay.sofa.registry.server.data.datasync.sync.Acceptor; /** * @@ -75,7 +77,7 @@ public void setup() { @Test public void testAcceptExpired() throws InterruptedException { - Acceptor acceptor = new Acceptor(30, "11", "DefaultDataCenter"); + Acceptor acceptor = new Acceptor(30, "11", "DefaultDataCenter", new DatumCache()); Operator operator1 = new Operator(System.currentTimeMillis(), 0L, datum1, DataSourceTypeEnum.SYNC); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java index f7e7fb6b6..4d23053c1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.session.scheduler.task; import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; @@ -31,8 +32,9 @@ */ public class ReNewDatumTask extends AbstractSessionTask { - private final static Logger LOGGER = LoggerFactory.getLogger(ReNewDatumTask.class, - "[Task]"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[ReNewDatumTask]"); private final DataNodeService dataNodeService; @@ -55,7 +57,7 @@ public void execute() { try { Boolean result = dataNodeService.reNewDatum(reNewDatumRequest); if (!result) { - LOGGER + RENEW_LOGGER .info( "ReNew datum request to dataNode got sub digest different! reNewDatumRequest={}", reNewDatumRequest); @@ -65,7 +67,7 @@ public void execute() { } } catch (Exception e) { - LOGGER.error("ReNew datum request to dataNode error! reNewDatumRequest={}", + RENEW_LOGGER.error("ReNew datum request to dataNode error! reNewDatumRequest={}", reNewDatumRequest, e); } } diff --git a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java index de5859910..83c238b6c 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java @@ -186,12 +186,13 @@ protected static void clientOff() throws Exception { } protected static void clearData() throws Exception { - DatumCache.getAll().clear(); + DatumCache datumCache = (DatumCache) dataApplicationContext.getBean("datumCache"); + datumCache.getAll().clear(); List connectIds = new ArrayList<>(Arrays.asList( NetUtil.genHost(LOCAL_ADDRESS, getSourcePort(registryClient1)), NetUtil.genHost(LOCAL_ADDRESS, getSourcePort(registryClient2)))); for (String connectId : connectIds) { - Map publisherMap = DatumCache.getByConnectId(connectId); + Map publisherMap = datumCache.getByConnectId(connectId); if (publisherMap != null) { publisherMap.clear(); } From 12604896c80a9e652f9b257ba3e49496d4e3da3f Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 25 Jun 2019 16:57:03 +0800 Subject: [PATCH 038/161] add blacklist wrapper and filter --- .../model/constants/ValueConstants.java | 2 + .../meta/resource/BlacklistDataResource.java | 107 +++++++++ .../bootstrap/SessionServerBootstrap.java | 10 + .../bootstrap/SessionServerConfig.java | 4 + .../bootstrap/SessionServerConfigBean.java | 77 ++++--- .../bootstrap/SessionServerConfiguration.java | 64 ++++++ .../session/filter/DataIdMatchStrategy.java | 29 +++ .../session/filter/IPMatchStrategy.java | 29 +++ .../server/session/filter/ProcessFilter.java | 27 +++ .../filter/blacklist/BlacklistConfig.java | 76 +++++++ .../filter/blacklist/BlacklistConstants.java | 37 +++ .../filter/blacklist/BlacklistManager.java | 55 +++++ .../blacklist/BlacklistManagerImpl.java | 183 +++++++++++++++ .../BlacklistMatchProcessFilter.java | 132 +++++++++++ .../blacklist/DefaultDataIdMatchStrategy.java | 39 ++++ .../blacklist/DefaultIPMatchStrategy.java | 82 +++++++ .../session/filter/blacklist/MatchType.java | 80 +++++++ .../ProvideDataChangeFetchTaskListener.java | 6 +- .../SubscriberPushEmptyTaskListener.java | 77 +++++++ .../server/session/registry/Registry.java | 9 + .../session/registry/SessionRegistry.java | 137 ++++++++---- .../NotifyProvideDataChangeHandler.java | 3 +- .../task/ProvideDataChangeFetchTask.java | 73 +++++- .../task/SubscriberPushEmptyTask.java | 210 ++++++++++++++++++ .../wrapper/BlacklistWrapperInterceptor.java | 83 +++++++ .../ClientCheckWrapperInterceptor.java | 63 ++++++ .../server/session/wrapper/Wrapper.java | 31 +++ .../session/wrapper/WrapperInterceptor.java | 40 ++++ .../wrapper/WrapperInterceptorManager.java | 70 ++++++ .../session/wrapper/WrapperInvocation.java | 59 +++++ .../server/session/WrapperInvocationTest.java | 141 ++++++++++++ 31 files changed, 1947 insertions(+), 88 deletions(-) create mode 100644 server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/DataIdMatchStrategy.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/IPMatchStrategy.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/ProcessFilter.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConfig.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConstants.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManager.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManagerImpl.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistMatchProcessFilter.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultDataIdMatchStrategy.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultIPMatchStrategy.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/MatchType.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/Wrapper.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptorManager.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInvocation.java create mode 100644 server/server/session/src/test/java/com/alipay/sofa/registry/server/session/WrapperInvocationTest.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java index bd6f20409..d1bc537e1 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java @@ -56,4 +56,6 @@ public class ValueConstants { public static final String STOP_PUSH_DATA_SWITCH_DATA_ID = "session.stop.push.data.switch#@#9600#@#CONFIG"; + public static final String BLACK_LIST_DATA_ID = "session.blacklist.data#@#9600#@#CONFIG"; + } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java new file mode 100644 index 000000000..44d7ec031 --- /dev/null +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.meta.resource; + +import com.alipay.sofa.registry.common.model.console.PersistenceData; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.DataOperator; +import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; +import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.core.model.Result; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.store.api.DBService; +import com.alipay.sofa.registry.store.api.annotation.RaftReference; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * + * @author shangyu.wh + * @version $Id: StopPushDataResource.java, v 0.1 2018-07-25 11:40 shangyu.wh Exp $ + */ +@Path("stopPushDataSwitch") +public class BlacklistDataResource { + + private static final Logger DB_LOGGER = LoggerFactory.getLogger(StopPushDataResource.class, + "[DBService]"); + + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(StopPushDataResource.class, + "[Task]"); + + @RaftReference + private DBService persistenceDataDBService; + + @Autowired + private TaskListenerManager taskListenerManager; + + /** + * open push + */ + @POST + @Path("update") + @Produces(MediaType.APPLICATION_JSON) + public Result blacklistPush(String config) { + PersistenceData persistenceData = createDataInfo(); + persistenceData.setData(config); + try { + boolean ret = persistenceDataDBService.update(ValueConstants.BLACK_LIST_DATA_ID, + persistenceData); + DB_LOGGER.info("Success update blacklist to DB result {}!", ret); + } catch (Exception e) { + DB_LOGGER.error("Error update blacklist to DB!", e); + throw new RuntimeException("Update blacklist to error!"); + } + + fireDataChangeNotify(persistenceData.getVersion(), ValueConstants.BLACK_LIST_DATA_ID, + DataOperator.UPDATE); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + private PersistenceData createDataInfo() { + DataInfo dataInfo = DataInfo.valueOf(ValueConstants.BLACK_LIST_DATA_ID); + PersistenceData persistenceData = new PersistenceData(); + persistenceData.setDataId(dataInfo.getDataId()); + persistenceData.setGroup(dataInfo.getDataType()); + persistenceData.setInstanceId(dataInfo.getInstanceId()); + persistenceData.setVersion(System.currentTimeMillis()); + return persistenceData; + } + + private void fireDataChangeNotify(Long version, String dataInfoId, DataOperator dataOperator) { + + NotifyProvideDataChange notifyProvideDataChange = new NotifyProvideDataChange(dataInfoId, + version, dataOperator); + + TaskEvent taskEvent = new TaskEvent(notifyProvideDataChange, + TaskType.PERSISTENCE_DATA_CHANGE_NOTIFY_TASK); + TASK_LOGGER.info("send PERSISTENCE_DATA_CHANGE_NOTIFY_TASK notifyProvideDataChange:" + + notifyProvideDataChange); + taskListenerManager.sendTaskEvent(taskEvent); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 87b01b6bb..87d8b6425 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -31,6 +31,7 @@ import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; import com.alipay.sofa.registry.server.session.node.RaftClientManager; @@ -99,6 +100,9 @@ public class SessionServerBootstrap { @Autowired private RaftClientManager raftClientManager; + @Autowired + private BlacklistManager blacklistManager; + private Server server; private Server httpServer; @@ -260,6 +264,8 @@ private void connectMetaServer() { fetchStopPushSwitch(leaderUrl); + fetchBlackList(); + LOGGER.info("MetaServer connected {} server! Port:{}", size, sessionServerConfig.getMetaServerPort()); } @@ -312,6 +318,10 @@ private void fetchStopPushSwitch(URL leaderUrl) { } } + private void fetchBlackList() { + blacklistManager.load(); + } + private Object sendMetaRequest(Object request, URL leaderUrl) { Object ret; try { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 98668f574..17dc2d866 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -127,6 +127,10 @@ public interface SessionServerConfig { long getPushDataTaskRetryIncrementDelay(); + String getBlacklistPubDataIdRegex(); + + String getBlacklistSubDataIdRegex(); + int getNumberOfReplicas(); boolean isStopPushSwitch(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 916c5d641..8fbd7af9b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -18,7 +18,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; -import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; @@ -163,9 +162,9 @@ public class SessionServerConfigBean implements SessionServerConfig { private Pattern invalidIgnoreDataIdPattern = null; - private String pushEmptyDataDataIdPrefixes = ""; + private String blacklistPubDataIdRegex = "*"; - private Set pushEmptyDataDataIdPrefixesSet; + private String blacklistSubDataIdRegex = "*"; //end config for enterprise version @@ -904,10 +903,6 @@ public void setAccessDataExecutorKeepAliveTime(long accessDataExecutorKeepAliveT this.accessDataExecutorKeepAliveTime = accessDataExecutorKeepAliveTime; } - public String getPushEmptyDataDataIdPrefixes() { - return pushEmptyDataDataIdPrefixes; - } - /** * Getter method for property dataChangeExecutorMinPoolSize. * @@ -984,15 +979,6 @@ public void setDataChangeExecutorKeepAliveTime(long dataChangeExecutorKeepAliveT this.dataChangeExecutorKeepAliveTime = dataChangeExecutorKeepAliveTime; } - /** - * Setter method for property pushEmptyDataDataIdPrefixes. - * - * @param pushEmptyDataDataIdPrefixes value to be assigned to property pushEmptyDataDataIdPrefixes - */ - public void setPushEmptyDataDataIdPrefixes(String pushEmptyDataDataIdPrefixes) { - this.pushEmptyDataDataIdPrefixes = pushEmptyDataDataIdPrefixes; - } - /** * Getter method for property pushTaskExecutorMinPoolSize. * @@ -1069,29 +1055,6 @@ public void setPushTaskExecutorKeepAliveTime(long pushTaskExecutorKeepAliveTime) this.pushTaskExecutorKeepAliveTime = pushTaskExecutorKeepAliveTime; } - public Set getPushEmptyDataDataIdPrefixesSet() { - if (pushEmptyDataDataIdPrefixesSet == null || pushEmptyDataDataIdPrefixesSet.isEmpty()) { - Set s = new HashSet<>(); - String[] arr = pushEmptyDataDataIdPrefixes.split(";"); - for (String str : arr) { - if (str.trim().length() > 0) { - s.add(str); - } - } - pushEmptyDataDataIdPrefixesSet = Collections.unmodifiableSet(s); - } - return pushEmptyDataDataIdPrefixesSet; - } - - /** - * Setter method for property pushEmptyDataDataIdPrefixesSet. - * - * @param pushEmptyDataDataIdPrefixesSet value to be assigned to property pushEmptyDataDataIdPrefixesSet - */ - public void setPushEmptyDataDataIdPrefixesSet(Set pushEmptyDataDataIdPrefixesSet) { - this.pushEmptyDataDataIdPrefixesSet = pushEmptyDataDataIdPrefixesSet; - } - /** * Getter method for property defaultSessionExecutorMinPoolSize. * @@ -1317,6 +1280,42 @@ public void setPushDataTaskRetryIncrementDelay(long pushDataTaskRetryIncrementDe this.pushDataTaskRetryIncrementDelay = pushDataTaskRetryIncrementDelay; } + /** + * Getter method for property blacklistPubDataIdRegex. + * + * @return property value of blacklistPubDataIdRegex + */ + public String getBlacklistPubDataIdRegex() { + return blacklistPubDataIdRegex; + } + + /** + * Getter method for property blacklistSubDataIdRegex. + * + * @return property value of blacklistSubDataIdRegex + */ + public String getBlacklistSubDataIdRegex() { + return blacklistSubDataIdRegex; + } + + /** + * Setter method for property blacklistPubDataIdRegex. + * + * @param blacklistPubDataIdRegex value to be assigned to property blacklistPubDataIdRegex + */ + public void setBlacklistPubDataIdRegex(String blacklistPubDataIdRegex) { + this.blacklistPubDataIdRegex = blacklistPubDataIdRegex; + } + + /** + * Setter method for property blacklistSubDataIdRegex. + * + * @param blacklistSubDataIdRegex value to be assigned to property blacklistSubDataIdRegex + */ + public void setBlacklistSubDataIdRegex(String blacklistSubDataIdRegex) { + this.blacklistSubDataIdRegex = blacklistSubDataIdRegex; + } + @Override public boolean isInvalidForeverZone(String zoneId) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 63dff75e1..aa51f5236 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -24,6 +24,14 @@ import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumCacheGenerator; import com.alipay.sofa.registry.server.session.cache.SessionCacheService; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistMatchProcessFilter; +import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; +import com.alipay.sofa.registry.server.session.filter.IPMatchStrategy; +import com.alipay.sofa.registry.server.session.filter.ProcessFilter; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManagerImpl; +import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultDataIdMatchStrategy; +import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultIPMatchStrategy; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchCloudTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchTaskListener; @@ -33,6 +41,7 @@ import com.alipay.sofa.registry.server.session.listener.ReceivedDataMultiPushTaskListener; import com.alipay.sofa.registry.server.session.listener.SessionRegisterDataTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberMultiFetchTaskListener; +import com.alipay.sofa.registry.server.session.listener.SubscriberPushEmptyTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberRegisterFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.WatcherRegisterFetchTaskListener; import com.alipay.sofa.registry.server.session.node.DataNodeManager; @@ -104,6 +113,10 @@ import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSubscriberRegisterFetchTaskStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSyncConfigHandlerStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultWatcherHandlerStrategy; +import com.alipay.sofa.registry.server.session.wrapper.BlacklistWrapperInterceptor; +import com.alipay.sofa.registry.server.session.wrapper.ClientCheckWrapperInterceptor; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptor; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptorManager; import com.alipay.sofa.registry.task.batcher.TaskProcessor; import com.alipay.sofa.registry.task.listener.DefaultTaskListenerManager; import com.alipay.sofa.registry.task.listener.TaskListener; @@ -508,6 +521,13 @@ public TaskListener cancelDataTaskListener(TaskListenerManager taskListenerManag return taskListener; } + @Bean + public TaskListener subscriberPushEmptyTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new SubscriberPushEmptyTaskListener(); + taskListenerManager.addTaskListener(taskListener); + return taskListener; + } + @Bean public TaskListenerManager taskListenerManager() { return new DefaultTaskListenerManager(); @@ -602,4 +622,48 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { return new DefaultReceivedConfigDataPushTaskStrategy(); } } + + @Configuration + public static class SessionFilterConfiguration { + + @Bean + public IPMatchStrategy ipMatchStrategy() { + return new DefaultIPMatchStrategy(); + } + + @Bean + public DataIdMatchStrategy dataIdMatchStrategy() { + return new DefaultDataIdMatchStrategy(); + } + + @Bean + @ConditionalOnMissingBean + public ProcessFilter processFilter() { + return new BlacklistMatchProcessFilter(); + } + + @Bean + public BlacklistManager blacklistManager() { + return new BlacklistManagerImpl(); + } + + @Bean + public WrapperInterceptorManager wrapperInterceptorManager() { + return new WrapperInterceptorManager(); + } + + @Bean + public WrapperInterceptor clientCheckWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager) { + ClientCheckWrapperInterceptor clientCheckWrapperInterceptor = new ClientCheckWrapperInterceptor(); + wrapperInterceptorManager.addInterceptor(clientCheckWrapperInterceptor); + return clientCheckWrapperInterceptor; + } + + @Bean + public WrapperInterceptor blacklistWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager) { + BlacklistWrapperInterceptor blacklistWrapperInterceptor = new BlacklistWrapperInterceptor(); + wrapperInterceptorManager.addInterceptor(blacklistWrapperInterceptor); + return blacklistWrapperInterceptor; + } + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/DataIdMatchStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/DataIdMatchStrategy.java new file mode 100644 index 000000000..4f06c85e1 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/DataIdMatchStrategy.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter; + +import java.util.function.Supplier; + +/** + * + * @author shangyu.wh + * @version 1.0: DataIdMatchStrategy.java, v 0.1 2019-06-19 22:12 shangyu.wh Exp $ + */ +public interface DataIdMatchStrategy { + + boolean match(String dataId, Supplier getOperatorType); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/IPMatchStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/IPMatchStrategy.java new file mode 100644 index 000000000..76697a5af --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/IPMatchStrategy.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter; + +import java.util.function.Supplier; + +/** + * + * @author shangyu.wh + * @version 1.0: IPMatchStrategy.java, v 0.1 2019-06-19 22:14 shangyu.wh Exp $ + */ +public interface IPMatchStrategy { + + boolean match(String IP, Supplier getOperatorType); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/ProcessFilter.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/ProcessFilter.java new file mode 100644 index 000000000..040db92c5 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/ProcessFilter.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter; + +/** + * + * @author shangyu.wh + * @version 1.0: ProcessFilter.java, v 0.1 2019-06-19 17:01 shangyu.wh Exp $ + */ +public interface ProcessFilter { + + boolean match(T input); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConfig.java new file mode 100644 index 000000000..7e63e6bd2 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConfig.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import java.io.Serializable; +import java.util.List; + +/** + * + * @author shangyu.wh + * @version 1.0: BlacklistConfig.java, v 0.1 2019-06-19 17:23 shangyu.wh Exp $ + */ +public class BlacklistConfig implements Serializable { + + /** UID*/ + private static final long serialVersionUID = -7607561981062791932L; + + /** blacklist type */ + private String type; + + /** match type */ + @SuppressWarnings("rawtypes") + private List matchTypes; + + /** + * Getter method for property type. + * + * @return property value of type + */ + public String getType() { + return type; + } + + /** + * Setter method for property type. + * + * @param type value to be assigned to property type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Getter method for property matchTypes. + * + * @return property value of matchTypes + */ + @SuppressWarnings("rawtypes") + public List getMatchTypes() { + return matchTypes; + } + + /** + * Setter method for property matchTypes. + * + * @param matchTypes value to be assigned to property matchTypes + */ + @SuppressWarnings("rawtypes") + public void setMatchTypes(List matchTypes) { + this.matchTypes = matchTypes; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConstants.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConstants.java new file mode 100644 index 000000000..c5530f91d --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistConstants.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +/** + * + * @author shangyu.wh + * @version 1.0: BlacklistConstants.java, v 0.1 2019-06-19 17:56 shangyu.wh Exp $ + */ +public class BlacklistConstants { + + //*********************** Blacklist type ***********************// + /** forbidden pub */ + public static final String FORBIDDEN_PUB = "FORBIDDEN_PUB"; + + /** forbidden sub by prefix */ + public static final String FORBIDDEN_SUB_BY_PREFIX = "FORBIDDEN_SUB_BY_PREFIX"; + + //*********************** match type ***********************// + + /** match full ip */ + public static final String IP_FULL = "IP_FULL"; +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManager.java new file mode 100644 index 000000000..cf9a9733e --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManager.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * + * @author shangyu.wh + * @version 1.0: BlacklistManager.java, v 0.1 2019-06-19 18:27 shangyu.wh Exp $ + */ +public interface BlacklistManager { + /** + * load list first + */ + void load(); + + /** + * get list + * @return + */ + List getBlacklistConfigList(); + + /** + * set list + * @param blacklistConfigList + */ + void setBlacklistConfigList(List blacklistConfigList); + + /** + * convert blacklist map to blacklist config list + * @param config + * @return + * blacklistConfigMap key:blacklist type + * Map> key:MatchType + * set:match patterns + */ + Map>> convertBlacklistConfig(String config); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManagerImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManagerImpl.java new file mode 100644 index 000000000..f9ace0d5d --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistManagerImpl.java @@ -0,0 +1,183 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; +import com.alipay.sofa.registry.remoting.exchange.message.Request; +import com.alipay.sofa.registry.remoting.exchange.message.Response; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.RaftClientManager; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +/** + * + * @author shangyu.wh + * @version 1.0: BlacklistManagerImpl.java, v 0.1 2019-06-19 18:30 shangyu.wh Exp $ + */ +public class BlacklistManagerImpl implements BlacklistManager { + + private static final Logger LOGGER = LoggerFactory + .getLogger(BlacklistManagerImpl.class); + + private static final Logger EXCHANGE_LOGGER = LoggerFactory.getLogger("SESSION-EXCHANGE"); + + @Autowired + private SessionServerConfig sessionServerConfig; + + @Autowired + protected NodeExchanger metaNodeExchanger; + + @Autowired + protected RaftClientManager raftClientManager; + + private List blacklistConfigList = new ArrayList(); + + @Override + public void load() { + fetchStopPushSwitch(); + } + + @Override + public List getBlacklistConfigList() { + return blacklistConfigList; + } + + @Override + public void setBlacklistConfigList(List blacklistConfigList) { + this.blacklistConfigList = blacklistConfigList; + } + + private void fetchStopPushSwitch() { + + Object ret = sendMetaRequest(); + if (ret instanceof ProvideData) { + ProvideData provideData = (ProvideData) ret; + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session blacklist no data existed,current config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + if (data != null) { + convertBlacklistConfig(data); + EXCHANGE_LOGGER.info("Fetch session blacklist data switch {} success!", data); + } else { + LOGGER.info("Fetch session blacklist data null,current config not change!"); + } + } else { + LOGGER.info("Fetch session blacklist data null,config not change!"); + } + } + + private Object sendMetaRequest() { + try { + Request request = new Request() { + @Override + public FetchProvideDataRequest getRequestBody() { + return new FetchProvideDataRequest(ValueConstants.BLACK_LIST_DATA_ID); + } + + @Override + public URL getRequestUrl() { + return new URL(raftClientManager.getLeader().getIp(), + sessionServerConfig.getMetaServerPort()); + } + }; + + Response response = metaNodeExchanger.request(request); + + if (response != null && response.getResult() != null) { + EXCHANGE_LOGGER.info("Update blacklist info success!"); + return response.getResult(); + } else { + LOGGER.error("Get blacklist info error!No response receive!"); + throw new RuntimeException("Get blacklist info error!No response receive!"); + } + } catch (Exception e) { + LOGGER.error("Get blacklist info error!", e); + throw new RuntimeException("Get blacklist info error! ", e); + } + } + + /** + * @see BlacklistManager#convertBlacklistConfig(String) + */ + public Map>> convertBlacklistConfig(String config) { + + TypeReference>>> typeReference = new TypeReference>>>() { + }; + + ObjectMapper mapper = new ObjectMapper(); + + Map>> blacklistConfigMap; + try { + blacklistConfigMap = mapper.readValue(config, typeReference); + } catch (IOException e) { + LOGGER.error("Parser config json error!", e); + return null; + } + if (null == blacklistConfigMap) { + LOGGER.info("[cmd] setBlacklistConfig fail, params is null"); + return null; + } + try { + List blacklistConfigs = new ArrayList(); + for (Entry>> configEntry : blacklistConfigMap + .entrySet()) { + BlacklistConfig blacklistConfig = new BlacklistConfig(); + blacklistConfig.setType(configEntry.getKey()); + + List matchTypeList = new ArrayList(); + + Map> matchTypeMap = configEntry.getValue(); + for (Entry> typeEntry : matchTypeMap.entrySet()) { + String type = typeEntry.getKey(); + + MatchType ipFullMatchType = new MatchType(); + ipFullMatchType.setType(type); + ipFullMatchType.setPatternSet(typeEntry.getValue()); + matchTypeList.add(ipFullMatchType); + } + blacklistConfig.setMatchTypes(matchTypeList); + blacklistConfigs.add(blacklistConfig); + } + + setBlacklistConfigList(blacklistConfigs); + return blacklistConfigMap; + } catch (Exception e) { + LOGGER.error("[cmd] setBlacklistConfig error", e); + return null; + } + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistMatchProcessFilter.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistMatchProcessFilter.java new file mode 100644 index 000000000..5f1845915 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/BlacklistMatchProcessFilter.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import com.alipay.sofa.registry.common.model.store.BaseInfo; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; +import com.alipay.sofa.registry.server.session.filter.IPMatchStrategy; +import com.alipay.sofa.registry.server.session.filter.ProcessFilter; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * + * @author shangyu.wh + * @version 1.0: BlacklistMatchProcessFilter.java, v 0.1 2019-06-19 22:01 shangyu.wh Exp $ + */ +public class BlacklistMatchProcessFilter implements ProcessFilter { + + @Autowired + private DataIdMatchStrategy dataIdMatchStrategy; + + @Autowired + private IPMatchStrategy ipMatchStrategy; + + @Autowired + private BlacklistManager blacklistManager; + + @Autowired + private SessionServerConfig sessionServerConfig; + + @Override + public boolean match(BaseInfo storeData) { + + final List configList = blacklistManager.getBlacklistConfigList(); + + // empty list proceed + if (null == configList || configList.size() == 0) { + return false; + } + + URL url = storeData.getSourceAddress(); + + if (url != null) { + + switch (storeData.getDataType()) { + case PUBLISHER: + if(dataIdMatchStrategy.match(storeData.getDataId(),()-> sessionServerConfig.getBlacklistPubDataIdRegex())){ + return ipMatchStrategy.match(url.getIpAddress(),()-> BlacklistConstants.FORBIDDEN_PUB); + } + case SUBSCRIBER: + if(dataIdMatchStrategy.match(storeData.getDataId(),()-> sessionServerConfig.getBlacklistSubDataIdRegex())){ + return ipMatchStrategy.match(url.getIpAddress(),()-> BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX); + } + default: + return false; + } + + } + return false; + } + + /** + * Getter method for property dataIdMatchStrategy. + * + * @return property value of dataIdMatchStrategy + */ + public DataIdMatchStrategy getDataIdMatchStrategy() { + return dataIdMatchStrategy; + } + + /** + * Setter method for property dataIdMatchStrategy. + * + * @param dataIdMatchStrategy value to be assigned to property dataIdMatchStrategy + */ + public void setDataIdMatchStrategy(DataIdMatchStrategy dataIdMatchStrategy) { + this.dataIdMatchStrategy = dataIdMatchStrategy; + } + + /** + * Getter method for property ipMatchStrategy. + * + * @return property value of ipMatchStrategy + */ + public IPMatchStrategy getIpMatchStrategy() { + return ipMatchStrategy; + } + + /** + * Setter method for property ipMatchStrategy. + * + * @param ipMatchStrategy value to be assigned to property ipMatchStrategy + */ + public void setIpMatchStrategy(IPMatchStrategy ipMatchStrategy) { + this.ipMatchStrategy = ipMatchStrategy; + } + + /** + * Getter method for property blacklistManager. + * + * @return property value of blacklistManager + */ + public BlacklistManager getBlacklistManager() { + return blacklistManager; + } + + /** + * Setter method for property blacklistManager. + * + * @param blacklistManager value to be assigned to property blacklistManager + */ + public void setBlacklistManager(BlacklistManager blacklistManager) { + this.blacklistManager = blacklistManager; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultDataIdMatchStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultDataIdMatchStrategy.java new file mode 100644 index 000000000..23abfaecd --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultDataIdMatchStrategy.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; +import org.springframework.util.StringUtils; + +import java.util.function.Supplier; +import java.util.regex.Pattern; + +/** + * + * @author shangyu.wh + * @version 1.0: DefaultDataIdMatchStrategy.java, v 0.1 2019-06-19 22:15 shangyu.wh Exp $ + */ +public class DefaultDataIdMatchStrategy implements DataIdMatchStrategy { + + @Override + public boolean match(String dataId, Supplier getOperatorType) { + if (StringUtils.hasText(dataId) && StringUtils.hasText(getOperatorType.get())) { + return Pattern.matches(getOperatorType.get(), dataId); + } + return true; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultIPMatchStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultIPMatchStrategy.java new file mode 100644 index 000000000..f4289f374 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/DefaultIPMatchStrategy.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import com.alipay.sofa.registry.server.session.filter.IPMatchStrategy; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +/** + * + * @author shangyu.wh + * @version 1.0: DefaultIPMatchStrategy.java, v 0.1 2019-06-19 22:16 shangyu.wh Exp $ + */ +public class DefaultIPMatchStrategy implements IPMatchStrategy { + + @Autowired + private BlacklistManager blacklistManager; + + @Override + public boolean match(String IP, Supplier getOperatorType) { + return match(getOperatorType.get(), IP); + } + + private boolean match(String type, String matchPattern) { + + List configList = blacklistManager.getBlacklistConfigList(); + for (BlacklistConfig blacklistConfig : configList) { + + // 如黑名单类型不匹配则跳过 + if (!StringUtils.equals(type, blacklistConfig.getType())) { + continue; + } + + List matchTypeList = blacklistConfig.getMatchTypes(); + + // 匹配规则为空跳过 + if (null == matchTypeList || matchTypeList.size() == 0) { + continue; + } + + for (MatchType matchType : matchTypeList) { + if (null == matchType) { + continue; + } + + if (BlacklistConstants.IP_FULL.equals(matchType.getType())) { + // IP 全匹配时判断当前发布者IP是否在IP列表中,如命中则拒绝发布 + @SuppressWarnings("unchecked") + Set patterns = matchType.getPatternSet(); + + if (null == patterns || patterns.size() == 0) { + continue; + } + + if (patterns.contains(matchPattern)) { + return true; + } + } + } + } + return false; + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/MatchType.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/MatchType.java new file mode 100644 index 000000000..6a1318770 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/filter/blacklist/MatchType.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.filter.blacklist; + +import java.io.Serializable; +import java.util.Set; + +/** + * + * @author shangyu.wh + * @version 1.0: MatchType.java, v 0.1 2019-06-19 17:25 shangyu.wh Exp $ + */ +public class MatchType implements Serializable { + /** UID */ + private static final long serialVersionUID = 4015181538538056685L; + + /** match type */ + private String type; + + /** match patterns */ + private Set patternSet; + + /** + * Getter method for property type. + * + * @return property value of type + */ + public String getType() { + return type; + } + + /** + * Setter method for property type. + * + * @param type value to be assigned to property type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Getter method for property patternSet. + * + * @return property value of patternSet + */ + public Set getPatternSet() { + return patternSet; + } + + /** + * Setter method for property patternSet. + * + * @param patternSet value to be assigned to property patternSet + */ + public void setPatternSet(Set patternSet) { + this.patternSet = patternSet; + } + + /** + * @see Object#toString() + */ + @Override + public String toString() { + return "MatchType{" + "type='" + type + '\'' + ", patternSet=" + patternSet + '}'; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java index fe4b73208..aeb82529b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java @@ -18,6 +18,7 @@ import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.scheduler.task.ProvideDataChangeFetchTask; @@ -67,6 +68,9 @@ public class ProvideDataChangeFetchTaskListener implements TaskListener { @Autowired private Registry sessionRegistry; + @Autowired + private BlacklistManager blacklistManager; + private TaskDispatcher singleTaskDispatcher; private TaskProcessor dataNodeSingleTaskProcessor; @@ -93,7 +97,7 @@ public void handleEvent(TaskEvent event) { SessionTask provideDataChangeFetchTask = new ProvideDataChangeFetchTask( sessionServerConfig, taskListenerManager, metaNodeService, sessionWatchers, - boltExchange, sessionInterests, sessionRegistry); + boltExchange, sessionInterests, sessionRegistry, blacklistManager); provideDataChangeFetchTask.setTaskEvent(event); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java new file mode 100644 index 000000000..955af4062 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.listener; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.server.session.scheduler.task.SubscriberPushEmptyTask; +import com.alipay.sofa.registry.task.batcher.TaskDispatcher; +import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import com.alipay.sofa.registry.task.batcher.TaskProcessor; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListener; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author shangyu.wh + * @version $Id: SubscriberRegisterFetchTaskListener.java, v 0.1 2017-12-07 19:53 shangyu.wh Exp $ + */ +public class SubscriberPushEmptyTaskListener implements TaskListener { + + @Autowired + private SessionServerConfig sessionServerConfig; + + /** + * trigger task com.alipay.sofa.registry.server.meta.listener process + */ + @Autowired + private TaskListenerManager taskListenerManager; + + private TaskDispatcher singleTaskDispatcher; + + @Autowired + private TaskProcessor dataNodeSingleTaskProcessor; + + public TaskDispatcher getSingleTaskDispatcher() { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( + TaskType.SUBSCRIBER_PUSH_EMPTY_TASK.getName(), dataNodeSingleTaskProcessor); + } + return singleTaskDispatcher; + } + + @Override + public boolean support(TaskEvent event) { + return TaskType.SUBSCRIBER_PUSH_EMPTY_TASK.equals(event.getTaskType()); + } + + @Override + public void handleEvent(TaskEvent event) { + + SessionTask subscriberPushEmptyTask = new SubscriberPushEmptyTask(sessionServerConfig, + taskListenerManager); + + subscriberPushEmptyTask.setTaskEvent(event); + + getSingleTaskDispatcher().dispatch(subscriberPushEmptyTask.getTaskId(), + subscriberPushEmptyTask, subscriberPushEmptyTask.getExpiryTime()); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 6d4920f14..09d55d945 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -43,6 +43,15 @@ public interface Registry { */ void cancel(List connectIds); + /** + * remove publisher or subscriber data by client ip address and port(ip:port) + * this function always use in rest api Console manage ,the run mode is standard + * remove subscriber data will push empty datum to some one who has dataInfoId begin with pushEmptyDataDataIdPrefixes config + * + * @param connectIds + */ + void remove(List connectIds); + /** * message mode com.alipay.sofa.registry.client.provider for client node to unregister single subscriber or publisher data * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index fe40e3a48..02c86ed6e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -17,7 +17,6 @@ package com.alipay.sofa.registry.server.session.registry; import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.store.BaseInfo; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.StoreData; import com.alipay.sofa.registry.common.model.store.Subscriber; @@ -25,16 +24,18 @@ import com.alipay.sofa.registry.common.model.store.Watcher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.server.session.strategy.SessionRegistryStrategy; +import com.alipay.sofa.registry.server.session.wrapper.Wrapper; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptorManager; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInvocation; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; @@ -46,6 +47,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; /** * @@ -54,90 +56,112 @@ */ public class SessionRegistry implements Registry { - private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, - "[Task]"); + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, + "[Task]"); /** * store subscribers */ @Autowired - private Interests sessionInterests; + private Interests sessionInterests; /** * store watchers */ @Autowired - private Watchers sessionWatchers; + private Watchers sessionWatchers; /** * store publishers */ @Autowired - private DataStore sessionDataStore; + private DataStore sessionDataStore; /** * transfer data to DataNode */ @Autowired - private DataNodeService dataNodeService; + private DataNodeService dataNodeService; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; /** * calculate data node url */ @Autowired - private NodeManager dataNodeManager; + private NodeManager dataNodeManager; @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Exchange boltExchange; + private Exchange boltExchange; @Autowired - private SessionRegistryStrategy sessionRegistryStrategy; + private SessionRegistryStrategy sessionRegistryStrategy; + + @Autowired + private WrapperInterceptorManager wrapperInterceptorManager; + + @Autowired + private DataIdMatchStrategy dataIdMatchStrategy; @Override public void register(StoreData storeData) { - //check connect already existed - checkConnect(storeData); - switch (storeData.getDataType()) { - case PUBLISHER: - Publisher publisher = (Publisher) storeData; + WrapperInvocation wrapperInvocation = new WrapperInvocation(new Wrapper() { + @Override + public Boolean call() { - dataNodeService.register(publisher); + switch (storeData.getDataType()) { + case PUBLISHER: + Publisher publisher = (Publisher) storeData; - sessionDataStore.add(publisher); + dataNodeService.register(publisher); - sessionRegistryStrategy.afterPublisherRegister(publisher); - break; - case SUBSCRIBER: - Subscriber subscriber = (Subscriber) storeData; + sessionDataStore.add(publisher); - sessionInterests.add(subscriber); + sessionRegistryStrategy.afterPublisherRegister(publisher); + break; + case SUBSCRIBER: + Subscriber subscriber = (Subscriber) storeData; - sessionRegistryStrategy.afterSubscriberRegister(subscriber); - break; - case WATCHER: - Watcher watcher = (Watcher) storeData; + sessionInterests.add(subscriber); - sessionWatchers.add(watcher); + sessionRegistryStrategy.afterSubscriberRegister(subscriber); + break; + case WATCHER: + Watcher watcher = (Watcher) storeData; - sessionRegistryStrategy.afterWatcherRegister(watcher); - break; - default: - break; - } + sessionWatchers.add(watcher); + + sessionRegistryStrategy.afterWatcherRegister(watcher); + break; + default: + break; + } + return null; + } + + @Override + public Supplier getParameterSupplier() { + return ()->storeData; + } + + }, wrapperInterceptorManager); + try { + wrapperInvocation.proceed(); + } catch (Exception e) { + throw new RuntimeException("Proceed register error!",e); + } } @Override @@ -239,20 +263,41 @@ private Map> calculateDataNode(Collection dat return map; } - private void checkConnect(StoreData storeData) { + public void remove(List connectIds) { - BaseInfo baseInfo = (BaseInfo) storeData; + List connectIdsAll = new ArrayList<>(); + connectIds.forEach(connectId -> { + Map pubMap = getSessionDataStore().queryByConnectId(connectId); + boolean pubExisted = pubMap != null && !pubMap.isEmpty(); - Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + Map subMap = getSessionInterests().queryByConnectId(connectId); + boolean subExisted = false; + if(subMap != null && !subMap.isEmpty()){ + subExisted = true; - Channel channel = sessionServer.getChannel(baseInfo.getSourceAddress()); + subMap.forEach((registerId,sub)->{ + if(dataIdMatchStrategy.match(sub.getDataId(),()->sessionServerConfig.getBlacklistSubDataIdRegex())) { + fireSubscriberPushEmptyTask(sub); + } + }); + } - if (channel == null) { - throw new RuntimeException(String.format( - "Register address %s has not connected session server!", - baseInfo.getSourceAddress())); - } + if(pubExisted || subExisted){ + connectIdsAll.add(connectId); + } + }); + TaskEvent taskEvent = new TaskEvent(connectIds, TaskEvent.TaskType.CANCEL_DATA_TASK); + TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); + getTaskListenerManager().sendTaskEvent(taskEvent); + } + + private void fireSubscriberPushEmptyTask(Subscriber subscriber) { + //trigger empty data push + TaskEvent taskEvent = new TaskEvent(subscriber, + TaskEvent.TaskType.SUBSCRIBER_PUSH_EMPTY_TASK); + TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); + getTaskListenerManager().sendTaskEvent(taskEvent); } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java index eb59882c1..ac18b3743 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java @@ -68,7 +68,8 @@ public Object reply(Channel channel, Object message) { NotifyProvideDataChange notifyProvideDataChange = (NotifyProvideDataChange) message; if (!ValueConstants.STOP_PUSH_DATA_SWITCH_DATA_ID.equals(notifyProvideDataChange - .getDataInfoId())) { + .getDataInfoId()) + && !ValueConstants.BLACK_LIST_DATA_ID.equals(notifyProvideDataChange.getDataInfoId())) { boolean result = sessionWatchers.checkWatcherVersions( notifyProvideDataChange.getDataInfoId(), notifyProvideDataChange.getVersion()); if (!result) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java index 7d6c69ca9..22e1dadcf 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java @@ -33,6 +33,8 @@ import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.converter.ReceivedDataConverter; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistConstants; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.store.Interests; @@ -46,8 +48,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -82,13 +86,15 @@ public class ProvideDataChangeFetchTask extends AbstractSessionTask { private final Registry sessionRegistry; + private final BlacklistManager blacklistManager; + private NotifyProvideDataChange notifyProvideDataChange; public ProvideDataChangeFetchTask(SessionServerConfig sessionServerConfig, TaskListenerManager taskListenerManager, MetaNodeService metaNodeService, Watchers sessionWatchers, Exchange boltExchange, Interests sessionInterests, - Registry sessionRegistry) { + Registry sessionRegistry, BlacklistManager blacklistManager) { this.sessionServerConfig = sessionServerConfig; this.taskListenerManager = taskListenerManager; this.metaNodeService = metaNodeService; @@ -96,6 +102,7 @@ public ProvideDataChangeFetchTask(SessionServerConfig sessionServerConfig, this.boltExchange = boltExchange; this.sessionInterests = sessionInterests; this.sessionRegistry = sessionRegistry; + this.blacklistManager = blacklistManager; } @Override @@ -123,6 +130,7 @@ public void execute() { provideData = metaNodeService.fetchData(dataInfoId); if (ValueConstants.STOP_PUSH_DATA_SWITCH_DATA_ID.equals(dataInfoId)) { + //push stop switch if (provideData != null) { if (provideData.getProvideData() == null || provideData.getProvideData().getObject() == null) { LOGGER.info("Fetch session stop push switch no data existed,config not change!"); @@ -153,6 +161,22 @@ public void execute() { LOGGER.info("Fetch session stop push switch data null,config not change!"); } return; + }else if(ValueConstants.BLACK_LIST_DATA_ID.equals(dataInfoId)){ + //black list data + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session blacklist no data existed,current config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + if (data != null) { + Map>> blacklistConfigMap = blacklistManager.convertBlacklistConfig(data); + clientOffBlackIp(blacklistConfigMap); + LOGGER.info("Fetch session blacklist data switch {} success!", data); + }else { + LOGGER.info("Fetch session blacklist data null,current config not change!"); + } + return; } if (provideData == null) { LOGGER.warn("Notify provider data Change request {} fetch no provider data!", notifyProvideDataChange); @@ -247,6 +271,53 @@ private void firePushTask(ReceivedConfigData receivedConfigData, URL clientUrl) taskListenerManager.sendTaskEvent(taskEvent); } + private void clientOffBlackIp(Map>> blacklistConfigMap) { + + if (blacklistConfigMap != null) { + Set ipSet = new HashSet(); + + for (Map.Entry>> configEntry : blacklistConfigMap + .entrySet()) { + if (BlacklistConstants.FORBIDDEN_PUB.equals(configEntry.getKey()) + || BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX.equals(configEntry.getKey())) { + Map> typeMap = configEntry.getValue(); + if (typeMap != null) { + for (Map.Entry> typeEntry : typeMap.entrySet()) { + if (BlacklistConstants.IP_FULL.equals(typeEntry.getKey())) { + if (typeEntry.getValue() != null) { + ipSet.addAll(typeEntry.getValue()); + } + } + } + } + } + + } + + sessionRegistry.remove(getIpConnects(ipSet)); + } + } + + public List getIpConnects(Set _ipList) { + + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + + List connections = new ArrayList<>(); + + if (sessionServer != null) { + Collection channels = sessionServer.getChannels(); + for (Channel channel : channels) { + String key = NetUtil.toAddressString(channel.getRemoteAddress()); + String ip = key.substring(0, key.indexOf(":")); + if (_ipList.contains(ip)) { + connections.add(key); + } + } + } + + return connections; + } + private Map getCache(String connectId) { Map map = sessionWatchers.queryByConnectId(connectId); return map == null ? new ConcurrentHashMap<>() : map; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java new file mode 100644 index 000000000..4dff3c475 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.scheduler.task; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; +import com.alipay.sofa.registry.common.model.store.Subscriber; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.core.model.ReceivedData; +import com.alipay.sofa.registry.core.model.ScopeEnum; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.converter.ReceivedDataConverter; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * @author shangyu.wh + * @version $Id: SubscriberRegisterFetchTask.java, v 0.1 2017-12-07 16:23 shangyu.wh Exp $ + */ +public class SubscriberPushEmptyTask extends AbstractSessionTask { + + private static final Logger taskLogger = LoggerFactory.getLogger( + SubscriberPushEmptyTask.class, "[Task]"); + + private final SessionServerConfig sessionServerConfig; + /** + * trigger task com.alipay.sofa.registry.server.meta.listener process + */ + private final TaskListenerManager taskListenerManager; + private Subscriber subscriber; + + public SubscriberPushEmptyTask(SessionServerConfig sessionServerConfig, + TaskListenerManager taskListenerManager) { + this.sessionServerConfig = sessionServerConfig; + this.taskListenerManager = taskListenerManager; + } + + @Override + public long getExpiryTime() { + return -1; + } + + @Override + public void setTaskEvent(TaskEvent taskEvent) { + //taskId create from event + if (taskEvent.getTaskId() != null) { + setTaskId(taskEvent.getTaskId()); + } + + Object obj = taskEvent.getEventObj(); + + if (!(obj instanceof Subscriber)) { + throw new IllegalArgumentException("Input task event object error!"); + } + + this.subscriber = (Subscriber) obj; + } + + @Override + public void execute() { + executeTask(); + } + + private void executeTask() { + + if (subscriber == null) { + throw new IllegalArgumentException("Subscriber can not be null!"); + } + + List subscriberRegisterIdList = Collections.singletonList(subscriber + .getRegisterId()); + + boolean isOldVersion = !ClientVersion.StoreData.equals(subscriber.getClientVersion()); + + switch (subscriber.getScope()) { + case zone: + if (isOldVersion) { + fireUserDataElementPushTask(); + } else { + fireReceivedDataPushTask(subscriberRegisterIdList, ScopeEnum.zone); + } + break; + + case dataCenter: + if (isOldVersion) { + fireUserDataElementMultiPushTask(); + } else { + fireReceivedDataPushTask(subscriberRegisterIdList, ScopeEnum.dataCenter); + } + break; + + case global: + + fireReceivedDataPushTask(subscriberRegisterIdList, ScopeEnum.global); + + break; + default: + break; + } + + } + + private void fireReceivedDataPushTask(List subscriberRegisterIdList, ScopeEnum scopeEnum) { + ReceivedData receivedData = ReceivedDataConverter.getReceivedDataMulti( + subscriber.getDataId(), subscriber.getGroup(), subscriber.getInstanceId(), + sessionServerConfig.getSessionServerDataCenter(), scopeEnum, subscriberRegisterIdList, + sessionServerConfig.getSessionServerRegion()); + //no datum set version current timestamp + receivedData.setVersion(System.currentTimeMillis()); + firePush(receivedData); + } + + private void firePush(ReceivedData receivedData) { + //trigger push to client node + Map parameter = new HashMap<>(); + parameter.put(receivedData, subscriber.getSourceAddress()); + TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); + taskLogger.info("send {} taskURL:{},taskScope", taskEvent.getTaskType(), + subscriber.getSourceAddress(), receivedData.getScope()); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void fireUserDataElementPushTask() { + + //no datum + Datum datum = new Datum(); + datum.setDataId(subscriber.getDataId()); + datum.setInstanceId(subscriber.getInstanceId()); + datum.setGroup(subscriber.getGroup()); + //no datum set version current timestamp + datum.setVersion(System.currentTimeMillis()); + datum.setPubMap(new HashMap<>()); + datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); + + Collection subscribers = new ArrayList<>(); + subscribers.add(subscriber); + + TaskEvent taskEvent = new TaskEvent(subscriber, TaskType.USER_DATA_ELEMENT_PUSH_TASK); + + taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); + taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); + taskEvent.setAttribute(Constant.PUSH_CLIENT_URL, subscriber.getSourceAddress()); + + taskLogger.info("send {} taskURL:{}", taskEvent.getTaskType(), + subscriber.getSourceAddress()); + taskListenerManager.sendTaskEvent(taskEvent); + } + + private void fireUserDataElementMultiPushTask() { + + //no datum + Datum datum = new Datum(); + datum.setDataId(subscriber.getDataId()); + datum.setInstanceId(subscriber.getInstanceId()); + datum.setGroup(subscriber.getGroup()); + //no datum set version as mini as + datum.setVersion(System.currentTimeMillis()); + datum.setPubMap(new HashMap<>()); + datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); + + Collection subscribers = new ArrayList<>(); + subscribers.add(subscriber); + + TaskEvent taskEvent = new TaskEvent(subscriber, TaskType.USER_DATA_ELEMENT_MULTI_PUSH_TASK); + taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); + taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); + taskEvent.setAttribute(Constant.PUSH_CLIENT_URL, subscriber.getSourceAddress()); + + taskLogger.info("send {} taskURL:{}", taskEvent.getTaskType(), + subscriber.getSourceAddress()); + taskListenerManager.sendTaskEvent(taskEvent); + } + + @Override + public boolean checkRetryTimes() { + return checkRetryTimes(sessionServerConfig.getSubscriberRegisterFetchRetryTimes()); + } + + @Override + public String toString() { + return "SubscriberPushEmptyTask{" + "taskId='" + getTaskId() + '\'' + ", subscriber=" + + subscriber + ", expiryTime='" + getExpiryTime() + '\'' + '}'; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java new file mode 100644 index 000000000..fd334641f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import com.alipay.sofa.registry.common.model.store.BaseInfo; +import com.alipay.sofa.registry.common.model.store.StoreData; +import com.alipay.sofa.registry.common.model.store.StoreData.DataType; +import com.alipay.sofa.registry.common.model.store.Subscriber; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.filter.ProcessFilter; +import com.alipay.sofa.registry.server.session.registry.SessionRegistry; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * blacklist filter + * + * @author shangyu.wh + * @version 1.0: BlacklistWrapperInterceptor.java, v 0.1 2019-06-18 22:26 shangyu.wh Exp $ + */ +public class BlacklistWrapperInterceptor implements WrapperInterceptor { + + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, + "[Task]"); + + @Autowired + private TaskListenerManager taskListenerManager; + + /** + * blacklist filter + */ + @Autowired + private ProcessFilter processFilter; + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) + throws Exception { + + BaseInfo storeData = (BaseInfo) invocation.getParameterSupplier().get(); + + if (processFilter.match(storeData)) { + if (DataType.PUBLISHER == storeData.getDataType()) { + // match blacklist stop pub. + return true; + } + + if (DataType.SUBSCRIBER == storeData.getDataType()) { + fireSubscriberPushEmptyTask((Subscriber) storeData); + return true; + } + } + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 100; + } + + private void fireSubscriberPushEmptyTask(Subscriber subscriber) { + //trigger empty data push + TaskEvent taskEvent = new TaskEvent(subscriber, + TaskEvent.TaskType.SUBSCRIBER_PUSH_EMPTY_TASK); + TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); + taskListenerManager.sendTaskEvent(taskEvent); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java new file mode 100644 index 000000000..ee0c007c6 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import com.alipay.sofa.registry.common.model.store.BaseInfo; +import com.alipay.sofa.registry.common.model.store.StoreData; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * check connect already existed + * + * @author shangyu.wh + * @version 1.0: ClientCheckWrapperInterceptor.java, v 0.1 2019-06-18 13:53 shangyu.wh Exp $ + */ +public class ClientCheckWrapperInterceptor implements WrapperInterceptor { + + @Autowired + private SessionServerConfig sessionServerConfig; + + @Autowired + private Exchange boltExchange; + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) + throws Exception { + + BaseInfo baseInfo = (BaseInfo) invocation.getParameterSupplier().get(); + + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + + Channel channel = sessionServer.getChannel(baseInfo.getSourceAddress()); + + if (channel == null) { + throw new RuntimeException(String.format( + "Register address %s has not connected session server!", + baseInfo.getSourceAddress())); + } + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 0; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/Wrapper.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/Wrapper.java new file mode 100644 index 000000000..19090af52 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/Wrapper.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import java.util.function.Supplier; + +/** + * + * @author shangyu.wh + * @version 1.0: Wrapper.java, v 0.1 2019-06-18 19:33 shangyu.wh Exp $ + */ +public interface Wrapper { + + R call(); + + Supplier getParameterSupplier(); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptor.java new file mode 100644 index 000000000..f23478ffe --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptor.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +/** + * + * @author shangyu.wh + * @version 1.0: WrapperInterceptor.java, v 0.1 2019-06-18 11:45 shangyu.wh Exp $ + */ +public interface WrapperInterceptor { + + /** + * invoke inside function + * + * @param invocation + * @return + * @throws Exception + */ + R invokeCodeWrapper(WrapperInvocation invocation) throws Exception; + + /** + * Interceptor order + * @return + */ + int getOrder(); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptorManager.java new file mode 100644 index 000000000..009f6876f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInterceptorManager.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * + * @author shangyu.wh + * @version 1.0: WrapperInterceptorManager.java, v 0.1 2019-06-18 14:51 shangyu.wh Exp $ + */ +public class WrapperInterceptorManager { + + private List interceptorChain = new CopyOnWriteArrayList<>(); + + public int addInterceptor(WrapperInterceptor item){ + // The index of the search key, if it is contained in the list; otherwise, (-(insertion point) - 1) + final int index = Collections.binarySearch(interceptorChain, item, + (o1, o2) -> { + if (o1 == null && o2 == null) { + return 0; + } else if (o1 == null) { + return 1; + } else if (o2 == null) { + return -1; + } + + if (o1.getOrder() < o2.getOrder()) { + return -1; + } else if (o1.getOrder() > o2.getOrder()) { + return 1; + } + return 0; + }); + final int insertAt; + if (index < 0) { + insertAt = -(index + 1); + } else { + insertAt = index + 1; + } + + interceptorChain.add(insertAt, item); + return insertAt; + } + + /** + * Getter method for property interceptorChain. + * + * @return property value of interceptorChain + */ + public List getInterceptorChain() { + return interceptorChain; + } +} diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInvocation.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInvocation.java new file mode 100644 index 000000000..7a736944f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/WrapperInvocation.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import java.util.Iterator; +import java.util.List; +import java.util.function.Supplier; + +/** + * + * @author shangyu.wh + * @version 1.0: WrapperInvocation.java, v 0.1 2019-06-18 11:43 shangyu.wh Exp $ + */ +public class WrapperInvocation { + + private final Wrapper target; + + private List interceptorChain; + + private Iterator iterator; + + public WrapperInvocation(Wrapper target, + WrapperInterceptorManager wrapperInterceptorManager) { + this.interceptorChain = wrapperInterceptorManager.getInterceptorChain(); + this.iterator = this.interceptorChain.iterator(); + this.target = target; + } + + public R proceed() throws Exception { + if (iterator.hasNext()) { + WrapperInterceptor interceptor = iterator.next(); + return interceptor.invokeCodeWrapper(this); + } + return target.call(); + } + + /** + * Getter method for property ParameterSupplier. + * + * @return property value of ParameterSupplier + */ + public Supplier getParameterSupplier() { + return target.getParameterSupplier(); + } +} \ No newline at end of file diff --git a/server/server/session/src/test/java/com/alipay/sofa/registry/server/session/WrapperInvocationTest.java b/server/server/session/src/test/java/com/alipay/sofa/registry/server/session/WrapperInvocationTest.java new file mode 100644 index 000000000..8d97e703f --- /dev/null +++ b/server/server/session/src/test/java/com/alipay/sofa/registry/server/session/WrapperInvocationTest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session; + +import com.alipay.sofa.registry.server.session.wrapper.Wrapper; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptor; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptorManager; +import com.alipay.sofa.registry.server.session.wrapper.WrapperInvocation; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; + +import static junit.framework.Assert.*; + +/** + * + * @author shangyu.wh + * @version 1.0: WrapperInvocationTest.java, v 0.1 2019-06-18 17:41 shangyu.wh Exp $ + */ +public class WrapperInvocationTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testWrapperInterceptorException() throws Exception { + thrown.expect(IllegalAccessException.class); + thrown.expectMessage("test exception!"); + testAll("EXP"); + } + + @Test + public void testWrapperInterceptorProceed() throws Exception { + assertEquals(testAll("Proceed"), 1); + } + + @Test + public void testWrapperInterceptorAllRun() throws Exception { + assertEquals(testAll("AllRun"), 2); + } + + private int testAll(String input) throws Exception { + + AtomicInteger ret = new AtomicInteger(0); + + WrapperInterceptorManager wrapperInterceptorManager = new WrapperInterceptorManager(); + + wrapperInterceptorManager.addInterceptor(new WrapperInterceptor(){ + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) throws Exception { + System.out.println("0"); + if("EXP".equals(invocation.getParameterSupplier().get())){ + throw new IllegalAccessException("test exception!"); + } + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 0; + } + }); + + wrapperInterceptorManager.addInterceptor(new WrapperInterceptor(){ + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) throws Exception { + System.out.println("1"); + if("Proceed".equals(invocation.getParameterSupplier().get())){ + ret.set(1); + return true; + } + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 1; + } + }); + + wrapperInterceptorManager.addInterceptor(new WrapperInterceptor(){ + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) throws Exception { + System.out.println("2"); + if("test".equals(invocation.getParameterSupplier().get())){ + return true; + } + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 2; + } + }); + + + + WrapperInvocation wrapperInvocation = new WrapperInvocation(new Wrapper() { + @Override + public Boolean call() { + if("AllRun".equals(getParameterSupplier().get())) { + System.out.println("success"); + ret.set(2); + return true; + } + return null; + } + + @Override + public Supplier getParameterSupplier() { + return ()->input; + } + + }, wrapperInterceptorManager); + + wrapperInvocation.proceed(); + + return ret.get(); + } +} \ No newline at end of file From ca7196421922b7ac82beacdae146eef76a82a1c4 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 26 Jun 2019 17:45:48 +0800 Subject: [PATCH 039/161] upgrade jraft version to 1.2.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 13a3e8cb5..87a9bc9c3 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ 1.5.2 1.10.19 1.6.6 - 1.2.4 + 1.2.5 4.0.2 2.4 9.4.17.v20190418 From 74aa175a2f4c15370ba8e87c8907d34900a659b3 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 26 Jun 2019 20:57:09 +0800 Subject: [PATCH 040/161] blacklist ut --- .../bootstrap/MetaServerConfiguration.java | 6 + .../meta/resource/BlacklistDataResource.java | 4 +- .../bootstrap/SessionServerConfigBean.java | 4 +- .../session/registry/SessionRegistry.java | 9 +- .../impl/DefaultSessionRegistryStrategy.java | 16 +- .../test/resource/meta/BlacklistTest.java | 237 ++++++++++++++++++ 6 files changed, 257 insertions(+), 19 deletions(-) create mode 100644 test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java index 745881be0..ad3eada65 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java @@ -57,6 +57,7 @@ import com.alipay.sofa.registry.server.meta.repository.service.SessionConfirmStatusService; import com.alipay.sofa.registry.server.meta.repository.service.SessionRepositoryService; import com.alipay.sofa.registry.server.meta.repository.service.SessionVersionRepositoryService; +import com.alipay.sofa.registry.server.meta.resource.BlacklistDataResource; import com.alipay.sofa.registry.server.meta.resource.DecisionModeResource; import com.alipay.sofa.registry.server.meta.resource.HealthResource; import com.alipay.sofa.registry.server.meta.resource.MetaDigestResource; @@ -358,6 +359,11 @@ public MetaStoreResource metaStoreResource() { public StopPushDataResource stopPushDataResource() { return new StopPushDataResource(); } + + @Bean + public BlacklistDataResource blacklistDataResource() { + return new BlacklistDataResource(); + } } @Configuration diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java index 44d7ec031..26bd30d30 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java @@ -41,7 +41,7 @@ * @author shangyu.wh * @version $Id: StopPushDataResource.java, v 0.1 2018-07-25 11:40 shangyu.wh Exp $ */ -@Path("stopPushDataSwitch") +@Path("blacklist") public class BlacklistDataResource { private static final Logger DB_LOGGER = LoggerFactory.getLogger(StopPushDataResource.class, @@ -57,7 +57,7 @@ public class BlacklistDataResource { private TaskListenerManager taskListenerManager; /** - * open push + * update blacklist */ @POST @Path("update") diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 8fbd7af9b..8137f3c62 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -162,9 +162,9 @@ public class SessionServerConfigBean implements SessionServerConfig { private Pattern invalidIgnoreDataIdPattern = null; - private String blacklistPubDataIdRegex = "*"; + private String blacklistPubDataIdRegex = ""; - private String blacklistSubDataIdRegex = "*"; + private String blacklistSubDataIdRegex = ""; //end config for enterprise version diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 02c86ed6e..f06a52acb 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -286,10 +286,11 @@ public void remove(List connectIds) { connectIdsAll.add(connectId); } }); - - TaskEvent taskEvent = new TaskEvent(connectIds, TaskEvent.TaskType.CANCEL_DATA_TASK); - TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); - getTaskListenerManager().sendTaskEvent(taskEvent); + if(!connectIds.isEmpty()) { + TaskEvent taskEvent = new TaskEvent(connectIds, TaskEvent.TaskType.CANCEL_DATA_TASK); + TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); + getTaskListenerManager().sendTaskEvent(taskEvent); + } } private void fireSubscriberPushEmptyTask(Subscriber subscriber) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java index 630058f56..c68889f3e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java @@ -40,14 +40,11 @@ * @since 2019/2/15 */ public class DefaultSessionRegistryStrategy implements SessionRegistryStrategy { - private static final Logger LOGGER = LoggerFactory - .getLogger(DefaultSessionRegistryStrategy.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DefaultSessionRegistryStrategy.class); - private static final Logger CONSOLE_LOGGER = LoggerFactory.getLogger("SESSION-CONSOLE", - "[Task]"); - - private static final Logger taskLogger = LoggerFactory.getLogger( - DefaultSessionRegistryStrategy.class, "[Task]"); + private static final Logger taskLogger = LoggerFactory.getLogger( + DefaultSessionRegistryStrategy.class, "[Task]"); /** * store subscribers @@ -110,10 +107,7 @@ private void fireDataChangeCloudTask(String dataInfoId) { @Override public void afterPublisherRegister(Publisher publisher) { - TaskEvent syncPublisherTask = new TaskEvent(publisher, - TaskEvent.TaskType.SYNC_PUBLISHER_TASK); - CONSOLE_LOGGER.info("send " + syncPublisherTask.getTaskType() + " taskEvent:{}", publisher); - taskListenerManager.sendTaskEvent(syncPublisherTask); + } @Override diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java new file mode 100644 index 000000000..df7dbbe90 --- /dev/null +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.test.resource.meta; + +import com.alipay.sofa.registry.client.api.model.RegistryType; +import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; +import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; +import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.Subscriber; +import com.alipay.sofa.registry.core.model.Result; +import com.alipay.sofa.registry.core.model.ScopeEnum; +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistConstants; +import com.alipay.sofa.registry.test.BaseIntegrationTest; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Maps; +import org.junit.AfterClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author shangyu.wh + * @since 2019/1/14 + */ +@RunWith(SpringRunner.class) +public class BlacklistTest extends BaseIntegrationTest { + @Test + public void testBlacklistUpdate() throws Exception { + + Map>> map = new HashMap<>(); + Set set1 = new HashSet<>(); + Set set2 = new HashSet<>(); + set1.add("193.165.0.1"); + set1.add("193.165.0.2"); + set2.add("193.165.0.3"); + set2.add("193.165.0.4"); + + Map> map1 = Maps.newHashMap(); + map1.put(BlacklistConstants.IP_FULL, set1); + + Map> map2 = Maps.newHashMap(); + map2.put(BlacklistConstants.IP_FULL, set2); + + map.put(BlacklistConstants.FORBIDDEN_PUB, map1); + map.put(BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX, map2); + + ObjectMapper mapper = new ObjectMapper(); + + Result response = metaChannel + .getWebTarget() + .path("blacklist/update") + .request() + .post(Entity.entity(mapper.writeValueAsString(map), MediaType.APPLICATION_JSON), + Result.class); + + assertTrue(response.isSuccess()); + + } + + @Test + public void testBlacklistUpdatePub() throws Exception { + + Map>> map = new HashMap<>(); + Set set1 = new HashSet<>(); + Set set2 = new HashSet<>(); + String local = NetUtil.getLocalAddress().getHostAddress(); + set1.add(local); + set2.add(local); + + Map> map1 = Maps.newHashMap(); + map1.put(BlacklistConstants.IP_FULL, set1); + + Map> map2 = Maps.newHashMap(); + map2.put(BlacklistConstants.IP_FULL, set2); + + map.put(BlacklistConstants.FORBIDDEN_PUB, map1); + + ObjectMapper mapper = new ObjectMapper(); + + Result response = metaChannel + .getWebTarget() + .path("blacklist/update") + .request() + .post(Entity.entity(mapper.writeValueAsString(map), MediaType.APPLICATION_JSON), + Result.class); + + assertTrue(response.isSuccess()); + + String dataId = "test-dataId-blacklist"; + String value = "test blacklist"; + + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + Thread.sleep(500L); + + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + + registryClient1.register(subReg); + + Thread.sleep(1000L); + assertEquals(dataId, this.dataId); + assertEquals(LOCAL_REGION, userData.getLocalZone()); + + Map> publisherMap = sessionChannel + .getWebTarget() + .path("digest/pub/data/query") + .queryParam("dataInfoId", + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + .request(APPLICATION_JSON).get(new GenericType>>() { + }); + assertEquals(0, publisherMap.size()); + + Map> subscriberMap = sessionChannel + .getWebTarget() + .path("digest/sub/data/query") + .queryParam("dataInfoId", + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + .request(APPLICATION_JSON).get(new GenericType>>() { + }); + assertEquals(1, subscriberMap.size()); + assertEquals(1, subscriberMap.get("SUB").size()); + assertEquals(dataId, subscriberMap.get("SUB").get(0).getDataId()); + + } + + //@Test + //public void testBlacklistUpdateSub() throws Exception { + // + // Map>> map = new HashMap<>(); + // Set set1 = new HashSet<>(); + // Set set2 = new HashSet<>(); + // String local = NetUtil.getLocalAddress().getHostAddress(); + // set1.add(local); + // set2.add(local); + // + // Map> map1 = Maps.newHashMap(); + // map1.put(BlacklistConstants.IP_FULL, set1); + // + // Map> map2 = Maps.newHashMap(); + // map2.put(BlacklistConstants.IP_FULL, set2); + // + // map.put(BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX, map2); + // + // ObjectMapper mapper = new ObjectMapper(); + // + // Result response = metaChannel + // .getWebTarget() + // .path("blacklist/update") + // .request() + // .post(Entity.entity(mapper.writeValueAsString(map), MediaType.APPLICATION_JSON), + // Result.class); + // + // assertTrue(response.isSuccess()); + // + // String dataId = "test-dataId-blacklist2"; + // String value = "test blacklist2"; + // + // PublisherRegistration registration = new PublisherRegistration(dataId); + // registryClient1.register(registration, value); + // Thread.sleep(500L); + // + // SubscriberRegistration subReg = new SubscriberRegistration(dataId, + // new MySubscriberDataObserver()); + // subReg.setScopeEnum(ScopeEnum.dataCenter); + // + // registryClient1.register(subReg); + // + // Thread.sleep(1000L); + // assertEquals(dataId, this.dataId); + // assertEquals(LOCAL_REGION, userData.getLocalZone()); + // + // Map> publisherMap = sessionChannel + // .getWebTarget() + // .path("digest/pub/data/query") + // .queryParam("dataInfoId", + // DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + // .request(APPLICATION_JSON).get(new GenericType>>() { + // }); + // assertEquals(1, publisherMap.size()); + // assertEquals(1, publisherMap.get("PUB").size()); + // assertEquals(dataId, publisherMap.get("PUB").get(0).getDataId()); + // assertEquals(value, bytes2Object(publisherMap.get("PUB").get(0).getDataList().get(0) + // .getBytes())); + // + // Map> subscriberMap = sessionChannel + // .getWebTarget() + // .path("digest/sub/data/query") + // .queryParam("dataInfoId", + // DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + // .request(APPLICATION_JSON).get(new GenericType>>() { + // }); + // assertEquals(0, subscriberMap.size()); + // + //} + + @AfterClass + public static void afterClass() { + registryClient1.unregister("test-dataId-blacklist", DEFAULT_GROUP, RegistryType.SUBSCRIBER); + registryClient1.unregister("test-dataId-blacklist", DEFAULT_GROUP, RegistryType.PUBLISHER); + registryClient1 + .unregister("test-dataId-blacklist2", DEFAULT_GROUP, RegistryType.SUBSCRIBER); + registryClient1.unregister("test-dataId-blacklist2", DEFAULT_GROUP, RegistryType.PUBLISHER); + } +} From a51d204785e5f90dfd3b136e53a5dcfad8fe5a81 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 26 Jun 2019 22:00:00 +0800 Subject: [PATCH 041/161] add clientoff delay time --- .../sofa/registry/server/data/bootstrap/DataServerConfig.java | 4 ++-- server/server/data/src/main/resources/application.properties | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 58eeb29cd..aa0d2f3aa 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -51,9 +51,9 @@ public class DataServerConfig { private int queueSize; - private int notifyIntervalMs; + private int notifyIntervalMs = 500; - private int clientOffDelayMs; + private int clientOffDelayMs = 1000; private int notifyTempDataIntervalMs; diff --git a/server/server/data/src/main/resources/application.properties b/server/server/data/src/main/resources/application.properties index 6a28ef486..d172a1405 100644 --- a/server/server/data/src/main/resources/application.properties +++ b/server/server/data/src/main/resources/application.properties @@ -10,6 +10,7 @@ data.server.httpServerPort=9622 data.server.queueCount=4 data.server.queueSize=10240 data.server.notifyIntervalMs=500 +data.server.clientOffDelayMs=1000 data.server.notifyTempDataIntervalMs=10 data.server.rpcTimeout=3000 data.server.metaServerPort=9611 From b8f6c8f2123df5514aec4847098d46dd9e14dd36 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 27 Jun 2019 11:41:49 +0800 Subject: [PATCH 042/161] =?UTF-8?q?bugfix=EF=BC=9A=20The=20timing=20of=20s?= =?UTF-8?q?napshot=20construction=20is=20not=20right?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acceptor/WriteDataAcceptorImpl.java | 6 +- .../session/acceptor/WriteDataProcessor.java | 44 +++++---- .../session/registry/SessionRegistry.java | 82 ++++------------ .../session/renew/DefaultRenewService.java | 96 +++++++++++++++++++ .../server/session/renew/RenewService.java | 46 +++++++++ 5 files changed, 194 insertions(+), 80 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java index fb0918768..7dd839c01 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataAcceptorImpl.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.renew.RenewService; import com.alipay.sofa.registry.task.listener.TaskListenerManager; /** @@ -38,6 +39,9 @@ public class WriteDataAcceptorImpl implements WriteDataAcceptor { @Autowired private SessionServerConfig sessionServerConfig; + @Autowired + private RenewService renewService; + /** * acceptor for all write data request * key:connectId @@ -49,7 +53,7 @@ public class WriteDataAcceptorImpl implements WriteDataAcceptor { public void accept(WriteDataRequest request) { String connectId = request.getConnectId(); WriteDataProcessor writeDataProcessor = writeDataProcessors.computeIfAbsent(connectId, - key -> new WriteDataProcessor(connectId, taskListenerManager, sessionServerConfig)); + key -> new WriteDataProcessor(connectId, taskListenerManager, sessionServerConfig, renewService)); writeDataProcessor.process(request); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index b931a4ccd..e29f1cb63 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.session.acceptor; +import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; @@ -28,6 +29,7 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.acceptor.WriteDataRequest.WriteDataRequestType; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.renew.RenewService; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; @@ -53,6 +55,10 @@ public class WriteDataProcessor { private final SessionServerConfig sessionServerConfig; + private final RenewService renewService; + + private final String connectId; + private long beginTimestamp; private AtomicLong lastUpdateTimestamp = new AtomicLong(0); @@ -61,13 +67,12 @@ public class WriteDataProcessor { private ConcurrentLinkedQueue acceptorQueue = new ConcurrentLinkedQueue(); - private final String connectId; - public WriteDataProcessor(String connectId, TaskListenerManager taskListenerManager, - SessionServerConfig sessionServerConfig) { + SessionServerConfig sessionServerConfig, RenewService renewService) { this.connectId = connectId; this.taskListenerManager = taskListenerManager; this.sessionServerConfig = sessionServerConfig; + this.renewService = renewService; this.beginTimestamp = System.currentTimeMillis(); this.lastUpdateTimestamp.set(beginTimestamp); @@ -145,29 +150,26 @@ private void doHandle(WriteDataRequest request) { switch (request.getRequestType()) { case PUBLISHER: { - // refreshUpdateTime(); doPublishAsync(request); } break; case UN_PUBLISHER: { - // refreshUpdateTime(); doUnPublishAsync(request); } break; case CLIENT_OFF: { - // refreshUpdateTime(); doClientOffAsync(request); } break; case RENEW_DATUM: { - if (inRenewAndSnapshotSilentPeriod()) { + if (renewAndSnapshotInSilence()) { return; } doReNewAsync(request); } break; case DATUM_SNAPSHOT: { - if (inRenewAndSnapshotSilentPeriod()) { + if (renewAndSnapshotInSilence()) { return; } halt(); @@ -233,24 +235,32 @@ private void doSnapshotAsync(WriteDataRequest request) { connectId, request.getRequestType(), request.getRequestBody()); } - DatumSnapshotRequest datumSnapshotRequest = (DatumSnapshotRequest) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(datumSnapshotRequest, TaskType.DATUM_SNAPSHOT_TASK); - taskListenerManager.sendTaskEvent(taskEvent); + String connectId = (String) request.getRequestBody(); + List datumSnapshotRequests = renewService + .getDatumSnapshotRequests(connectId); + if (datumSnapshotRequests != null) { + for (DatumSnapshotRequest datumSnapshotRequest : datumSnapshotRequests) { + TaskEvent taskEvent = new TaskEvent(datumSnapshotRequest, + TaskType.DATUM_SNAPSHOT_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } + } + } /** * In silence, do not renew and snapshot */ - private boolean inRenewAndSnapshotSilentPeriod() { - boolean inRenewAndSnapshotSilentPeriod = System.currentTimeMillis() - - this.lastUpdateTimestamp.get() < this.sessionServerConfig + private boolean renewAndSnapshotInSilence() { + boolean renewAndSnapshotInSilence = System.currentTimeMillis() + - this.lastUpdateTimestamp.get() < this.sessionServerConfig .getRenewAndSnapshotSilentPeriodSec() * 1000L; if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug( - "inRenewAndSnapshotSilentPeriod: connectId={}, inRenewAndSnapshotSilentPeriod={}", - connectId, inRenewAndSnapshotSilentPeriod); + "renewAndSnapshotInSilence: connectId={}, renewAndSnapshotInSilence={}", connectId, + renewAndSnapshotInSilence); } - return inRenewAndSnapshotSilentPeriod; + return renewAndSnapshotInSilence; } private void refreshUpdateTime() { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index c82cda06b..933d4ab98 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -21,15 +21,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.ReNewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.BaseInfo; @@ -48,6 +44,7 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.renew.RenewService; import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; @@ -109,6 +106,9 @@ public class SessionRegistry implements Registry { @Autowired private SessionRegistryStrategy sessionRegistryStrategy; + @Autowired + private RenewService renewService; + @Autowired private WriteDataAcceptor writeDataAcceptor; @@ -332,7 +332,7 @@ public void reNewDatum(String connectId) { RENEW_LOGGER.debug("reNewDatum: connectId={}", connectId); } - List reNewDatumRequests = getReNewDatumRequests(connectId); + List reNewDatumRequests = renewService.getReNewDatumRequests(connectId); if (reNewDatumRequests != null) { for (ReNewDatumRequest reNewDatumRequest : reNewDatumRequests) { // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) @@ -363,66 +363,24 @@ public void sendDatumSnapshot(String connectId) { RENEW_LOGGER.debug("sendDatumSnapshot: connectId={}", connectId); } - List datumSnapshotRequests = getDatumSnapshotRequests(connectId); - if (datumSnapshotRequests != null) { - for (DatumSnapshotRequest datumSnapshotRequest : datumSnapshotRequests) { - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) - // are handed over to WriteDataAcceptor - writeDataAcceptor.accept(new WriteDataRequest() { - @Override - public Object getRequestBody() { - return datumSnapshotRequest; - } - - @Override - public WriteDataRequestType getRequestType() { - return WriteDataRequestType.DATUM_SNAPSHOT; - } - - @Override - public String getConnectId() { - return connectId; - } - }); + // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return connectId; } - } - } - private List getReNewDatumRequests(String connectId) { - List datumSnapshotRequests = getDatumSnapshotRequests(connectId); - if (datumSnapshotRequests != null && !datumSnapshotRequests.isEmpty()) { - return datumSnapshotRequests.stream() - .map(datumSnapshotRequest -> new ReNewDatumRequest(datumSnapshotRequest.getConnectId(), - datumSnapshotRequest.getDataServerIp(), String.valueOf( - PublisherDigestUtil.getDigestValueSum(datumSnapshotRequest.getPublishers())))) - .collect(Collectors.toList()); - } - return null; - } + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.DATUM_SNAPSHOT; + } - private List getDatumSnapshotRequests(String connectId) { - Map pubMap = sessionDataStore.queryByConnectId(connectId); - if (pubMap != null && !pubMap.isEmpty()) { - Map> dataServerIpToPubs = new ConcurrentHashMap<>(); - List list = new ArrayList<>(); - pubMap.values().forEach(publisher -> { - Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); - List publishers = dataServerIpToPubs - .computeIfAbsent(dataNode.getNodeUrl().getIpAddress(), k -> new ArrayList<>()); - publishers.add(publisher); - }); - for (Map.Entry> entry : dataServerIpToPubs.entrySet()) { - List publishers = entry.getValue(); - if (!publishers.isEmpty()) { - DatumSnapshotRequest datumSnapshotRequest = new DatumSnapshotRequest(connectId, entry.getKey(), - publishers); - list.add(datumSnapshotRequest); - } + @Override + public String getConnectId() { + return connectId; } - return list; - } else { - LOGGER.warn("No publishers of connectId:{}!", connectId); - } - return null; + }); } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java new file mode 100644 index 000000000..31173b240 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.renew; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.PublisherDigestUtil; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.store.DataStore; + +/** + * + * @author kezhu.wukz + * @version $Id: DefaultRenewService.java, v 0.1 2019-06-27 11:09 kezhu.wukz Exp $ + */ +public class DefaultRenewService implements RenewService { + + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[WriteDataProcessor]"); + + /*** store publishers */ + @Autowired + private DataStore sessionDataStore; + + /*** calculate data node url */ + @Autowired + private NodeManager dataNodeManager; + + @Override + public List getReNewDatumRequests(String connectId) { + List datumSnapshotRequests = getDatumSnapshotRequests(connectId); + if (datumSnapshotRequests != null && !datumSnapshotRequests.isEmpty()) { + return datumSnapshotRequests.stream() + .map(datumSnapshotRequest -> new ReNewDatumRequest(datumSnapshotRequest.getConnectId(), + datumSnapshotRequest.getDataServerIp(), String.valueOf( + PublisherDigestUtil.getDigestValueSum(datumSnapshotRequest.getPublishers())))) + .collect(Collectors.toList()); + } + return null; + } + + @Override + public List getDatumSnapshotRequests(String connectId) { + Map pubMap = sessionDataStore.queryByConnectId(connectId); + if (pubMap != null && !pubMap.isEmpty()) { + Map> dataServerIpToPubs = new ConcurrentHashMap<>(); + List list = new ArrayList<>(); + pubMap.values().forEach(publisher -> { + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + List publishers = dataServerIpToPubs + .computeIfAbsent(dataNode.getNodeUrl().getIpAddress(), k -> new ArrayList<>()); + publishers.add(publisher); + }); + for (Map.Entry> entry : dataServerIpToPubs.entrySet()) { + List publishers = entry.getValue(); + if (!publishers.isEmpty()) { + DatumSnapshotRequest datumSnapshotRequest = new DatumSnapshotRequest(connectId, entry.getKey(), + publishers); + list.add(datumSnapshotRequest); + } + } + return list; + } else { + RENEW_LOGGER.warn("No publishers of connectId:{}!", connectId); + } + return null; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java new file mode 100644 index 000000000..b71493347 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.renew; + +import java.util.List; + +import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; +import com.alipay.sofa.registry.common.model.ReNewDatumRequest; + +/** + * + * @author kezhu.wukz + * @version $Id: RenewService.java, v 0.1 2019-06-27 11:06 kezhu.wukz Exp $ + */ +public interface RenewService { + + /** + * Get ReNewDatumRequests based on connectId + * + * @param connectId + * @return + */ + List getReNewDatumRequests(String connectId); + + /** + * Get DatumSnapshotRequests based on connectId + * + * @param connectId + * @return + */ + List getDatumSnapshotRequests(String connectId); +} \ No newline at end of file From dc9f9febb1d992f9bdeb7353e5cc996c77c5e866 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 27 Jun 2019 14:38:58 +0800 Subject: [PATCH 043/161] rename: ReNew -> Renew --- ...tumRequest.java => RenewDatumRequest.java} | 6 +- ...desRequest.java => RenewNodesRequest.java} | 10 +-- .../registry/task/listener/TaskEvent.java | 2 +- .../DataServerBeanConfiguration.java | 20 +++--- .../server/data/event/StartTaskTypeEnum.java | 2 +- .../LocalDataServerChangeEventHandler.java | 2 +- ...{ReNewNodeTask.java => RenewNodeTask.java} | 13 ++-- .../metaserver/DefaultMetaServiceImpl.java | 39 +++++----- .../metaserver/IMetaServerService.java | 10 +-- .../handler/DatumSnapshotHandler.java | 6 +- .../handler/PublishDataHandler.java | 6 +- ...tumHandler.java => RenewDatumHandler.java} | 28 ++++---- .../handler/UnPublishDataHandler.java | 6 +- .../DatumLeaseManager.java | 36 +++++----- .../LocalDataServerCleanHandler.java | 2 +- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/logback-spring.xml | 2 +- .../bootstrap/MetaServerConfiguration.java | 31 ++++---- .../meta/registry/MetaServerRegistry.java | 10 +-- .../server/meta/registry/Registry.java | 4 +- ...ler.java => RenewNodesRequestHandler.java} | 25 +++---- .../service/DataRepositoryService.java | 21 +++--- .../service/MetaRepositoryService.java | 21 +++--- .../service/SessionRepositoryService.java | 17 ++--- .../server/meta/store/DataStoreService.java | 43 +++++------ .../server/meta/store/MetaStoreService.java | 28 ++++---- .../server/meta/store/RenewDecorate.java | 6 +- .../meta/store/SessionStoreService.java | 44 ++++++------ .../server/meta/store/StoreService.java | 4 +- .../session/acceptor/WriteDataProcessor.java | 12 ++-- .../bootstrap/SessionServerConfig.java | 8 +-- .../bootstrap/SessionServerConfigBean.java | 72 +++++++++---------- .../bootstrap/SessionServerConfiguration.java | 44 ++++++------ .../listener/ReNewDatumTaskListener.java | 14 ++-- .../server/session/node/DataNodeManager.java | 5 +- .../server/session/node/MetaNodeManager.java | 6 +- .../server/session/node/NodeManager.java | 8 +-- .../session/node/SessionNodeManager.java | 24 +++---- .../session/node/service/DataNodeService.java | 6 +- .../node/service/DataNodeServiceImpl.java | 24 +++---- .../server/session/registry/Registry.java | 2 +- .../session/registry/SessionRegistry.java | 16 ++--- .../handler/ClientNodeConnectionHandler.java | 8 +-- .../session/renew/DefaultRenewService.java | 6 +- .../server/session/renew/RenewService.java | 6 +- .../session/scheduler/ExecutorManager.java | 35 ++++----- ...eNewDatumTask.java => RenewDatumTask.java} | 34 ++++----- 47 files changed, 394 insertions(+), 382 deletions(-) rename server/common/model/src/main/java/com/alipay/sofa/registry/common/model/{ReNewDatumRequest.java => RenewDatumRequest.java} (92%) rename server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/{ReNewNodesRequest.java => RenewNodesRequest.java} (92%) rename server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/{ReNewNodeTask.java => RenewNodeTask.java} (91%) rename server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/{ReNewDatumHandler.java => RenewDatumHandler.java} (84%) rename server/server/data/src/main/java/com/alipay/sofa/registry/server/data/{correction => renew}/DatumLeaseManager.java (86%) rename server/server/data/src/main/java/com/alipay/sofa/registry/server/data/{correction => renew}/LocalDataServerCleanHandler.java (99%) rename server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/{ReNewNodesRequestHandler.java => RenewNodesRequestHandler.java} (73%) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/{ReNewDatumTask.java => RenewDatumTask.java} (73%) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java similarity index 92% rename from server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java rename to server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java index 35ea685ba..9aa77601e 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/ReNewDatumRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java @@ -24,7 +24,7 @@ * @author kezhu.wukz * @version $Id: RenewRequest.java, v 0.1 2019-05-30 10:58 shangyu.wh Exp $ */ -public class ReNewDatumRequest implements Serializable { +public class RenewDatumRequest implements Serializable { private static final long serialVersionUID = 683097441984338311L; @@ -34,7 +34,7 @@ public class ReNewDatumRequest implements Serializable { private final String digestSum; - public ReNewDatumRequest(String connectId, String dataServerIp, String digestSum) { + public RenewDatumRequest(String connectId, String dataServerIp, String digestSum) { this.connectId = connectId; this.dataServerIp = dataServerIp; this.digestSum = digestSum; @@ -72,7 +72,7 @@ public String getDigestSum() { */ @Override public String toString() { - final StringBuilder sb = new StringBuilder("ReNewDatumRequest{"); + final StringBuilder sb = new StringBuilder("RenewDatumRequest{"); sb.append("connectId='").append(connectId).append('\''); sb.append(", dataServerIp='").append(dataServerIp).append('\''); sb.append(", digestSum='").append(digestSum).append('\''); diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/ReNewNodesRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/RenewNodesRequest.java similarity index 92% rename from server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/ReNewNodesRequest.java rename to server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/RenewNodesRequest.java index 50485e65c..0794e5152 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/ReNewNodesRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/RenewNodesRequest.java @@ -16,16 +16,16 @@ */ package com.alipay.sofa.registry.common.model.metaserver; -import com.alipay.sofa.registry.common.model.Node; - import java.io.Serializable; +import com.alipay.sofa.registry.common.model.Node; + /** * * @author shangyu.wh * @version $Id: RenewNodesRequest.java, v 0.1 2018-03-30 19:51 shangyu.wh Exp $ */ -public class ReNewNodesRequest implements Serializable { +public class RenewNodesRequest implements Serializable { private int duration; @@ -35,7 +35,7 @@ public class ReNewNodesRequest implements Serializable { * constructor * @param node */ - public ReNewNodesRequest(T node) { + public RenewNodesRequest(T node) { this.node = node; } @@ -68,7 +68,7 @@ public T getNode() { @Override public String toString() { - final StringBuilder sb = new StringBuilder("ReNewNodesRequest{"); + final StringBuilder sb = new StringBuilder("RenewNodesRequest{"); sb.append("duration=").append(duration); sb.append(", node=").append(node); sb.append('}'); diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index 6f8cd2ae6..ea38f6a10 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -47,7 +47,7 @@ public enum TaskType { "SubscriberMultiFetchTask"), PUBLISH_DATA_TASK( "PublishDataTask"), UNPUBLISH_DATA_TASK( "UnpublishDataTask"), RENEW_DATUM_TASK( - "ReNewDatumTask"), DATUM_SNAPSHOT_TASK( + "RenewDatumTask"), DATUM_SNAPSHOT_TASK( "DatumSnapshotTask"), //Session Adapter task diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 881e4d5e5..47433f54f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -41,8 +41,8 @@ import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.change.notify.SessionServerNotifier; import com.alipay.sofa.registry.server.data.change.notify.TempPublisherNotifier; -import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; -import com.alipay.sofa.registry.server.data.correction.LocalDataServerCleanHandler; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.datasync.AcceptorStore; import com.alipay.sofa.registry.server.data.datasync.SyncDataService; import com.alipay.sofa.registry.server.data.datasync.sync.LocalAcceptorStore; @@ -69,7 +69,7 @@ import com.alipay.sofa.registry.server.data.remoting.dataserver.handler.SyncDataHandler; import com.alipay.sofa.registry.server.data.remoting.dataserver.task.AbstractTask; import com.alipay.sofa.registry.server.data.remoting.dataserver.task.ConnectionRefreshTask; -import com.alipay.sofa.registry.server.data.remoting.dataserver.task.ReNewNodeTask; +import com.alipay.sofa.registry.server.data.remoting.dataserver.task.RenewNodeTask; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.DefaultMetaServiceImpl; @@ -88,7 +88,7 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataVersionsHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.PublishDataHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.ReNewDatumHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.RenewDatumHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.SessionServerRegisterHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.UnPublishDataHandler; import com.alipay.sofa.registry.server.data.resource.DataDigestResource; @@ -208,7 +208,7 @@ public Collection serverHandlers(DataServerConfig dataSer list.add(sessionServerRegisterHandler()); list.add(unPublishDataHandler()); list.add(dataServerConnectionHandler()); - list.add(reNewDatumHandler()); + list.add(renewDatumHandler()); list.add(datumSnapshotHandler()); return list; } @@ -273,8 +273,8 @@ public AbstractServerHandler datumSnapshotHandler() { } @Bean - public AbstractServerHandler reNewDatumHandler() { - return new ReNewDatumHandler(); + public AbstractServerHandler renewDatumHandler() { + return new RenewDatumHandler(); } @Bean @@ -452,8 +452,8 @@ public ConnectionRefreshMetaTask connectionRefreshMetaTask() { } @Bean - public ReNewNodeTask reNewNodeTask() { - return new ReNewNodeTask(); + public RenewNodeTask renewNodeTask() { + return new RenewNodeTask(); } @Bean(name = "tasks") @@ -461,7 +461,7 @@ public List tasks() { List list = new ArrayList<>(); list.add(connectionRefreshTask()); list.add(connectionRefreshMetaTask()); - list.add(reNewNodeTask()); + list.add(renewNodeTask()); return list; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java index a015a1f4d..49217c99f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/StartTaskTypeEnum.java @@ -34,7 +34,7 @@ public enum StartTaskTypeEnum { CONNECT_DATA, /** - * ReNewNodeTask + * RenewNodeTask */ RENEW, diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 4af96eee0..3902dc653 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -43,7 +43,7 @@ import com.alipay.sofa.registry.server.data.cache.BackupTriad; import com.alipay.sofa.registry.server.data.cache.DataServerCache; import com.alipay.sofa.registry.server.data.cache.DatumCache; -import com.alipay.sofa.registry.server.data.correction.LocalDataServerCleanHandler; +import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.event.LocalDataServerChangeEvent; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/RenewNodeTask.java similarity index 91% rename from server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java rename to server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/RenewNodeTask.java index 8275cbfef..18726d023 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ReNewNodeTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/RenewNodeTask.java @@ -16,25 +16,26 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.task; -import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; -import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; +import java.util.concurrent.TimeUnit; + import org.springframework.beans.factory.annotation.Autowired; -import java.util.concurrent.TimeUnit; +import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; +import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; /** * * @author shangyu.wh - * @version $Id: ReNewNodeTask.java, v 0.1 2018-04-02 20:56 shangyu.wh Exp $ + * @version $Id: RenewNodeTask.java, v 0.1 2018-04-02 20:56 shangyu.wh Exp $ */ -public class ReNewNodeTask extends AbstractTask { +public class RenewNodeTask extends AbstractTask { @Autowired private IMetaServerService metaServerService; @Override public void handle() { - metaServerService.reNewNodeTask(); + metaServerService.renewNodeTask(); } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java index ac94deb3e..8670f962b 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java @@ -16,6 +16,19 @@ */ package com.alipay.sofa.registry.server.data.remoting.metaserver; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.jraft.entity.PeerId; import com.alipay.sofa.registry.common.model.Node.NodeType; @@ -24,7 +37,7 @@ import com.alipay.sofa.registry.common.model.metaserver.GetNodesRequest; import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; -import com.alipay.sofa.registry.common.model.metaserver.ReNewNodesRequest; +import com.alipay.sofa.registry.common.model.metaserver.RenewNodesRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.jraft.bootstrap.RaftClient; import com.alipay.sofa.registry.log.Logger; @@ -36,18 +49,6 @@ import com.alipay.sofa.registry.server.data.node.DataServerNode; import com.alipay.sofa.registry.server.data.remoting.MetaNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; /** * @@ -208,7 +209,7 @@ public List getOtherDataCenters() { } @Override - public void reNewNodeTask() { + public void renewNodeTask() { Map connectionMap = metaServerConnectionFactory .getConnections(dataServerBootstrapConfig.getLocalDataCenter()); for (Entry connectEntry : connectionMap.entrySet()) { @@ -218,13 +219,13 @@ public void reNewNodeTask() { Connection connection = connectEntry.getValue(); if (connection.isFine()) { try { - ReNewNodesRequest reNewNodesRequest = new ReNewNodesRequest<>( + RenewNodesRequest renewNodesRequest = new RenewNodesRequest<>( new DataNode(new URL(DataServerConfig.IP), dataServerBootstrapConfig.getLocalDataCenter())); metaNodeExchanger.request(new Request() { @Override public Object getRequestBody() { - return reNewNodesRequest; + return renewNodesRequest; } @Override @@ -233,19 +234,19 @@ public URL getRequestUrl() { } }).getResult(); } catch (Exception e) { - LOGGER.error("[ReNewNodeTask] reNew data node to metaServer error : {}", + LOGGER.error("[RenewNodeTask] renew data node to metaServer error : {}", ip, e); String newip = refreshLeader().getIp(); LOGGER .warn( - "[ReNewNodeTask] reNew data node to metaServer error,leader refresh: {}", + "[RenewNodeTask] renew data node to metaServer error,leader refresh: {}", newip); } } else { String newip = refreshLeader().getIp(); LOGGER .warn( - "[ReNewNodeTask] reNew data node to metaServer not fine,leader refresh: {}", + "[RenewNodeTask] renew data node to metaServer not fine,leader refresh: {}", newip); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java index e98f8e453..3bc2abd03 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java @@ -16,14 +16,14 @@ */ package com.alipay.sofa.registry.server.data.remoting.metaserver; -import com.alipay.sofa.jraft.entity.PeerId; -import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; -import com.alipay.sofa.registry.server.data.node.DataServerNode; - import java.util.List; import java.util.Map; import java.util.Set; +import com.alipay.sofa.jraft.entity.PeerId; +import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; +import com.alipay.sofa.registry.server.data.node.DataServerNode; + /** * The interface Meta server service. * @author qian.lqlq @@ -73,7 +73,7 @@ public interface IMetaServerService { /** * scheduler update data server expireTime */ - void reNewNodeTask(); + void renewNodeTask(); /** * start raft client for get leader send request diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 3bdd3b315..02e568825 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -32,7 +32,7 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; -import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -90,8 +90,8 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { dataChangeEventCenter.onChange( new DatumSnapshotEvent(request.getConnectId(), dataServerConfig.getLocalDataCenter(), pubMap)); - // record the reNew timestamp - datumLeaseManager.reNew(request.getConnectId()); + // record the renew timestamp + datumLeaseManager.renew(request.getConnectId()); return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java index 79d11e87e..825905511 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java @@ -33,7 +33,7 @@ import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; -import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; @@ -112,8 +112,8 @@ public Object doHandle(Channel channel, PublishDataRequest request) { String connectId = publisher.getSourceAddress().getAddressString(); sessionServerConnectionFactory.registerConnectId(request.getSessionServerProcessId(), connectId); - // record the reNew timestamp - datumLeaseManager.reNew(connectId); + // record the renew timestamp + datumLeaseManager.renew(connectId); } return CommonResponse.buildSuccessResponse(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java similarity index 84% rename from server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java rename to server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index f85309600..e67da5515 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ReNewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -25,14 +25,14 @@ import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublisherDigestUtil; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.cache.DatumCache; -import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -43,14 +43,14 @@ * @author kezhu.wukz * @version $Id: ClientOffProcessor.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ */ -public class ReNewDatumHandler extends AbstractServerHandler { +public class RenewDatumHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory.getLogger(ReNewDatumHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RenewDatumHandler.class); private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( ValueConstants.LOGGER_NAME_RENEW, - "[ReNewDatumHandler]"); + "[RenewDatumHandler]"); @Autowired private ForwardService forwardService; @@ -62,13 +62,13 @@ public class ReNewDatumHandler extends AbstractServerHandler private DatumCache datumCache; @Override - public void checkParam(ReNewDatumRequest request) throws RuntimeException { - ParaCheckUtil.checkNotBlank(request.getConnectId(), "ReNewDatumRequest.connectId"); - ParaCheckUtil.checkNotBlank(request.getDigestSum(), "ReNewDatumRequest.digestSum"); + public void checkParam(RenewDatumRequest request) throws RuntimeException { + ParaCheckUtil.checkNotBlank(request.getConnectId(), "RenewDatumRequest.connectId"); + ParaCheckUtil.checkNotBlank(request.getDigestSum(), "RenewDatumRequest.digestSum"); } @Override - public Object doHandle(Channel channel, ReNewDatumRequest request) { + public Object doHandle(Channel channel, RenewDatumRequest request) { if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug("doHandle: request={}", request); } @@ -81,7 +81,7 @@ public Object doHandle(Channel channel, ReNewDatumRequest request) { return response; } - boolean isDiff = reNewDatum(request); + boolean isDiff = renewDatum(request); return new GenericResponse().fillSucceed(isDiff); } @@ -98,7 +98,7 @@ public HandlerType getType() { @Override public Class interest() { - return ReNewDatumRequest.class; + return RenewDatumRequest.class; } @Override @@ -110,7 +110,7 @@ protected Node.NodeType getConnectNodeType() { * 1. Update the timestamp corresponding to connectId in datumCache * 2. Compare checksum: Get all pubs corresponding to the connId from datumCache and calculate checksum. */ - private boolean reNewDatum(ReNewDatumRequest request) { + private boolean renewDatum(RenewDatumRequest request) { String connectId = request.getConnectId(); String renewDigest = request.getDigestSum(); @@ -122,8 +122,8 @@ private boolean reNewDatum(ReNewDatumRequest request) { .values())); } - // record the reNew timestamp - datumLeaseManager.reNew(connectId); + // record the renew timestamp + datumLeaseManager.renew(connectId); return StringUtils.equals(renewDigest, cacheDigest); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 2adf19c25..6164d91a4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -32,7 +32,7 @@ import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.cache.UnPublisher; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; -import com.alipay.sofa.registry.server.data.correction.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -83,10 +83,10 @@ public Object doHandle(Channel channel, UnPublishDataRequest request) { new UnPublisher(request.getDataInfoId(), request.getRegisterId(), request .getRegisterTimestamp()), dataServerConfig.getLocalDataCenter()); - // Attempt to get connectId from datumCache (Datum may not exist), and record the reNew timestamp + // Attempt to get connectId from datumCache (Datum may not exist), and record the renew timestamp String connectId = getConnectId(request); if (connectId != null) { - datumLeaseManager.reNew(connectId); + datumLeaseManager.renew(connectId); } return CommonResponse.buildSuccessResponse(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java similarity index 86% rename from server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java rename to server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index f1a9524e6..d75338d8d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.data.correction; +package com.alipay.sofa.registry.server.data.renew; import java.util.Map; import java.util.TimeZone; @@ -53,7 +53,7 @@ public class DatumLeaseManager { "[DatumLeaseManager]"); /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ - private final Map connectIdReNewTimestampMap = new ConcurrentHashMap<>(); + private final Map connectIdRenewTimestampMap = new ConcurrentHashMap<>(); /** lock for connectId , format: connectId -> true */ private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); @@ -93,15 +93,15 @@ public void executionFailed(Throwable e) { } /** - * record the reNew timestamp + * record the renew timestamp */ - public void reNew(String connectId) { + public void renew(String connectId) { if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("reNew: connectId={}", connectId); + RENEW_LOGGER.debug("renew: connectId={}", connectId); } - // record the reNew timestamp - connectIdReNewTimestampMap.put(connectId, System.currentTimeMillis()); + // record the renew timestamp + connectIdRenewTimestampMap.put(connectId, System.currentTimeMillis()); // try to trigger evict task scheduleEvictTask(connectId, 0); } @@ -126,31 +126,31 @@ private void scheduleEvictTask(String connectId, long delaySec) { // release lock locksForConnectId.remove(connectId); - // get lastReNewTime of this connectId - long lastReNewTime = connectIdReNewTimestampMap.get(connectId); + // get lastRenewTime of this connectId + long lastRenewTime = connectIdRenewTimestampMap.get(connectId); if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("EvictTask: connectId={}, lastReNewTime={}", connectId, format(lastReNewTime)); + RENEW_LOGGER.debug("EvictTask: connectId={}, lastRenewTime={}", connectId, format(lastRenewTime)); } /* - * 1. lastReNewTime expires, then: + * 1. lastRenewTime expires, then: * - build ClientOffEvent and hand it to DataChangeEventCenter. * - It will not be scheduled next time, so terminated. - * 2. lastReNewTime not expires, then: + * 2. lastRenewTime not expires, then: * - trigger the next schedule */ boolean isExpired = - System.currentTimeMillis() - lastReNewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; + System.currentTimeMillis() - lastRenewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; if (isExpired) { - LOGGER.info("ConnectId({}) expired, lastReNewTime is {}", connectId, format(lastReNewTime)); - connectIdReNewTimestampMap.remove(connectId, lastReNewTime); + LOGGER.info("ConnectId({}) expired, lastRenewTime is {}", connectId, format(lastRenewTime)); + connectIdRenewTimestampMap.remove(connectId, lastRenewTime); disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), dataServerConfig.getClientOffDelayMs() * 10)); continued = false; } else { nextDelaySec = dataServerConfig.getDatumTimeToLiveSec() - - (System.currentTimeMillis() - lastReNewTime) / 1000L; + - (System.currentTimeMillis() - lastRenewTime) / 1000L; nextDelaySec = nextDelaySec <= 0 ? 1 : nextDelaySec; } @@ -168,7 +168,7 @@ private void scheduleEvictTask(String connectId, long delaySec) { } - private String format(long lastReNewTime) { - return DateFormatUtils.format(lastReNewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE); + private String format(long lastRenewTime) { + return DateFormatUtils.format(lastRenewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE); } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java similarity index 99% rename from server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java rename to server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java index 0ccb094e6..f947c19dd 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/correction/LocalDataServerCleanHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alipay.sofa.registry.server.data.correction; +package com.alipay.sofa.registry.server.data.renew; import java.util.Map; import java.util.Map.Entry; diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index 710066ae3..98fe1548b 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -352,7 +352,7 @@ - + diff --git a/server/server/integration/src/main/resources/logback-spring.xml b/server/server/integration/src/main/resources/logback-spring.xml index d7c5f558f..2eb614d24 100644 --- a/server/server/integration/src/main/resources/logback-spring.xml +++ b/server/server/integration/src/main/resources/logback-spring.xml @@ -541,7 +541,7 @@ - + diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java index 745881be0..5b57bbe95 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; +import java.util.ArrayList; +import java.util.Collection; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import com.alipay.sofa.registry.jraft.service.PersistenceDataDBService; import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -45,7 +56,7 @@ import com.alipay.sofa.registry.server.meta.remoting.handler.FetchProvideDataRequestHandler; import com.alipay.sofa.registry.server.meta.remoting.handler.GetChangeListRequestHandler; import com.alipay.sofa.registry.server.meta.remoting.handler.GetNodesRequestHandler; -import com.alipay.sofa.registry.server.meta.remoting.handler.ReNewNodesRequestHandler; +import com.alipay.sofa.registry.server.meta.remoting.handler.RenewNodesRequestHandler; import com.alipay.sofa.registry.server.meta.remoting.handler.SessionNodeHandler; import com.alipay.sofa.registry.server.meta.repository.NodeConfirmStatusService; import com.alipay.sofa.registry.server.meta.repository.RepositoryService; @@ -76,16 +87,6 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import java.util.ArrayList; -import java.util.Collection; /** * @@ -228,7 +229,7 @@ public Collection sessionServerHandlers() { Collection list = new ArrayList<>(); list.add(sessionConnectionHandler()); list.add(sessionNodeHandler()); - list.add(reNewNodesRequestHandler()); + list.add(renewNodesRequestHandler()); list.add(getNodesRequestHandler()); list.add(fetchProvideDataRequestHandler()); return list; @@ -240,7 +241,7 @@ public Collection dataServerHandlers() { list.add(dataConnectionHandler()); list.add(getNodesRequestHandler()); list.add(dataNodeHandler()); - list.add(reNewNodesRequestHandler()); + list.add(renewNodesRequestHandler()); return list; } @@ -284,8 +285,8 @@ public AbstractServerHandler sessionNodeHandler() { } @Bean - public AbstractServerHandler reNewNodesRequestHandler() { - return new ReNewNodesRequestHandler(); + public AbstractServerHandler renewNodesRequestHandler() { + return new RenewNodesRequestHandler(); } @Bean diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/MetaServerRegistry.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/MetaServerRegistry.java index 589c5ce4c..2c6f9642b 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/MetaServerRegistry.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/MetaServerRegistry.java @@ -16,6 +16,9 @@ */ package com.alipay.sofa.registry.server.meta.registry; +import java.util.Collection; +import java.util.List; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; @@ -25,9 +28,6 @@ import com.alipay.sofa.registry.server.meta.bootstrap.ServiceFactory; import com.alipay.sofa.registry.server.meta.store.StoreService; -import java.util.Collection; -import java.util.List; - /** * factory func to operate StoreService * @author shangyu.wh @@ -73,9 +73,9 @@ public void evict() { } @Override - public void reNew(Node node, int duration) { + public void renew(Node node, int duration) { StoreService storeService = ServiceFactory.getStoreService(node.getNodeType()); - storeService.reNew(node, duration); + storeService.renew(node, duration); } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java index 9a5ee8ce3..ec8b92988 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/registry/Registry.java @@ -59,10 +59,10 @@ public interface Registry { void evict(); /** - * reNew node expire time + * renew node expire time * @param node */ - void reNew(T node, int duration); + void renew(T node, int duration); /** * get other dataCenter Nodes change scheduled diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/ReNewNodesRequestHandler.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/RenewNodesRequestHandler.java similarity index 73% rename from server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/ReNewNodesRequestHandler.java rename to server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/RenewNodesRequestHandler.java index 7425ce141..e30229d2d 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/ReNewNodesRequestHandler.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/handler/RenewNodesRequestHandler.java @@ -16,42 +16,43 @@ */ package com.alipay.sofa.registry.server.meta.remoting.handler; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.metaserver.ReNewNodesRequest; +import com.alipay.sofa.registry.common.model.metaserver.RenewNodesRequest; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.meta.registry.Registry; -import org.springframework.beans.factory.annotation.Autowired; /** * Handle session/data node's heartbeat request * @author shangyu.wh - * @version $Id: ReNewNodesRequestHandler.java, v 0.1 2018-03-30 19:58 shangyu.wh Exp $ + * @version $Id: RenewNodesRequestHandler.java, v 0.1 2018-03-30 19:58 shangyu.wh Exp $ */ -public class ReNewNodesRequestHandler extends AbstractServerHandler { +public class RenewNodesRequestHandler extends AbstractServerHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(ReNewNodesRequestHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RenewNodesRequestHandler.class); @Autowired private Registry metaServerRegistry; @Override - public Object reply(Channel channel, ReNewNodesRequest reNewNodesRequest) { - Node reNewNode = null; + public Object reply(Channel channel, RenewNodesRequest renewNodesRequest) { + Node renewNode = null; try { - reNewNode = reNewNodesRequest.getNode(); - metaServerRegistry.reNew(reNewNode, reNewNodesRequest.getDuration()); + renewNode = renewNodesRequest.getNode(); + metaServerRegistry.renew(renewNode, renewNodesRequest.getDuration()); } catch (Exception e) { - LOGGER.error("Node " + reNewNode + "reNew error!", e); - throw new RuntimeException("Node reNew error!", e); + LOGGER.error("Node " + renewNode + "renew error!", e); + throw new RuntimeException("Node renew error!", e); } return null; } @Override public Class interest() { - return ReNewNodesRequest.class; + return RenewNodesRequest.class; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java index 716359bb3..91c02428c 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -26,15 +36,6 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -170,7 +171,7 @@ public RenewDecorate replace(String ipAddress, RenewDecorate RenewDecorate oldRenewDecorate = dataNodes.get(ipAddress); if (oldRenewDecorate != null && oldRenewDecorate.getRenewal() != null) { oldRenewDecorate.setRenewal(dataNode.getRenewal()); - oldRenewDecorate.reNew(); + oldRenewDecorate.renew(); } else { LOGGER.error("Data node with ipAddress {} has not existed!", ipAddress); throw new RuntimeException(String.format( diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java index 06bb4a26d..6cb4a83cb 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -26,15 +36,6 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -168,7 +169,7 @@ public RenewDecorate replace(String ipAddress, RenewDecorate RenewDecorate oldRenewDecorate = dataNodes.get(ipAddress); if (oldRenewDecorate != null && oldRenewDecorate.getRenewal() != null) { oldRenewDecorate.setRenewal(metaNode.getRenewal()); - oldRenewDecorate.reNew(); + oldRenewDecorate.renew(); metaNodeRepository.setVersion(System.currentTimeMillis()); } else { diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java index 4a4f4d10f..445c194ac 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.metaserver.SessionNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -26,13 +34,6 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; /** * @@ -115,7 +116,7 @@ public RenewDecorate replace(String ipAddress, RenewDecorate oldRenewDecorate = registry.get(ipAddress); if (oldRenewDecorate != null && oldRenewDecorate.getRenewal() != null) { oldRenewDecorate.setRenewal(sessionNode.getRenewal()); - oldRenewDecorate.reNew(); + oldRenewDecorate.renew(); } else { LOGGER.error("Session node with ipAddress {} has not existed!", ipAddress); throw new RuntimeException(String.format( diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java index ff324ff19..cbde82c74 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java @@ -16,6 +16,21 @@ */ package com.alipay.sofa.registry.server.meta.store; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.DataNode; @@ -36,20 +51,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; /** * @@ -110,7 +111,7 @@ public NodeChangeResult addNode(DataNode dataNode) { dataRepositoryService.put(ipAddress, new RenewDecorate(dataNode, RenewDecorate.DEFAULT_DURATION_SECS)); - reNew(dataNode, 30); + renew(dataNode, 30); nodeChangeResult = getNodeChangeResult(); @@ -170,15 +171,15 @@ public void removeNodes(Collection nodes) { } @Override - public void reNew(DataNode dataNode, int duration) { + public void renew(DataNode dataNode, int duration) { long startAll = System.currentTimeMillis(); write.lock(); try { String ipAddress = dataNode.getNodeUrl().getIpAddress(); - RenewDecorate reNewer = dataRepositoryService.get(ipAddress); + RenewDecorate renewer = dataRepositoryService.get(ipAddress); - if (reNewer == null) { + if (renewer == null) { LOGGER.warn("Renew Data node with ipAddress:" + ipAddress + " has not existed!It will be registered again!"); addNode(dataNode); @@ -206,7 +207,7 @@ public void reNew(DataNode dataNode, int duration) { */ @Override public Collection getExpired() { - Collection reNewerList = new ArrayList<>(); + Collection renewerList = new ArrayList<>(); read.lock(); try { Map> dataMap = dataRepositoryService.getAllData(); @@ -216,7 +217,7 @@ public Collection getExpired() { String dataCenter = dataNode.getRenewal().getDataCenter(); if (dataCenter.equals(nodeConfig.getLocalDataCenter())) { if (dataNode.isExpired()) { - reNewerList.add(dataNode.getRenewal()); + renewerList.add(dataNode.getRenewal()); } } }); @@ -224,7 +225,7 @@ public Collection getExpired() { } finally { read.unlock(); } - return reNewerList; + return renewerList; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java index f50ce3b80..69a60bd76 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java @@ -16,6 +16,20 @@ */ package com.alipay.sofa.registry.server.meta.store; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import javax.ws.rs.NotSupportedException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.GetChangeListRequest; @@ -31,18 +45,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.ws.rs.NotSupportedException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -167,7 +169,7 @@ public void confirmNodeStatus(String connectId, String ip) { } @Override - public void reNew(MetaNode node, int duration) { + public void renew(MetaNode node, int duration) { } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/RenewDecorate.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/RenewDecorate.java index e642ba557..2127a2c1b 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/RenewDecorate.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/RenewDecorate.java @@ -21,7 +21,7 @@ /** * heartbeat info for node * @author shangyu.wh - * @version $Id: ReNewer.java, v 0.1 2018-01-16 17:10 shangyu.wh Exp $ + * @version $Id: Renewer.java, v 0.1 2018-01-16 17:10 shangyu.wh Exp $ */ public class RenewDecorate implements Serializable { @@ -66,7 +66,7 @@ public boolean isExpired() { /** * refresh lastUpdateTimestamp */ - public void reNew() { + public void renew() { lastUpdateTimestamp = System.currentTimeMillis() + duration; } @@ -74,7 +74,7 @@ public void reNew() { * refresh lastUpdateTimestamp by durationSECS * @param durationSECS */ - public void reNew(long durationSECS) { + public void renew(long durationSECS) { lastUpdateTimestamp = System.currentTimeMillis() + durationSECS * 1000; } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/SessionStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/SessionStoreService.java index 5123a9f43..b5d204ce9 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/SessionStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/SessionStoreService.java @@ -16,6 +16,21 @@ */ package com.alipay.sofa.registry.server.meta.store; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; + +import javax.ws.rs.NotSupportedException; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; @@ -34,19 +49,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.ws.rs.NotSupportedException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; /** * @@ -106,7 +108,7 @@ public NodeChangeResult addNode(SessionNode sessionNode) { sessionVersionRepositoryService.checkAndUpdateVersions(nodeConfig.getLocalDataCenter(), System.currentTimeMillis()); - reNew(sessionNode, 30); + renew(sessionNode, 30); sessionConfirmStatusService.putConfirmNode(sessionNode, DataOperator.ADD); @@ -173,15 +175,15 @@ public void removeNodes(Collection nodes) { } @Override - public void reNew(SessionNode sessionNode, int duration) { + public void renew(SessionNode sessionNode, int duration) { write.lock(); try { String ipAddress = sessionNode.getNodeUrl().getIpAddress(); - RenewDecorate reNewer = sessionRepositoryService.get(ipAddress); + RenewDecorate renewer = sessionRepositoryService.get(ipAddress); - if (reNewer == null) { - LOGGER.warn("ReNew session node with ipAddress:" + ipAddress + if (renewer == null) { + LOGGER.warn("Renew session node with ipAddress:" + ipAddress + " has not existed!It will be registered again!"); addNode(sessionNode); } else { @@ -200,19 +202,19 @@ public void reNew(SessionNode sessionNode, int duration) { @Override public Collection getExpired() { - Collection reNewerList = new ArrayList<>(); + Collection renewerList = new ArrayList<>(); read.lock(); try { Map> map = sessionRepositoryService.getAllData(); map.forEach((key, value) -> { if (value.isExpired()) { - reNewerList.add(value.getRenewal()); + renewerList.add(value.getRenewal()); } }); } finally { read.unlock(); } - return reNewerList; + return renewerList; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java index d2bf3700d..420e29dc5 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/StoreService.java @@ -41,7 +41,7 @@ public interface StoreService { NodeChangeResult setNodes(List nodes); /** - * add new node,when reNew request not found node will be add again + * add new node,when renew request not found node will be add again * @param node * @return */ @@ -72,7 +72,7 @@ public interface StoreService { * @param node * @return */ - void reNew(T node, int duration); + void renew(T node, int duration); /** * get expired node list diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index e29f1cb63..79d55972b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicLong; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -165,7 +165,7 @@ private void doHandle(WriteDataRequest request) { if (renewAndSnapshotInSilence()) { return; } - doReNewAsync(request); + doRenewAsync(request); } break; case DATUM_SNAPSHOT: { @@ -184,14 +184,14 @@ private void doHandle(WriteDataRequest request) { } } - private void doReNewAsync(WriteDataRequest request) { + private void doRenewAsync(WriteDataRequest request) { if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("doReNewAsync: connectId={}, requestType={}, requestBody={}", + RENEW_LOGGER.debug("doRenewAsync: connectId={}, requestType={}, requestBody={}", connectId, request.getRequestType(), request.getRequestBody()); } - ReNewDatumRequest reNewDatumRequest = (ReNewDatumRequest) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(reNewDatumRequest, TaskType.RENEW_DATUM_TASK); + RenewDatumRequest renewDatumRequest = (RenewDatumRequest) request.getRequestBody(); + TaskEvent taskEvent = new TaskEvent(renewDatumRequest, TaskType.RENEW_DATUM_TASK); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 621f1dbfa..81e9b9be2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -73,7 +73,7 @@ public interface SessionServerConfig { int getDatumSnapshotTaskRetryTimes(); - int getReNewDatumTaskRetryTimes(); + int getRenewDatumTaskRetryTimes(); int getDataChangeFetchTaskRetryTimes(); @@ -135,11 +135,11 @@ public interface SessionServerConfig { long getPushDataTaskRetryIncrementDelay(); - int getReNewDatumWheelTicksSize(); + int getRenewDatumWheelTicksSize(); - int getReNewDatumWheelTicksDuration(); + int getRenewDatumWheelTicksDuration(); - long getReNewDatumWheelTaskDelay(); + long getRenewDatumWheelTaskDelay(); int getNumberOfReplicas(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 93ba8d86f..49f13eef9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -86,7 +86,7 @@ public class SessionServerConfigBean implements SessionServerConfig { private int datumSnapshotTaskRetryTimes = 3; - private int reNewDatumTaskRetryTimes = 3; + private int renewDatumTaskRetryTimes = 3; private int dataChangeFetchTaskRetryTimes = 3; @@ -148,11 +148,11 @@ public class SessionServerConfigBean implements SessionServerConfig { private int userDataPushRetryWheelTicksDuration = 100; - private int reNewDatumWheelTicksSize = 2048; + private int renewDatumWheelTicksSize = 2048; - private int reNewDatumWheelTicksDuration = 500; + private int renewDatumWheelTicksDuration = 500; - private long reNewDatumWheelTaskDelay = 30; + private long renewDatumWheelTaskDelay = 30; private int pushDataTaskRetryFirstDelay = 500; @@ -271,22 +271,22 @@ public void setDatumSnapshotTaskRetryTimes(int datumSnapshotTaskRetryTimes) { } /** - * Getter method for property reNewDatumTaskRetryTimes. + * Getter method for property renewDatumTaskRetryTimes. * - * @return property value of reNewDatumTaskRetryTimes + * @return property value of renewDatumTaskRetryTimes */ @Override - public int getReNewDatumTaskRetryTimes() { - return reNewDatumTaskRetryTimes; + public int getRenewDatumTaskRetryTimes() { + return renewDatumTaskRetryTimes; } /** - * Setter method for property reNewDatumTaskRetryTimes . + * Setter method for property renewDatumTaskRetryTimes . * - * @param reNewDatumTaskRetryTimes value to be assigned to property reNewDatumTaskRetryTimes + * @param renewDatumTaskRetryTimes value to be assigned to property renewDatumTaskRetryTimes */ - public void setReNewDatumTaskRetryTimes(int reNewDatumTaskRetryTimes) { - this.reNewDatumTaskRetryTimes = reNewDatumTaskRetryTimes; + public void setRenewDatumTaskRetryTimes(int renewDatumTaskRetryTimes) { + this.renewDatumTaskRetryTimes = renewDatumTaskRetryTimes; } /** @@ -1416,57 +1416,57 @@ public long getPushDataTaskRetryIncrementDelay() { } /** - * Getter method for property reNewDatumWheelTicksSize. + * Getter method for property renewDatumWheelTicksSize. * - * @return property value of reNewDatumWheelTicksSize + * @return property value of renewDatumWheelTicksSize */ - public int getReNewDatumWheelTicksSize() { - return reNewDatumWheelTicksSize; + public int getRenewDatumWheelTicksSize() { + return renewDatumWheelTicksSize; } /** - * Getter method for property reNewDatumWheelTicksDuration. + * Getter method for property renewDatumWheelTicksDuration. * - * @return property value of reNewDatumWheelTicksDuration + * @return property value of renewDatumWheelTicksDuration */ - public int getReNewDatumWheelTicksDuration() { - return reNewDatumWheelTicksDuration; + public int getRenewDatumWheelTicksDuration() { + return renewDatumWheelTicksDuration; } /** - * Getter method for property reNewDatumWheelTaskDelay. + * Getter method for property renewDatumWheelTaskDelay. * - * @return property value of reNewDatumWheelTaskDelay + * @return property value of renewDatumWheelTaskDelay */ - public long getReNewDatumWheelTaskDelay() { - return reNewDatumWheelTaskDelay; + public long getRenewDatumWheelTaskDelay() { + return renewDatumWheelTaskDelay; } /** - * Setter method for property reNewDatumWheelTaskDelay. + * Setter method for property renewDatumWheelTaskDelay. * - * @param reNewDatumWheelTaskDelay value to be assigned to property reNewDatumWheelTaskDelay + * @param renewDatumWheelTaskDelay value to be assigned to property renewDatumWheelTaskDelay */ - public void setReNewDatumWheelTaskDelay(long reNewDatumWheelTaskDelay) { - this.reNewDatumWheelTaskDelay = reNewDatumWheelTaskDelay; + public void setRenewDatumWheelTaskDelay(long renewDatumWheelTaskDelay) { + this.renewDatumWheelTaskDelay = renewDatumWheelTaskDelay; } /** - * Setter method for property reNewDatumWheelTicksSize. + * Setter method for property renewDatumWheelTicksSize. * - * @param reNewDatumWheelTicksSize value to be assigned to property reNewDatumWheelTicksSize + * @param renewDatumWheelTicksSize value to be assigned to property renewDatumWheelTicksSize */ - public void setReNewDatumWheelTicksSize(int reNewDatumWheelTicksSize) { - this.reNewDatumWheelTicksSize = reNewDatumWheelTicksSize; + public void setRenewDatumWheelTicksSize(int renewDatumWheelTicksSize) { + this.renewDatumWheelTicksSize = renewDatumWheelTicksSize; } /** - * Setter method for property reNewDatumWheelTicksDuration. + * Setter method for property renewDatumWheelTicksDuration. * - * @param reNewDatumWheelTicksDuration value to be assigned to property reNewDatumWheelTicksDuration + * @param renewDatumWheelTicksDuration value to be assigned to property renewDatumWheelTicksDuration */ - public void setReNewDatumWheelTicksDuration(int reNewDatumWheelTicksDuration) { - this.reNewDatumWheelTicksDuration = reNewDatumWheelTicksDuration; + public void setRenewDatumWheelTicksDuration(int renewDatumWheelTicksDuration) { + this.renewDatumWheelTicksDuration = renewDatumWheelTicksDuration; } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 743358b7a..4ffcd0405 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -44,9 +44,9 @@ import com.alipay.sofa.registry.server.session.listener.DatumSnapshotTaskListener; import com.alipay.sofa.registry.server.session.listener.ProvideDataChangeFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.PublishDataTaskListener; -import com.alipay.sofa.registry.server.session.listener.ReNewDatumTaskListener; import com.alipay.sofa.registry.server.session.listener.ReceivedConfigDataPushTaskListener; import com.alipay.sofa.registry.server.session.listener.ReceivedDataMultiPushTaskListener; +import com.alipay.sofa.registry.server.session.listener.RenewDatumTaskListener; import com.alipay.sofa.registry.server.session.listener.SessionRegisterDataTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberMultiFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberRegisterFetchTaskListener; @@ -87,6 +87,8 @@ import com.alipay.sofa.registry.server.session.remoting.handler.SubscriberHandler; import com.alipay.sofa.registry.server.session.remoting.handler.SyncConfigHandler; import com.alipay.sofa.registry.server.session.remoting.handler.WatcherHandler; +import com.alipay.sofa.registry.server.session.renew.DefaultRenewService; +import com.alipay.sofa.registry.server.session.renew.RenewService; import com.alipay.sofa.registry.server.session.resource.ClientsOpenResource; import com.alipay.sofa.registry.server.session.resource.HealthResource; import com.alipay.sofa.registry.server.session.resource.SessionDigestResource; @@ -428,40 +430,35 @@ public TaskProcessor consoleSyncSingleTaskProcessor() { @Bean public TaskListener subscriberRegisterFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SubscriberRegisterFetchTaskListener( - dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SubscriberRegisterFetchTaskListener(dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener subscriberMultiFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SubscriberMultiFetchTaskListener( - dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SubscriberMultiFetchTaskListener(dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener watcherRegisterFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new WatcherRegisterFetchTaskListener( - metaNodeSingleTaskProcessor()); + TaskListener taskListener = new WatcherRegisterFetchTaskListener(metaNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener provideDataChangeFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new ProvideDataChangeFetchTaskListener( - metaNodeSingleTaskProcessor()); + TaskListener taskListener = new ProvideDataChangeFetchTaskListener(metaNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener dataChangeFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new DataChangeFetchTaskListener( - dataNodeSingleTaskProcessor()); + TaskListener taskListener = new DataChangeFetchTaskListener(dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -475,16 +472,14 @@ public TaskListener dataPushTaskListener(TaskListenerManager taskListenerManager @Bean public TaskListener dataChangeFetchCloudTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new DataChangeFetchCloudTaskListener( - dataNodeSingleTaskProcessor()); + TaskListener taskListener = new DataChangeFetchCloudTaskListener(dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener sessionRegisterDataTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SessionRegisterDataTaskListener( - dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SessionRegisterDataTaskListener(dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -493,17 +488,15 @@ public TaskListener sessionRegisterDataTaskListener(TaskListenerManager taskList public TaskListener receivedDataMultiPushTaskListener(TaskListenerManager taskListenerManager, TaskMergeProcessorStrategy receiveDataTaskMergeProcessorStrategy, SessionServerConfig sessionServerConfig) { - TaskListener taskListener = new ReceivedDataMultiPushTaskListener( - clientNodeSingleTaskProcessor(), receiveDataTaskMergeProcessorStrategy, - sessionServerConfig); + TaskListener taskListener = new ReceivedDataMultiPushTaskListener(clientNodeSingleTaskProcessor(), + receiveDataTaskMergeProcessorStrategy, sessionServerConfig); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener receivedConfigDataPushTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new ReceivedConfigDataPushTaskListener( - clientNodeSingleTaskProcessor()); + TaskListener taskListener = new ReceivedConfigDataPushTaskListener(clientNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -530,8 +523,8 @@ public TaskListener publishDataTaskListener(TaskListenerManager taskListenerMana } @Bean - public TaskListener reNewDatumTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new ReNewDatumTaskListener(); + public TaskListener renewDatumTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new RenewDatumTaskListener(); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -639,11 +632,16 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { } @Configuration - public static class SessionReNewDatumConfiguration { + public static class SessionRenewDatumConfiguration { @Bean public WriteDataAcceptor writeDataAcceptor() { return new WriteDataAcceptorImpl(); } + + @Bean + public RenewService renewService() { + return new DefaultRenewService(); + } } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java index ea200140e..0f36022a4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java @@ -23,7 +23,7 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.registry.SessionRegistry; -import com.alipay.sofa.registry.server.session.scheduler.task.ReNewDatumTask; +import com.alipay.sofa.registry.server.session.scheduler.task.RenewDatumTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.task.batcher.TaskDispatcher; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; @@ -35,9 +35,9 @@ /** * * @author kezhu.wukz - * @version $Id: ReNewDatumTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ + * @version $Id: RenewDatumTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ */ -public class ReNewDatumTaskListener implements TaskListener { +public class RenewDatumTaskListener implements TaskListener { @Autowired private DataNodeService dataNodeService; @@ -67,13 +67,13 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { - SessionTask reNewDatumTask = new ReNewDatumTask(sessionServerConfig, dataNodeService, + SessionTask renewDatumTask = new RenewDatumTask(sessionServerConfig, dataNodeService, sessionRegistry); - reNewDatumTask.setTaskEvent(event); + renewDatumTask.setTaskEvent(event); - singleTaskDispatcher.dispatch(reNewDatumTask.getTaskId(), reNewDatumTask, - reNewDatumTask.getExpiryTime()); + singleTaskDispatcher.dispatch(renewDatumTask.getTaskId(), renewDatumTask, + renewDatumTask.getExpiryTime()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java index 894346efa..d4bb467ef 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.node; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; @@ -23,7 +25,6 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -70,7 +71,7 @@ public NodeType getNodeType() { } @Override - public void reNewNode() { + public void renewNode() { } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/MetaNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/MetaNodeManager.java index 2a2095096..56117598a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/MetaNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/MetaNodeManager.java @@ -16,11 +16,11 @@ */ package com.alipay.sofa.registry.server.session.node; +import java.util.Collection; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.MetaNode; -import java.util.Collection; - /** * * @author shangyu.wh @@ -44,6 +44,6 @@ public Collection getDataCenters() { } @Override - public void reNewNode() { + public void renewNode() { } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/NodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/NodeManager.java index 59b47879a..c3c0ebc74 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/NodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/NodeManager.java @@ -16,13 +16,13 @@ */ package com.alipay.sofa.registry.server.session.node; +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; -import java.util.Collection; -import java.util.concurrent.ConcurrentHashMap; - /** * * @author shangyu.wh @@ -40,7 +40,7 @@ public interface NodeManager { Collection getDataCenters(); - void reNewNode(); + void renewNode(); NodeChangeResult getAllDataCenterNodes(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java index 4c50cfa2e..ecfdea5ea 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java @@ -16,9 +16,13 @@ */ package com.alipay.sofa.registry.server.session.node; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; -import com.alipay.sofa.registry.common.model.metaserver.ReNewNodesRequest; +import com.alipay.sofa.registry.common.model.metaserver.RenewNodesRequest; import com.alipay.sofa.registry.common.model.metaserver.SessionNode; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -27,10 +31,6 @@ import com.alipay.sofa.registry.remoting.exchange.RequestException; import com.alipay.sofa.registry.remoting.exchange.message.Request; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - /** * * @author shangyu.wh @@ -71,18 +71,18 @@ public List getZoneServerList(String zonename) { } @Override - public void reNewNode() { + public void renewNode() { try { - Request reNewNodesRequestRequest = new Request() { + Request renewNodesRequestRequest = new Request() { @Override - public ReNewNodesRequest getRequestBody() { + public RenewNodesRequest getRequestBody() { URL clientUrl = new URL(NetUtil.getLocalAddress().getHostAddress(), 0); SessionNode sessionNode = new SessionNode(clientUrl, sessionServerConfig.getSessionServerRegion()); - return new ReNewNodesRequest(sessionNode); + return new RenewNodesRequest(sessionNode); } @Override @@ -92,10 +92,10 @@ public URL getRequestUrl() { } }; - metaNodeExchanger.request(reNewNodesRequestRequest); + metaNodeExchanger.request(renewNodesRequestRequest); } catch (RequestException e) { - LOGGER.error("SessionNodeManager reNew node error! " + e.getRequestMessage(), e); - throw new RuntimeException("SessionNodeManager reNew node error! " + LOGGER.error("SessionNodeManager renew node error! " + e.getRequestMessage(), e); + throw new RuntimeException("SessionNodeManager renew node error! " + e.getRequestMessage(), e); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java index cc013f95b..544c88010 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java @@ -21,7 +21,7 @@ import java.util.Map; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; import com.alipay.sofa.registry.common.model.store.Publisher; @@ -100,9 +100,9 @@ void registerSessionProcessId(SessionServerRegisterRequest sessionServerRegister URL dataUrl); /** - * check publisher digest same as session current store,and reNew the lastUpdateTime of this connectId + * check publisher digest same as session current store,and renew the lastUpdateTime of this connectId */ - Boolean reNewDatum(ReNewDatumRequest reNewDatumRequest); + Boolean renewDatum(RenewDatumRequest renewDatumRequest); /** * Correct the publishers information of this connectId on dataServer diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 123c093d1..43e123852 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -29,7 +29,7 @@ import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.dataserver.ClientOffRequest; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; @@ -468,17 +468,17 @@ private URL getUrl(String dataInfoId) { return null; } - public Boolean reNewDatum(ReNewDatumRequest reNewDatumRequest) { + public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { try { - Request request = new Request() { + Request request = new Request() { @Override - public ReNewDatumRequest getRequestBody() { - return reNewDatumRequest; + public RenewDatumRequest getRequestBody() { + return renewDatumRequest; } @Override public URL getRequestUrl() { - return new URL(reNewDatumRequest.getDataServerIp(), + return new URL(renewDatumRequest.getDataServerIp(), sessionServerConfig.getDataServerPort()); } }; @@ -492,20 +492,20 @@ public URL getRequestUrl() { return (Boolean) genericResponse.getData(); } else { - LOGGER.error("reNewDatum has not get fail response!msg:{}", + LOGGER.error("renewDatum has not get fail response!msg:{}", genericResponse.getMessage()); - throw new RuntimeException("reNewDatum has not get fail response! msg:" + throw new RuntimeException("renewDatum has not get fail response! msg:" + genericResponse.getMessage()); } } else { - LOGGER.error("reNewDatum has not get response or response type illegal!"); + LOGGER.error("renewDatum has not get response or response type illegal!"); throw new RuntimeException( - "reNewDatum has not get response or response type illegal!"); + "renewDatum has not get response or response type illegal!"); } } catch (RequestException e) { - LOGGER.error("ReNewDatum request error! " + e.getRequestMessage(), e); - throw new RuntimeException("ReNewDatum request error! " + e.getRequestMessage(), e); + LOGGER.error("RenewDatum request error! " + e.getRequestMessage(), e); + throw new RuntimeException("RenewDatum request error! " + e.getRequestMessage(), e); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 9cfed72de..b752fd6f5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -65,7 +65,7 @@ public interface Registry { /** * Regularly send update Datum with same connectID valid time request service */ - void reNewDatum(String connectId); + void renewDatum(String connectId); void sendDatumSnapshot(String connectId); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 933d4ab98..4bdf3dd59 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -26,7 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.BaseInfo; import com.alipay.sofa.registry.common.model.store.Publisher; @@ -219,7 +219,7 @@ public String getConnectId() { @Override public void cancel(List connectIds) { - //update local firstly, data node send error depend on reNew check + //update local firstly, data node send error depend on renew check List connectIdsWithPub = new ArrayList<>(); for (String connectId : connectIds) { if (sessionDataStore.deleteByConnectId(connectId)) { @@ -327,20 +327,20 @@ private void checkConnect(StoreData storeData) { } @Override - public void reNewDatum(String connectId) { + public void renewDatum(String connectId) { if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("reNewDatum: connectId={}", connectId); + RENEW_LOGGER.debug("renewDatum: connectId={}", connectId); } - List reNewDatumRequests = renewService.getReNewDatumRequests(connectId); - if (reNewDatumRequests != null) { - for (ReNewDatumRequest reNewDatumRequest : reNewDatumRequests) { + List renewDatumRequests = renewService.getRenewDatumRequests(connectId); + if (renewDatumRequests != null) { + for (RenewDatumRequest renewDatumRequest : renewDatumRequests) { // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override public Object getRequestBody() { - return reNewDatumRequest; + return renewDatumRequest; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java index 68aa8ef43..4e1b3680a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java @@ -80,7 +80,7 @@ public HandlerType getType() { @Override public void connected(Channel channel) throws RemotingException { super.connected(channel); - fireReNewDatum(channel); + fireRenewDatum(channel); } @Override @@ -126,13 +126,13 @@ private boolean checkWatcher(String connectId) { return subMap != null && !subMap.isEmpty(); } - private void fireReNewDatum(Channel channel) { + private void fireRenewDatum(Channel channel) { executorManager.getConnectClientExecutor().execute(() -> { String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); RENEW_LOGGER.info("Renew task is started: {}", connectId); executorManager.getAsyncHashedWheelTimerTask() - .newTimeout(connectId, timerOut -> sessionRegistry.reNewDatum(connectId), - sessionServerConfig.getReNewDatumWheelTaskDelay(), TimeUnit.SECONDS, () -> { + .newTimeout(connectId, timerOut -> sessionRegistry.renewDatum(connectId), + sessionServerConfig.getRenewDatumWheelTaskDelay(), TimeUnit.SECONDS, () -> { Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); boolean shouldContinue = channelClient != null && channel.isConnected(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java index 31173b240..42f709eb5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java @@ -27,7 +27,7 @@ import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublisherDigestUtil; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -55,11 +55,11 @@ public class DefaultRenewService implements RenewService { private NodeManager dataNodeManager; @Override - public List getReNewDatumRequests(String connectId) { + public List getRenewDatumRequests(String connectId) { List datumSnapshotRequests = getDatumSnapshotRequests(connectId); if (datumSnapshotRequests != null && !datumSnapshotRequests.isEmpty()) { return datumSnapshotRequests.stream() - .map(datumSnapshotRequest -> new ReNewDatumRequest(datumSnapshotRequest.getConnectId(), + .map(datumSnapshotRequest -> new RenewDatumRequest(datumSnapshotRequest.getConnectId(), datumSnapshotRequest.getDataServerIp(), String.valueOf( PublisherDigestUtil.getDigestValueSum(datumSnapshotRequest.getPublishers())))) .collect(Collectors.toList()); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java index b71493347..9d3b7f5b9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java @@ -19,7 +19,7 @@ import java.util.List; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; /** * @@ -29,12 +29,12 @@ public interface RenewService { /** - * Get ReNewDatumRequests based on connectId + * Get RenewDatumRequests based on connectId * * @param connectId * @return */ - List getReNewDatumRequests(String connectId); + List getRenewDatumRequests(String connectId); /** * Get DatumSnapshotRequests based on connectId diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index 378a1fa66..c9653d7d0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -16,17 +16,6 @@ */ package com.alipay.sofa.registry.server.session.scheduler; -import com.alipay.sofa.registry.metrics.TaskMetrics; -import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.node.NodeManager; -import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.task.scheduler.AsyncHashedWheelTimerTask; -import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; -import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; -import com.alipay.sofa.registry.util.NamedThreadFactory; -import org.springframework.beans.factory.annotation.Autowired; - import java.util.HashMap; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; @@ -38,6 +27,18 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.metrics.TaskMetrics; +import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.task.scheduler.AsyncHashedWheelTimerTask; +import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; +import com.alipay.sofa.registry.util.NamedThreadFactory; + /** * * @author shangyu.wh @@ -109,7 +110,7 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-fetchData")); renNewDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-reNewData")); + new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-renewData")); getSessionNodeExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-getSessionNode")); @@ -173,9 +174,9 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new NamedThreadFactory("DisconnectClientExecutor", true))); - asyncHashedWheelTimerTask = new AsyncHashedWheelTimerTask("Registry-ReNewDatumTask-WheelTimer", - sessionServerConfig.getReNewDatumWheelTicksDuration(),TimeUnit.MILLISECONDS, - sessionServerConfig.getReNewDatumWheelTicksSize()); + asyncHashedWheelTimerTask = new AsyncHashedWheelTimerTask("Registry-RenewDatumTask-WheelTimer", + sessionServerConfig.getRenewDatumWheelTicksDuration(),TimeUnit.MILLISECONDS, + sessionServerConfig.getRenewDatumWheelTicksSize()); } public void startScheduler() { @@ -187,10 +188,10 @@ public void startScheduler() { sessionServerConfig.getSchedulerFetchDataFirstDelay(), TimeUnit.SECONDS); scheduler.schedule( - new TimedSupervisorTask("ReNewData", scheduler, renNewDataExecutor, + new TimedSupervisorTask("RenewData", scheduler, renNewDataExecutor, sessionServerConfig.getSchedulerHeartbeatTimeout(), TimeUnit.SECONDS, sessionServerConfig.getSchedulerHeartbeatExpBackOffBound(), - () -> sessionNodeManager.reNewNode()), + () -> sessionNodeManager.renewNode()), sessionServerConfig.getSchedulerHeartbeatFirstDelay(), TimeUnit.SECONDS); scheduler.schedule( diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java similarity index 73% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index 4d23053c1..37af59d2f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReNewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -16,7 +16,7 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import com.alipay.sofa.registry.common.model.ReNewDatumRequest; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -28,13 +28,13 @@ /** * * @author kezhu.wukz - * @version $Id: ReNewDatumTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + * @version $Id: RenewDatumTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ */ -public class ReNewDatumTask extends AbstractSessionTask { +public class RenewDatumTask extends AbstractSessionTask { private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( ValueConstants.LOGGER_NAME_RENEW, - "[ReNewDatumTask]"); + "[RenewDatumTask]"); private final DataNodeService dataNodeService; @@ -42,9 +42,9 @@ public class ReNewDatumTask extends AbstractSessionTask { private final SessionRegistry sessionRegistry; - private ReNewDatumRequest reNewDatumRequest; + private RenewDatumRequest renewDatumRequest; - public ReNewDatumTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService, + public RenewDatumTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService, SessionRegistry sessionRegistry) { this.sessionServerConfig = sessionServerConfig; this.dataNodeService = dataNodeService; @@ -55,20 +55,20 @@ public ReNewDatumTask(SessionServerConfig sessionServerConfig, DataNodeService d public void execute() { try { - Boolean result = dataNodeService.reNewDatum(reNewDatumRequest); + Boolean result = dataNodeService.renewDatum(renewDatumRequest); if (!result) { RENEW_LOGGER .info( - "ReNew datum request to dataNode got sub digest different! reNewDatumRequest={}", - reNewDatumRequest); + "Renew datum request to dataNode got sub digest different! renewDatumRequest={}", + renewDatumRequest); // send snapshot datum for the corresponding connId - sessionRegistry.sendDatumSnapshot(reNewDatumRequest.getConnectId()); + sessionRegistry.sendDatumSnapshot(renewDatumRequest.getConnectId()); } } catch (Exception e) { - RENEW_LOGGER.error("ReNew datum request to dataNode error! reNewDatumRequest={}", - reNewDatumRequest, e); + RENEW_LOGGER.error("Renew datum request to dataNode error! renewDatumRequest={}", + renewDatumRequest, e); } } @@ -80,8 +80,8 @@ public void setTaskEvent(TaskEvent taskEvent) { } Object obj = taskEvent.getEventObj(); - if (obj instanceof ReNewDatumRequest) { - this.reNewDatumRequest = (ReNewDatumRequest) obj; + if (obj instanceof RenewDatumRequest) { + this.renewDatumRequest = (RenewDatumRequest) obj; } else { throw new IllegalArgumentException("Input task event object error!"); } @@ -89,13 +89,13 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "RENEW_DATUM_TASK{" + "taskId='" + getTaskId() + '\'' + ", reNewDatumRequest=" - + reNewDatumRequest + ", retry='" + return "RENEW_DATUM_TASK{" + "taskId='" + getTaskId() + '\'' + ", renewDatumRequest=" + + renewDatumRequest + ", retry='" + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; } @Override public boolean checkRetryTimes() { - return checkRetryTimes(sessionServerConfig.getReNewDatumTaskRetryTimes()); + return checkRetryTimes(sessionServerConfig.getRenewDatumTaskRetryTimes()); } } \ No newline at end of file From a3ca08adf369e5523470660f5da98d9e16bb4e77 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 27 Jun 2019 14:51:24 +0800 Subject: [PATCH 044/161] fix blacklist test case --- .../test/resource/meta/BlacklistTest.java | 144 +++++++++--------- 1 file changed, 75 insertions(+), 69 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java index df7dbbe90..9d22878bd 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java @@ -117,6 +117,9 @@ public void testBlacklistUpdatePub() throws Exception { assertTrue(response.isSuccess()); + //wait for new list meta dispatch to session + Thread.sleep(1000L); + String dataId = "test-dataId-blacklist"; String value = "test blacklist"; @@ -156,75 +159,78 @@ public void testBlacklistUpdatePub() throws Exception { } - //@Test - //public void testBlacklistUpdateSub() throws Exception { - // - // Map>> map = new HashMap<>(); - // Set set1 = new HashSet<>(); - // Set set2 = new HashSet<>(); - // String local = NetUtil.getLocalAddress().getHostAddress(); - // set1.add(local); - // set2.add(local); - // - // Map> map1 = Maps.newHashMap(); - // map1.put(BlacklistConstants.IP_FULL, set1); - // - // Map> map2 = Maps.newHashMap(); - // map2.put(BlacklistConstants.IP_FULL, set2); - // - // map.put(BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX, map2); - // - // ObjectMapper mapper = new ObjectMapper(); - // - // Result response = metaChannel - // .getWebTarget() - // .path("blacklist/update") - // .request() - // .post(Entity.entity(mapper.writeValueAsString(map), MediaType.APPLICATION_JSON), - // Result.class); - // - // assertTrue(response.isSuccess()); - // - // String dataId = "test-dataId-blacklist2"; - // String value = "test blacklist2"; - // - // PublisherRegistration registration = new PublisherRegistration(dataId); - // registryClient1.register(registration, value); - // Thread.sleep(500L); - // - // SubscriberRegistration subReg = new SubscriberRegistration(dataId, - // new MySubscriberDataObserver()); - // subReg.setScopeEnum(ScopeEnum.dataCenter); - // - // registryClient1.register(subReg); - // - // Thread.sleep(1000L); - // assertEquals(dataId, this.dataId); - // assertEquals(LOCAL_REGION, userData.getLocalZone()); - // - // Map> publisherMap = sessionChannel - // .getWebTarget() - // .path("digest/pub/data/query") - // .queryParam("dataInfoId", - // DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) - // .request(APPLICATION_JSON).get(new GenericType>>() { - // }); - // assertEquals(1, publisherMap.size()); - // assertEquals(1, publisherMap.get("PUB").size()); - // assertEquals(dataId, publisherMap.get("PUB").get(0).getDataId()); - // assertEquals(value, bytes2Object(publisherMap.get("PUB").get(0).getDataList().get(0) - // .getBytes())); - // - // Map> subscriberMap = sessionChannel - // .getWebTarget() - // .path("digest/sub/data/query") - // .queryParam("dataInfoId", - // DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) - // .request(APPLICATION_JSON).get(new GenericType>>() { - // }); - // assertEquals(0, subscriberMap.size()); - // - //} + @Test + public void testBlacklistUpdateSub() throws Exception { + + Map>> map = new HashMap<>(); + Set set1 = new HashSet<>(); + Set set2 = new HashSet<>(); + String local = NetUtil.getLocalAddress().getHostAddress(); + set1.add(local); + set2.add(local); + + Map> map1 = Maps.newHashMap(); + map1.put(BlacklistConstants.IP_FULL, set1); + + Map> map2 = Maps.newHashMap(); + map2.put(BlacklistConstants.IP_FULL, set2); + + map.put(BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX, map2); + + ObjectMapper mapper = new ObjectMapper(); + + Result response = metaChannel + .getWebTarget() + .path("blacklist/update") + .request() + .post(Entity.entity(mapper.writeValueAsString(map), MediaType.APPLICATION_JSON), + Result.class); + + assertTrue(response.isSuccess()); + + //wait for new list meta dispatch to session + Thread.sleep(1000L); + + String dataId = "test-dataId-blacklist2"; + String value = "test blacklist2"; + + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + Thread.sleep(500L); + + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + + registryClient1.register(subReg); + + Thread.sleep(1000L); + assertEquals(dataId, this.dataId); + assertEquals(LOCAL_REGION, userData.getLocalZone()); + + Map> publisherMap = sessionChannel + .getWebTarget() + .path("digest/pub/data/query") + .queryParam("dataInfoId", + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + .request(APPLICATION_JSON).get(new GenericType>>() { + }); + assertEquals(1, publisherMap.size()); + assertEquals(1, publisherMap.get("PUB").size()); + assertEquals(dataId, publisherMap.get("PUB").get(0).getDataId()); + assertEquals(value, bytes2Object(publisherMap.get("PUB").get(0).getDataList().get(0) + .getBytes())); + + Map> subscriberMap = sessionChannel + .getWebTarget() + .path("digest/sub/data/query") + .queryParam("dataInfoId", + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)) + .request(APPLICATION_JSON).get(new GenericType>>() { + }); + assertEquals(0, subscriberMap.size()); + + } @AfterClass public static void afterClass() { From 20b34432df8613afce6688e861fdfebfe4493d16 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 27 Jun 2019 15:27:58 +0800 Subject: [PATCH 045/161] rename: unpub -> unPub --- .../registry/common/model/store/StoreData.java | 2 +- .../sofa/registry/task/listener/TaskEvent.java | 4 ++-- .../server/data/cache/UnPublisher.java | 2 +- .../change/event/DataChangeEventQueue.java | 10 +++++----- .../session/acceptor/WriteDataProcessor.java | 2 +- .../session/bootstrap/SessionServerConfig.java | 2 +- .../bootstrap/SessionServerConfigBean.java | 18 +++++++++--------- .../bootstrap/SessionServerConfiguration.java | 6 +++--- ...ner.java => UnPublishDataTaskListener.java} | 8 ++++---- .../session/registry/SessionRegistry.java | 10 +++++----- ...ishDataTask.java => UnPublishDataTask.java} | 18 +++++++++--------- 11 files changed, 41 insertions(+), 41 deletions(-) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/{UnpublishDataTaskListener.java => UnPublishDataTaskListener.java} (91%) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/{UnpublishDataTask.java => UnPublishDataTask.java} (78%) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/StoreData.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/StoreData.java index 1ec2d9a66..5746a45f8 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/StoreData.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/StoreData.java @@ -27,7 +27,7 @@ public interface StoreData { * DataType enum */ enum DataType { - SUBSCRIBER, PUBLISHER, WATCHER, UNPUBLISHER + SUBSCRIBER, PUBLISHER, WATCHER, UN_PUBLISHER } /** diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index ea38f6a10..62d574ab2 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -45,8 +45,8 @@ public enum TaskType { "SessionRegisterDataTask"), PROVIDE_DATA_CHANGE_FETCH_TASK( "ProvideDataChangeFetchTask"), SUBSCRIBER_MULTI_FETCH_TASK( "SubscriberMultiFetchTask"), PUBLISH_DATA_TASK( - "PublishDataTask"), UNPUBLISH_DATA_TASK( - "UnpublishDataTask"), RENEW_DATUM_TASK( + "PublishDataTask"), UN_PUBLISH_DATA_TASK( + "UnPublishDataTask"), RENEW_DATUM_TASK( "RenewDatumTask"), DATUM_SNAPSHOT_TASK( "DatumSnapshotTask"), diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/UnPublisher.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/UnPublisher.java index 5db5d80b9..1f3488dc8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/UnPublisher.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/UnPublisher.java @@ -45,6 +45,6 @@ public UnPublisher(String dataInfoId, String registerId, long registerTimeStamp) @Override public DataType getDataType() { - return DataType.UNPUBLISHER; + return DataType.UN_PUBLISHER; } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index f1d886d77..bf1b2a187 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -295,7 +295,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { Map pubMap = datumCache.getByConnectId(connectId); LOGGER.info("[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", getName(), connectId, pubMap != null ? pubMap.size() : null, snapshotPubMap.size()); - int unpubSize = 0; + int unPubSize = 0; if (pubMap != null) { for (Publisher publisher : pubMap.values()) { // Only care dataInfoIds which belong to this queue @@ -309,7 +309,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { continue; } - //If snapshot.pubMap does not contain this pub: then build the reverse operation as unpub + //If snapshot.pubMap does not contain this pub: then build the reverse operation as unPub if (!snapshotPubMap.containsKey(publisher.getRegisterId())) { long currentTimeStamp = System.currentTimeMillis(); Datum datum = new Datum(new UnPublisher(publisher.getDataInfoId(), @@ -317,7 +317,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { currentTimeStamp); datum.setContainsUnPub(true); handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); - unpubSize++; + unPubSize++; } } } @@ -327,8 +327,8 @@ private void handleSnapshot(DatumSnapshotEvent event) { handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); } LOGGER.info( - "[{}] snapshot handle, connectId={}, handle unpubSize={}, handle pubSize={}", - getName(), connectId, unpubSize, snapshotPubMap.size()); + "[{}] snapshot handle, connectId={}, handle unPubSize={}, handle pubSize={}", + getName(), connectId, unPubSize, snapshotPubMap.size()); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 79d55972b..7f9bab471 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -214,7 +214,7 @@ private void doUnPublishAsync(WriteDataRequest request) { } Publisher unPublisher = (Publisher) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(unPublisher, TaskType.UNPUBLISH_DATA_TASK); + TaskEvent taskEvent = new TaskEvent(unPublisher, TaskType.UN_PUBLISH_DATA_TASK); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 81e9b9be2..c76db45cf 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -69,7 +69,7 @@ public interface SessionServerConfig { int getPublishDataTaskRetryTimes(); - int getUnpublishDataTaskRetryTimes(); + int getUnPublishDataTaskRetryTimes(); int getDatumSnapshotTaskRetryTimes(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 49f13eef9..e9181e18e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -82,7 +82,7 @@ public class SessionServerConfigBean implements SessionServerConfig { private int publishDataTaskRetryTimes = 3; - private int unpublishDataTaskRetryTimes = 3; + private int unPublishDataTaskRetryTimes = 3; private int datumSnapshotTaskRetryTimes = 3; @@ -233,22 +233,22 @@ public void setPublishDataTaskRetryTimes(int publishDataTaskRetryTimes) { } /** - * Getter method for property unpublishDataTaskRetryTimes. + * Getter method for property unPublishDataTaskRetryTimes. * - * @return property value of unpublishDataTaskRetryTimes + * @return property value of unPublishDataTaskRetryTimes */ @Override - public int getUnpublishDataTaskRetryTimes() { - return unpublishDataTaskRetryTimes; + public int getUnPublishDataTaskRetryTimes() { + return unPublishDataTaskRetryTimes; } /** - * Setter method for property unpublishDataTaskRetryTimes . + * Setter method for property unPublishDataTaskRetryTimes . * - * @param unpublishDataTaskRetryTimes value to be assigned to property unpublishDataTaskRetryTimes + * @param unPublishDataTaskRetryTimes value to be assigned to property unPublishDataTaskRetryTimes */ - public void setUnpublishDataTaskRetryTimes(int unpublishDataTaskRetryTimes) { - this.unpublishDataTaskRetryTimes = unpublishDataTaskRetryTimes; + public void setUnPublishDataTaskRetryTimes(int unPublishDataTaskRetryTimes) { + this.unPublishDataTaskRetryTimes = unPublishDataTaskRetryTimes; } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 4ffcd0405..c48ed261b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -50,7 +50,7 @@ import com.alipay.sofa.registry.server.session.listener.SessionRegisterDataTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberMultiFetchTaskListener; import com.alipay.sofa.registry.server.session.listener.SubscriberRegisterFetchTaskListener; -import com.alipay.sofa.registry.server.session.listener.UnpublishDataTaskListener; +import com.alipay.sofa.registry.server.session.listener.UnPublishDataTaskListener; import com.alipay.sofa.registry.server.session.listener.WatcherRegisterFetchTaskListener; import com.alipay.sofa.registry.server.session.node.DataNodeManager; import com.alipay.sofa.registry.server.session.node.MetaNodeManager; @@ -530,8 +530,8 @@ public TaskListener renewDatumTaskListener(TaskListenerManager taskListenerManag } @Bean - public TaskListener unpublishDataTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new UnpublishDataTaskListener(); + public TaskListener unPublishDataTaskListener(TaskListenerManager taskListenerManager) { + TaskListener taskListener = new UnPublishDataTaskListener(); taskListenerManager.addTaskListener(taskListener); return taskListener; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java similarity index 91% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java index 8054b61e6..781d977c7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnpublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java @@ -37,9 +37,9 @@ /** * * @author kezhu.wukz - * @version $Id: UnpublishDataTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ + * @version $Id: UnPublishDataTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ */ -public class UnpublishDataTaskListener implements TaskListener { +public class UnPublishDataTaskListener implements TaskListener { /** * store subscribers @@ -73,13 +73,13 @@ public class UnpublishDataTaskListener implements TaskListener { @PostConstruct public void init() { singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.UNPUBLISH_DATA_TASK.getName()), 100000, 32, + TaskDispatchers.getDispatcherName(TaskType.UN_PUBLISH_DATA_TASK.getName()), 100000, 32, 1000, 1000, dataNodeSingleTaskProcessor); } @Override public boolean support(TaskEvent event) { - return TaskType.UNPUBLISH_DATA_TASK.equals(event.getTaskType()); + return TaskType.UN_PUBLISH_DATA_TASK.equals(event.getTaskType()); } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 4bdf3dd59..b731c3ef2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -124,7 +124,7 @@ public void register(StoreData storeData) { sessionDataStore.add(publisher); - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override @@ -176,7 +176,7 @@ public void unRegister(StoreData storeData) { // dataNodeService.unregister(publisher); - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override @@ -229,7 +229,7 @@ public void cancel(List connectIds) { sessionWatchers.deleteByConnectId(connectId); } - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor for (String connectId : connectIdsWithPub) { writeDataAcceptor.accept(new WriteDataRequest() { @@ -335,7 +335,7 @@ public void renewDatum(String connectId) { List renewDatumRequests = renewService.getRenewDatumRequests(connectId); if (renewDatumRequests != null) { for (RenewDatumRequest renewDatumRequest : renewDatumRequests) { - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override @@ -363,7 +363,7 @@ public void sendDatumSnapshot(String connectId) { RENEW_LOGGER.debug("sendDatumSnapshot: connectId={}", connectId); } - // All write operations to DataServer (pub/unpub/clientoff/renew/snapshot) + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor writeDataAcceptor.accept(new WriteDataRequest() { @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java similarity index 78% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java index 52883467a..ab4814eae 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnpublishDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java @@ -24,17 +24,17 @@ /** * * @author kezhu.wukz - * @version $Id: UnpublishDataTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ + * @version $Id: UnPublishDataTask.java, v 0.1 2019-06-14 12:15 kezhu.wukz Exp $ */ -public class UnpublishDataTask extends AbstractSessionTask { +public class UnPublishDataTask extends AbstractSessionTask { private final DataNodeService dataNodeService; private final SessionServerConfig sessionServerConfig; - private Publisher unpublisher; + private Publisher unPublisher; - public UnpublishDataTask(SessionServerConfig sessionServerConfig, + public UnPublishDataTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService) { this.sessionServerConfig = sessionServerConfig; this.dataNodeService = dataNodeService; @@ -42,7 +42,7 @@ public UnpublishDataTask(SessionServerConfig sessionServerConfig, @Override public void execute() { - dataNodeService.unregister(unpublisher); + dataNodeService.unregister(unPublisher); } @Override @@ -54,7 +54,7 @@ public void setTaskEvent(TaskEvent taskEvent) { Object obj = taskEvent.getEventObj(); if (obj instanceof Publisher) { - this.unpublisher = (Publisher) obj; + this.unPublisher = (Publisher) obj; } else { throw new IllegalArgumentException("Input task event object error!"); } @@ -62,13 +62,13 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "UNPUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", unpublisher=" - + unpublisher + ", retry='" + sessionServerConfig.getUnpublishDataTaskRetryTimes() + return "UN_PUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", unPublisher=" + + unPublisher + ", retry='" + sessionServerConfig.getUnPublishDataTaskRetryTimes() + '\'' + '}'; } @Override public boolean checkRetryTimes() { - return checkRetryTimes(sessionServerConfig.getUnpublishDataTaskRetryTimes()); + return checkRetryTimes(sessionServerConfig.getUnPublishDataTaskRetryTimes()); } } \ No newline at end of file From 9b25c0b491740f3ea25cfde33b9783cec9169645 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 27 Jun 2019 20:48:13 +0800 Subject: [PATCH 046/161] add threadSize and queueSize limit --- .../registry/task/listener/TaskEvent.java | 6 +- .../registry/timer/AsyncHashedWheelTimer.java | 22 +-- .../timer/AsyncHashedWheelTimerTest.java | 12 +- .../data/bootstrap/DataServerConfig.java | 125 +++++++++++++++--- .../change/notify/SessionServerNotifier.java | 33 +++-- .../server/data/renew/DatumLeaseManager.java | 22 ++- .../src/main/resources/application.properties | 2 + .../session/acceptor/WriteDataProcessor.java | 23 +++- .../bootstrap/SessionServerConfig.java | 10 ++ .../bootstrap/SessionServerConfigBean.java | 104 +++++++++++++++ .../bootstrap/SessionServerConfiguration.java | 29 ++-- .../ReceivedDataMultiPushTaskListener.java | 13 +- .../node/service/DataNodeServiceImpl.java | 11 +- .../task/ReceivedDataMultiPushTask.java | 46 ++++--- 14 files changed, 357 insertions(+), 101 deletions(-) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index 62d574ab2..d081446b9 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -46,9 +46,9 @@ public enum TaskType { "ProvideDataChangeFetchTask"), SUBSCRIBER_MULTI_FETCH_TASK( "SubscriberMultiFetchTask"), PUBLISH_DATA_TASK( "PublishDataTask"), UN_PUBLISH_DATA_TASK( - "UnPublishDataTask"), RENEW_DATUM_TASK( - "RenewDatumTask"), DATUM_SNAPSHOT_TASK( - "DatumSnapshotTask"), + "UnPublishDataTask"), RENEW_DATUM_TASK( + "RenewDatumTask"), DATUM_SNAPSHOT_TASK( + "DatumSnapshotTask"), //Session Adapter task USER_DATA_ELEMENT_PUSH_TASK("UserDataElementPushTask"), USER_DATA_ELEMENT_MULTI_PUSH_TASK( diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java index 15174664a..b3f5949dd 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java @@ -17,8 +17,8 @@ package com.alipay.sofa.registry.timer; import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -30,7 +30,7 @@ /** * based on HashedWheelTimer, add function: exec TimerTask async * - * @author kezhu.wukz + * @author kezhu.wukz * @version $Id: AsyncHashedWheelTimer.java, v 0.1 2019-01-11 10:54 AM kezhu.wukz Exp $ */ public class AsyncHashedWheelTimer extends HashedWheelTimer { @@ -41,19 +41,25 @@ public class AsyncHashedWheelTimer extends HashedWheelTimer { private final TaskFailedCallback taskFailedCallback; /** - * * @param threadFactory * @param tickDuration * @param unit * @param ticksPerWheel + * @param threadSize + * @param queueSize * @param asyncThreadFactory */ public AsyncHashedWheelTimer(ThreadFactory threadFactory, long tickDuration, TimeUnit unit, - int ticksPerWheel, ThreadFactory asyncThreadFactory, + int ticksPerWheel, int threadSize, int queueSize, + ThreadFactory asyncThreadFactory, TaskFailedCallback taskFailedCallback) { - this(threadFactory, tickDuration, unit, ticksPerWheel, - new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, - new SynchronousQueue<>(), asyncThreadFactory), taskFailedCallback); + super(threadFactory, tickDuration, unit, ticksPerWheel); + + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(threadSize, threadSize, + 300L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(queueSize), asyncThreadFactory); + threadPoolExecutor.allowCoreThreadTimeOut(true); + this.executor = threadPoolExecutor; + this.taskFailedCallback = taskFailedCallback; } /** @@ -100,7 +106,7 @@ public AsyncTimerTask(TimerTask timerTask) { /** */ @Override - public void run(Timeout timeout) throws Exception { + public void run(Timeout timeout) { this.timeout = timeout; try { AsyncHashedWheelTimer.this.executor.execute(this); diff --git a/server/common/util/src/test/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimerTest.java b/server/common/util/src/test/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimerTest.java index 11b63f53b..dbabd7faf 100644 --- a/server/common/util/src/test/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimerTest.java +++ b/server/common/util/src/test/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimerTest.java @@ -16,13 +16,15 @@ */ package com.alipay.sofa.registry.timer; -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import io.netty.util.Timer; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + import org.junit.Assert; import org.junit.Test; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; +import com.google.common.util.concurrent.ThreadFactoryBuilder; + +import io.netty.util.Timer; /** * @author xuanbei @@ -40,7 +42,7 @@ public void doTest() throws InterruptedException { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); final Timer timer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "AsyncHashedWheelTimerTest").build(), 50, TimeUnit.MILLISECONDS, 10, + "AsyncHashedWheelTimerTest").build(), 50, TimeUnit.MILLISECONDS, 10, 5, 10, threadFactoryBuilder.setNameFormat("Registry-DataNodeServiceImpl-WheelExecutor-%d") .build(), new AsyncHashedWheelTimer.TaskFailedCallback() { @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index cbafd4127..efc4e637e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -35,10 +35,11 @@ @ConfigurationProperties(prefix = DataServerConfig.PRE_FIX) public class DataServerConfig { - public static final String PRE_FIX = "data.server"; + public static final String PRE_FIX = "data.server"; - public static final String IP = NetUtil.getLocalAddress() - .getHostAddress(); + public static final String IP = NetUtil + .getLocalAddress() + .getHostAddress(); private int port; @@ -62,43 +63,51 @@ public class DataServerConfig { private CommonConfig commonConfig; - private Set metaIps = null; + private Set metaIps = null; - private int storeNodes = 3; + private int storeNodes = 3; - private int numberOfReplicas = 1000; + private int numberOfReplicas = 1000; - private long localDataServerCleanDelay = 1000 * 60 * 30; + private long localDataServerCleanDelay = 1000 * 60 * 30; - private int getDataExecutorMinPoolSize = 80; + private int getDataExecutorMinPoolSize = 80; - private int getDataExecutorMaxPoolSize = 400; + private int getDataExecutorMaxPoolSize = 400; - private int getDataExecutorQueueSize = 10000; + private int getDataExecutorQueueSize = 10000; - private long getDataExecutorKeepAliveTime = 60; + private long getDataExecutorKeepAliveTime = 60; - private int notifyDataSyncExecutorMinPoolSize = 80; + private int notifyDataSyncExecutorMinPoolSize = 80; - private int notifyDataSyncExecutorMaxPoolSize = 400; + private int notifyDataSyncExecutorMaxPoolSize = 400; - private int notifyDataSyncExecutorQueueSize = 700; + private int notifyDataSyncExecutorQueueSize = 700; - private long notifyDataSyncExecutorKeepAliveTime = 60; + private long notifyDataSyncExecutorKeepAliveTime = 60; - private long notifySessionRetryFirstDelay = 1000; + private long notifySessionRetryFirstDelay = 1000; - private long notifySessionRetryIncrementDelay = 1000; + private long notifySessionRetryIncrementDelay = 1000; - private int notifySessionRetryTimes = 10; + private int notifySessionRetryTimes = 10; - private int publishExecutorMinPoolSize = 80; + private int publishExecutorMinPoolSize = 80; - private int publishExecutorMaxPoolSize = 400; + private int publishExecutorMaxPoolSize = 400; - private int publishExecutorQueueSize = 10000; + private int publishExecutorQueueSize = 10000; - private int datumTimeToLiveSec = 120; + private int datumTimeToLiveSec = 300; + + private int datumLeaseManagerExecutorThreadSize = 1; + + private int datumLeaseManagerExecutorQueueSize = 1000000; + + private int sessionServerNotifierRetryExecutorThreadSize = 10; + + private int sessionServerNotifierRetryExecutorQueueSize = 1000000; /** * constructor @@ -640,4 +649,76 @@ public int getDatumTimeToLiveSec() { public void setDatumTimeToLiveSec(int datumTimeToLiveSec) { this.datumTimeToLiveSec = datumTimeToLiveSec; } + + /** + * Getter method for property datumLeaseManagerExecutorQueueSize. + * + * @return property value of datumLeaseManagerExecutorQueueSize + */ + public int getDatumLeaseManagerExecutorQueueSize() { + return datumLeaseManagerExecutorQueueSize; + } + + /** + * Setter method for property datumLeaseManagerExecutorQueueSize . + * + * @param datumLeaseManagerExecutorQueueSize value to be assigned to property datumLeaseManagerExecutorQueueSize + */ + public void setDatumLeaseManagerExecutorQueueSize(int datumLeaseManagerExecutorQueueSize) { + this.datumLeaseManagerExecutorQueueSize = datumLeaseManagerExecutorQueueSize; + } + + /** + * Getter method for property datumLeaseManagerExecutorThreadSize. + * + * @return property value of datumLeaseManagerExecutorThreadSize + */ + public int getDatumLeaseManagerExecutorThreadSize() { + return datumLeaseManagerExecutorThreadSize; + } + + /** + * Setter method for property datumLeaseManagerExecutorThreadSize . + * + * @param datumLeaseManagerExecutorThreadSize value to be assigned to property datumLeaseManagerExecutorThreadSize + */ + public void setDatumLeaseManagerExecutorThreadSize(int datumLeaseManagerExecutorThreadSize) { + this.datumLeaseManagerExecutorThreadSize = datumLeaseManagerExecutorThreadSize; + } + + /** + * Getter method for property sessionServerNotifierRetryExecutorThreadSize. + * + * @return property value of sessionServerNotifierRetryExecutorThreadSize + */ + public int getSessionServerNotifierRetryExecutorThreadSize() { + return sessionServerNotifierRetryExecutorThreadSize; + } + + /** + * Setter method for property sessionServerNotifierRetryExecutorThreadSize . + * + * @param sessionServerNotifierRetryExecutorThreadSize value to be assigned to property sessionServerNotifierRetryExecutorThreadSize + */ + public void setSessionServerNotifierRetryExecutorThreadSize(int sessionServerNotifierRetryExecutorThreadSize) { + this.sessionServerNotifierRetryExecutorThreadSize = sessionServerNotifierRetryExecutorThreadSize; + } + + /** + * Getter method for property sessionServerNotifierRetryExecutorQueueSize. + * + * @return property value of sessionServerNotifierRetryExecutorQueueSize + */ + public int getSessionServerNotifierRetryExecutorQueueSize() { + return sessionServerNotifierRetryExecutorQueueSize; + } + + /** + * Setter method for property sessionServerNotifierRetryExecutorQueueSize . + * + * @param sessionServerNotifierRetryExecutorQueueSize value to be assigned to property sessionServerNotifierRetryExecutorQueueSize + */ + public void setSessionServerNotifierRetryExecutorQueueSize(int sessionServerNotifierRetryExecutorQueueSize) { + this.sessionServerNotifierRetryExecutorQueueSize = sessionServerNotifierRetryExecutorQueueSize; + } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index 199815013..aa0764e96 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -21,6 +21,8 @@ import java.util.Set; import java.util.concurrent.TimeUnit; +import javax.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Autowired; import com.alipay.remoting.Connection; @@ -55,7 +57,7 @@ public class SessionServerNotifier implements IDataChangeNotifier { private AsyncHashedWheelTimer asyncHashedWheelTimer; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private Exchange boltExchange; @@ -66,13 +68,16 @@ public class SessionServerNotifier implements IDataChangeNotifier { @Autowired private DatumCache datumCache; - public SessionServerNotifier() { + @PostConstruct + public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); asyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( "Registry-SessionServerNotifier-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, - threadFactoryBuilder.setNameFormat("Registry-SessionServerNotifier-WheelExecutor-%d") - .build(), new TaskFailedCallback() { + dataServerConfig.getSessionServerNotifierRetryExecutorThreadSize(), + dataServerConfig.getSessionServerNotifierRetryExecutorQueueSize(), threadFactoryBuilder + .setNameFormat("Registry-SessionServerNotifier-WheelExecutor-%d").build(), + new TaskFailedCallback() { @Override public void executionRejected(Throwable e) { LOGGER.error("executionRejected: " + e.getMessage(), e); @@ -113,17 +118,17 @@ private void doNotify(NotifyCallback notifyCallback) { LOGGER .info(String .format( - "connection from sessionserver(%s) is not fine, so ignore notify, retryTimes=%s,request=%s", + "connection from sessionServer(%s) is not fine, so ignore notify, retryTimes=%s,request=%s", connection.getRemoteAddress(), notifyCallback.retryTimes, request)); } return; } - Server sessionServer = boltExchange.getServer(dataServerBootstrapConfig.getPort()); + Server sessionServer = boltExchange.getServer(dataServerConfig.getPort()); sessionServer.sendCallback(sessionServer.getChannel(connection.getRemoteAddress()), - request, notifyCallback, dataServerBootstrapConfig.getRpcTimeout()); + request, notifyCallback, dataServerConfig.getRpcTimeout()); } catch (Exception e) { LOGGER.error(String.format( - "invokeWithCallback failed: sessionserver(%s),retryTimes=%s, request=%s", + "invokeWithCallback failed: sessionServer(%s),retryTimes=%s, request=%s", connection.getRemoteAddress(), notifyCallback.retryTimes, request), e); onFailed(notifyCallback); } @@ -137,10 +142,10 @@ private void onFailed(NotifyCallback notifyCallback) { Connection connection = notifyCallback.connection; notifyCallback.retryTimes++; - if (notifyCallback.retryTimes <= dataServerBootstrapConfig.getNotifySessionRetryTimes()) { + if (notifyCallback.retryTimes <= dataServerConfig.getNotifySessionRetryTimes()) { this.asyncHashedWheelTimer.newTimeout(timeout -> { if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("retrying notify sessionserver(%s), retryTimes=%s, request=%s", + LOGGER.info(String.format("retrying notify sessionServer(%s), retryTimes=%s, request=%s", connection.getRemoteAddress(), notifyCallback.retryTimes, request)); } //check version, if it's fall behind, stop retry @@ -163,9 +168,9 @@ private void onFailed(NotifyCallback notifyCallback) { } private long getDelayTimeForRetry(int retryTimes) { - long initialSleepTime = TimeUnit.MILLISECONDS.toMillis(dataServerBootstrapConfig + long initialSleepTime = TimeUnit.MILLISECONDS.toMillis(dataServerConfig .getNotifySessionRetryFirstDelay()); - long increment = TimeUnit.MILLISECONDS.toMillis(dataServerBootstrapConfig + long increment = TimeUnit.MILLISECONDS.toMillis(dataServerConfig .getNotifySessionRetryIncrementDelay()); long result = initialSleepTime + (increment * (retryTimes - 1)); return result >= 0L ? result : 0L; @@ -189,7 +194,7 @@ public void onCallback(Channel channel, Object message) { LOGGER .error(String .format( - "response not success when notify sessionserver(%s), retryTimes=%s, request=%s, response=%s", + "response not success when notify sessionServer(%s), retryTimes=%s, request=%s, response=%s", connection.getRemoteAddress(), retryTimes, request, result)); onFailed(this); } @@ -198,7 +203,7 @@ public void onCallback(Channel channel, Object message) { @Override public void onException(Channel channel, Throwable e) { LOGGER.error(String.format( - "exception when notify sessionserver(%s), retryTimes=%s, request=%s", + "exception when notify sessionServer(%s), retryTimes=%s, request=%s", connection.getRemoteAddress(), retryTimes, request), e); onFailed(this); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index d75338d8d..08dd318c2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -19,10 +19,10 @@ import java.util.Map; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import javax.annotation.PostConstruct; + import org.apache.commons.lang.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -34,7 +34,6 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; -import com.alipay.sofa.registry.util.NamedThreadFactory; import com.google.common.util.concurrent.ThreadFactoryBuilder; /** @@ -58,9 +57,7 @@ public class DatumLeaseManager { /** lock for connectId , format: connectId -> true */ private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); - private final AsyncHashedWheelTimer datumAsyncHashedWheelTimer; - - private final ThreadPoolExecutor datumExpiredCheckExecutor; + private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; @Autowired private DataServerConfig dataServerConfig; @@ -71,15 +68,16 @@ public class DatumLeaseManager { /** * constructor */ - public DatumLeaseManager() { - datumExpiredCheckExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, - new LinkedBlockingQueue<>(), new NamedThreadFactory( - "Scheduler-DatumExpiredCheckExecutor")); + @PostConstruct + public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "Scheduler-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, - datumExpiredCheckExecutor, new TaskFailedCallback() { + "Registry-DatumLeaseManager-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, + dataServerConfig.getDatumLeaseManagerExecutorThreadSize(), + dataServerConfig.getDatumLeaseManagerExecutorQueueSize(), threadFactoryBuilder + .setNameFormat("Registry-DatumLeaseManager-WheelExecutor-%d").build(), + new TaskFailedCallback() { @Override public void executionRejected(Throwable e) { LOGGER.error("executionRejected: " + e.getMessage(), e); diff --git a/server/server/integration/src/main/resources/application.properties b/server/server/integration/src/main/resources/application.properties index e5b9f95bb..a99778c10 100644 --- a/server/server/integration/src/main/resources/application.properties +++ b/server/server/integration/src/main/resources/application.properties @@ -25,6 +25,7 @@ data.server.rpcTimeout=3000 data.server.metaServerPort=9611 data.server.storeNodes=3 data.server.numberOfReplicas=1000 +data.server.datumTimeToLiveSec=20 #session.server.logging.level=INFO #session.server.logging.home=/home/admin/logs/registry/session @@ -48,6 +49,7 @@ session.server.schedulerHeartbeatExpBackOffBound=10 session.server.schedulerFetchDataTimeout=3 session.server.schedulerFetchDataFirstDelay=3 session.server.schedulerFetchDataExpBackOffBound=10 +session.server.renewAndSnapshotSilentPeriodSec=20 #session.server.invalidForeverZones=; #session.server.invalidIgnoreDataidRegex= #session.server.pushEmptyDataDataIdPrefixes= \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 7f9bab471..9a073e6bb 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; @@ -67,6 +68,8 @@ public class WriteDataProcessor { private ConcurrentLinkedQueue acceptorQueue = new ConcurrentLinkedQueue(); + private AtomicInteger acceptorQueueSize = new AtomicInteger(0); + public WriteDataProcessor(String connectId, TaskListenerManager taskListenerManager, SessionServerConfig sessionServerConfig, RenewService renewService) { this.connectId = connectId; @@ -100,22 +103,39 @@ public void process(WriteDataRequest request) { request.getRequestType(), request.getRequestBody()); } if (request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT) { + // snapshot has high priority, so handle directly doHandle(request); } else { + // If locked, insert the queue; + // otherwise, try emptying the queue (to avoid residue) before processing the request. if (writeDataLock.get()) { - acceptorQueue.add(request); + addQueue(request); } else { flushQueue(); doHandle(request); } } + // record the last update time if (isWriteRequest(request)) { refreshUpdateTime(); } } + private void addQueue(WriteDataRequest request) { + if (acceptorQueueSize.incrementAndGet() <= sessionServerConfig + .getWriteDataAcceptorQueueSize()) { + acceptorQueue.add(request); + } else { + RENEW_LOGGER + .error( + "acceptorQueueSize({}) reached the limit : connectId={}, requestType={}, requestBody={}", + acceptorQueue.size(), connectId, request.getRequestType(), + request.getRequestBody()); + } + } + /** * * @param request @@ -138,6 +158,7 @@ private void flushQueue() { if (writeDataRequest == null) { break; } + acceptorQueueSize.decrementAndGet(); doHandle(writeDataRequest); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index c76db45cf..52640a815 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -131,6 +131,10 @@ public interface SessionServerConfig { int getUserDataPushRetryWheelTicksDuration(); + int getUserDataPushRetryExecutorQueueSize(); + + int getUserDataPushRetryExecutorThreadSize(); + int getPushDataTaskRetryFirstDelay(); long getPushDataTaskRetryIncrementDelay(); @@ -156,4 +160,10 @@ public interface SessionServerConfig { boolean isInvalidIgnored(String dataId); int getRenewAndSnapshotSilentPeriodSec(); + + int getWriteDataAcceptorQueueSize(); + + int getClientOffRetryExecutorQueueSize(); + + int getClientOffRetryExecutorThreadSize(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index e9181e18e..29e16dcda 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -148,6 +148,10 @@ public class SessionServerConfigBean implements SessionServerConfig { private int userDataPushRetryWheelTicksDuration = 100; + private int userDataPushRetryExecutorQueueSize = 1000000; + + private int userDataPushRetryExecutorThreadSize = 10; + private int renewDatumWheelTicksSize = 2048; private int renewDatumWheelTicksDuration = 500; @@ -183,6 +187,12 @@ public class SessionServerConfigBean implements SessionServerConfig { private int renewAndSnapshotSilentPeriodSec = 20; + private int writeDataAcceptorQueueSize = 10000; + + private int clientOffRetryExecutorQueueSize = 100000; + + private int clientOffRetryExecutorThreadSize = 100; + //end config for enterprise version private CommonConfig commonConfig; @@ -195,6 +205,100 @@ public SessionServerConfigBean(CommonConfig commonConfig) { this.commonConfig = commonConfig; } + /** + * Getter method for property userDataPushRetryExecutorQueueSize. + * + * @return property value of userDataPushRetryExecutorQueueSize + */ + @Override + public int getUserDataPushRetryExecutorQueueSize() { + return userDataPushRetryExecutorQueueSize; + } + + /** + * Setter method for property userDataPushRetryExecutorQueueSize . + * + * @param userDataPushRetryExecutorQueueSize value to be assigned to property userDataPushRetryExecutorQueueSize + */ + public void setUserDataPushRetryExecutorQueueSize(int userDataPushRetryExecutorQueueSize) { + this.userDataPushRetryExecutorQueueSize = userDataPushRetryExecutorQueueSize; + } + + /** + * Getter method for property userDataPushRetryExecutorThreadSize. + * + * @return property value of userDataPushRetryExecutorThreadSize + */ + @Override + public int getUserDataPushRetryExecutorThreadSize() { + return userDataPushRetryExecutorThreadSize; + } + + /** + * Setter method for property userDataPushRetryExecutorThreadSize . + * + * @param userDataPushRetryExecutorThreadSize value to be assigned to property userDataPushRetryExecutorThreadSize + */ + public void setUserDataPushRetryExecutorThreadSize(int userDataPushRetryExecutorThreadSize) { + this.userDataPushRetryExecutorThreadSize = userDataPushRetryExecutorThreadSize; + } + + /** + * Getter method for property clientOffRetryExecutorThreadSize. + * + * @return property value of clientOffRetryExecutorThreadSize + */ + @Override + public int getClientOffRetryExecutorThreadSize() { + return clientOffRetryExecutorThreadSize; + } + + /** + * Setter method for property clientOffRetryExecutorThreadSize . + * + * @param clientOffRetryExecutorThreadSize value to be assigned to property clientOffRetryExecutorThreadSize + */ + public void setClientOffRetryExecutorThreadSize(int clientOffRetryExecutorThreadSize) { + this.clientOffRetryExecutorThreadSize = clientOffRetryExecutorThreadSize; + } + + /** + * Getter method for property clientOffRetryExecutorQueueSize. + * + * @return property value of clientOffRetryExecutorQueueSize + */ + @Override + public int getClientOffRetryExecutorQueueSize() { + return clientOffRetryExecutorQueueSize; + } + + /** + * Setter method for property clientOffRetryExecutorQueueSize . + * + * @param clientOffRetryExecutorQueueSize value to be assigned to property clientOffRetryExecutorQueueSize + */ + public void setClientOffRetryExecutorQueueSize(int clientOffRetryExecutorQueueSize) { + this.clientOffRetryExecutorQueueSize = clientOffRetryExecutorQueueSize; + } + + /** + * Getter method for property writeDataAcceptorQueueSize. + * + * @return property value of writeDataAcceptorQueueSize + */ + public int getWriteDataAcceptorQueueSize() { + return writeDataAcceptorQueueSize; + } + + /** + * Setter method for property writeDataAcceptorQueueSize . + * + * @param writeDataAcceptorQueueSize value to be assigned to property writeDataAcceptorQueueSize + */ + public void setWriteDataAcceptorQueueSize(int writeDataAcceptorQueueSize) { + this.writeDataAcceptorQueueSize = writeDataAcceptorQueueSize; + } + /** * Getter method for property renewAndSnapshotSilentPeriodSec. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index c48ed261b..edf9ea59a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -430,35 +430,40 @@ public TaskProcessor consoleSyncSingleTaskProcessor() { @Bean public TaskListener subscriberRegisterFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SubscriberRegisterFetchTaskListener(dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SubscriberRegisterFetchTaskListener( + dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener subscriberMultiFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SubscriberMultiFetchTaskListener(dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SubscriberMultiFetchTaskListener( + dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener watcherRegisterFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new WatcherRegisterFetchTaskListener(metaNodeSingleTaskProcessor()); + TaskListener taskListener = new WatcherRegisterFetchTaskListener( + metaNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener provideDataChangeFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new ProvideDataChangeFetchTaskListener(metaNodeSingleTaskProcessor()); + TaskListener taskListener = new ProvideDataChangeFetchTaskListener( + metaNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener dataChangeFetchTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new DataChangeFetchTaskListener(dataNodeSingleTaskProcessor()); + TaskListener taskListener = new DataChangeFetchTaskListener( + dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -472,14 +477,16 @@ public TaskListener dataPushTaskListener(TaskListenerManager taskListenerManager @Bean public TaskListener dataChangeFetchCloudTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new DataChangeFetchCloudTaskListener(dataNodeSingleTaskProcessor()); + TaskListener taskListener = new DataChangeFetchCloudTaskListener( + dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener sessionRegisterDataTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new SessionRegisterDataTaskListener(dataNodeSingleTaskProcessor()); + TaskListener taskListener = new SessionRegisterDataTaskListener( + dataNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } @@ -488,15 +495,17 @@ public TaskListener sessionRegisterDataTaskListener(TaskListenerManager taskList public TaskListener receivedDataMultiPushTaskListener(TaskListenerManager taskListenerManager, TaskMergeProcessorStrategy receiveDataTaskMergeProcessorStrategy, SessionServerConfig sessionServerConfig) { - TaskListener taskListener = new ReceivedDataMultiPushTaskListener(clientNodeSingleTaskProcessor(), - receiveDataTaskMergeProcessorStrategy, sessionServerConfig); + TaskListener taskListener = new ReceivedDataMultiPushTaskListener( + clientNodeSingleTaskProcessor(), receiveDataTaskMergeProcessorStrategy, + sessionServerConfig); taskListenerManager.addTaskListener(taskListener); return taskListener; } @Bean public TaskListener receivedConfigDataPushTaskListener(TaskListenerManager taskListenerManager) { - TaskListener taskListener = new ReceivedConfigDataPushTaskListener(clientNodeSingleTaskProcessor()); + TaskListener taskListener = new ReceivedConfigDataPushTaskListener( + clientNodeSingleTaskProcessor()); taskListenerManager.addTaskListener(taskListener); return taskListener; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java index fa8e67694..c39c5b2db 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -35,9 +39,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.concurrent.TimeUnit; /** * @@ -80,7 +81,9 @@ public ReceivedDataMultiPushTaskListener(TaskProcessor clientNodeSingleTaskProce asyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( "Registry-ReceivedDataPushTask-WheelTimer").build(), sessionServerConfig.getUserDataPushRetryWheelTicksDuration(), TimeUnit.MILLISECONDS, - sessionServerConfig.getUserDataPushRetryWheelTicksSize(), threadFactoryBuilder + sessionServerConfig.getUserDataPushRetryWheelTicksSize(), + sessionServerConfig.getUserDataPushRetryExecutorThreadSize(), + sessionServerConfig.getUserDataPushRetryExecutorQueueSize(), threadFactoryBuilder .setNameFormat("Registry-ReceivedDataPushTask-WheelExecutor-%d").build(), new TaskFailedCallback() { @Override @@ -117,7 +120,7 @@ public void handleEvent(TaskEvent event) { public void executePushAsync(TaskEvent event) { SessionTask receivedDataMultiPushTask = new ReceivedDataMultiPushTask(sessionServerConfig, clientNodeService, - executorManager, boltExchange, receivedDataMultiPushTaskStrategy,asyncHashedWheelTimer); + executorManager, boltExchange, receivedDataMultiPushTaskStrategy, asyncHashedWheelTimer); receivedDataMultiPushTask.setTaskEvent(event); executorManager.getPushTaskExecutor() diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 43e123852..7be56acdd 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -23,6 +23,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import javax.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; @@ -72,12 +74,15 @@ public class DataNodeServiceImpl implements DataNodeService { private AsyncHashedWheelTimer asyncHashedWheelTimer; - public DataNodeServiceImpl() { + @PostConstruct + public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); asyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "Registry-DataNodeServiceImpl-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, - threadFactoryBuilder.setNameFormat("Registry-DataNodeServiceImpl-WheelExecutor-%d") + "Registry-DataNodeServiceImpl-ClientOffRetry-WheelTimer").build(), 100, + TimeUnit.MILLISECONDS, 1024, sessionServerConfig.getClientOffRetryExecutorThreadSize(), + sessionServerConfig.getClientOffRetryExecutorQueueSize(), threadFactoryBuilder + .setNameFormat("Registry-DataNodeServiceImpl-ClientOffRetry-WheelExecutor-%d") .build(), new TaskFailedCallback() { @Override public void executionRejected(Throwable e) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index 52328b44e..2463224ec 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + import com.alipay.sofa.registry.common.model.PushDataRetryRequest; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; @@ -37,12 +43,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - /** * * @author shangyu.wh @@ -156,36 +156,46 @@ private void retrySendReceiveData(PushDataRetryRequest pushDataRetryRequest) { if (channel != null && channel.isConnected()) { - asyncHashedWheelTimer.newTimeout(timeout -> { + asyncHashedWheelTimer.newTimeout(timeout -> { try { clientNodeService.pushWithCallback(infoPackage, targetUrl, new CallbackHandler() { @Override public void onCallback(Channel channel, Object message) { - LOGGER.info("Retry Push ReceivedData success! dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); + LOGGER.info( + "Retry Push ReceivedData success! dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl, getTaskId(), + dataPush, retryTimes); } @Override public void onException(Channel channel, Throwable exception) { - LOGGER.error("Retry Push ReceivedData callback error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", targetUrl, - receivedData.getDataId(), receivedData.getGroup(),getTaskId(),dataPush,retryTimes); + LOGGER.error( + "Retry Push ReceivedData callback error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", + targetUrl, receivedData.getDataId(), receivedData.getGroup(), getTaskId(), + dataPush, retryTimes); retrySendReceiveData(pushDataRetryRequest); } }); } catch (Exception e) { - LOGGER.error("Retry Push ReceivedData error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", targetUrl, - receivedData.getDataId(), receivedData.getGroup(),getTaskId(),dataPush,retryTimes); + LOGGER.error( + "Retry Push ReceivedData error! url:{}, dataId:{}, group:{},taskId:{},dataPush:{},retryTimes:{}", + targetUrl, receivedData.getDataId(), receivedData.getGroup(), getTaskId(), dataPush, + retryTimes); retrySendReceiveData(pushDataRetryRequest); } - },getBlockTime(retryTimes),TimeUnit.MILLISECONDS); + }, getBlockTime(retryTimes), TimeUnit.MILLISECONDS); } else { - LOGGER.error("Retry Push ReceivedData error, connect be null or disconnected,stop retry!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); + LOGGER.error( + "Retry Push ReceivedData error, connect be null or disconnected,stop retry!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl, getTaskId(), dataPush, + retryTimes); } } else { - LOGGER.error("Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); + LOGGER.error( + "Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", + receivedData.getDataId(), receivedData.getGroup(), targetUrl, getTaskId(), dataPush, + retryTimes); } } } From b9c2a634823c2c53bcac890ca2fdcdb10ade44c3 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 28 Jun 2019 20:10:32 +0800 Subject: [PATCH 047/161] bugfix: revert SessionRegistry --- .../session/registry/SessionRegistry.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index b731c3ef2..2678780b7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -49,6 +49,7 @@ import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.server.session.strategy.SessionRegistryStrategy; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; /** * @@ -91,6 +92,12 @@ public class SessionRegistry implements Registry { @Autowired private DataNodeService dataNodeService; + /** + * trigger task com.alipay.sofa.registry.server.meta.listener process + */ + @Autowired + private TaskListenerManager taskListenerManager; + /** * calculate data node url */ @@ -383,4 +390,31 @@ public String getConnectId() { }); } + /** + * Getter method for property sessionInterests. + * + * @return property value of sessionInterests + */ + protected Interests getSessionInterests() { + return sessionInterests; + } + + /** + * Getter method for property sessionDataStore. + * + * @return property value of sessionDataStore + */ + protected DataStore getSessionDataStore() { + return sessionDataStore; + } + + /** + * Getter method for property taskListenerManager. + * + * @return property value of taskListenerManager + */ + protected TaskListenerManager getTaskListenerManager() { + return taskListenerManager; + } + } \ No newline at end of file From ffa32610bb8c72ae9d5a2afc39d8f96bbb127032 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 1 Jul 2019 11:11:06 +0800 Subject: [PATCH 048/161] fix sub fetch retry all error,and reset datainfoid version --- .../ReceivedDataMultiPushTaskListener.java | 6 +++++- .../task/ReceivedDataMultiPushTask.java | 18 +++++++++++++++++- .../server/session/store/Interests.java | 8 ++++++++ .../server/session/store/SessionInterests.java | 4 ++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java index fa8e67694..ca5aa754f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java @@ -25,6 +25,7 @@ import com.alipay.sofa.registry.server.session.scheduler.task.PushTaskClosure; import com.alipay.sofa.registry.server.session.scheduler.task.ReceivedDataMultiPushTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; import com.alipay.sofa.registry.server.session.strategy.TaskMergeProcessorStrategy; import com.alipay.sofa.registry.task.TaskClosure; @@ -64,6 +65,9 @@ public class ReceivedDataMultiPushTaskListener implements TaskListener, PushTask @Autowired private ReceivedDataMultiPushTaskStrategy receivedDataMultiPushTaskStrategy; + @Autowired + private Interests sessionInterests; + private TaskMergeProcessorStrategy receiveDataTaskMergeProcessorStrategy; private TaskProcessor clientNodeSingleTaskProcessor; @@ -117,7 +121,7 @@ public void handleEvent(TaskEvent event) { public void executePushAsync(TaskEvent event) { SessionTask receivedDataMultiPushTask = new ReceivedDataMultiPushTask(sessionServerConfig, clientNodeService, - executorManager, boltExchange, receivedDataMultiPushTaskStrategy,asyncHashedWheelTimer); + executorManager, boltExchange, receivedDataMultiPushTaskStrategy,asyncHashedWheelTimer,sessionInterests); receivedDataMultiPushTask.setTaskEvent(event); executorManager.getPushTaskExecutor() diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index 52328b44e..1d2e8bdd1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.session.scheduler.task; import com.alipay.sofa.registry.common.model.PushDataRetryRequest; +import com.alipay.sofa.registry.common.model.store.DataInfo; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.core.model.DataBox; @@ -30,6 +31,7 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.ClientNodeService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; +import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; @@ -63,6 +65,7 @@ public class ReceivedDataMultiPushTask extends AbstractSessionTask implements Ta private Collection subscribers; private ReceivedDataMultiPushTaskStrategy receivedDataMultiPushTaskStrategy; private AsyncHashedWheelTimer asyncHashedWheelTimer; + private Interests sessionInterests; private String dataPush; @@ -71,13 +74,15 @@ public ReceivedDataMultiPushTask(SessionServerConfig sessionServerConfig, ExecutorManager executorManager, Exchange boltExchange, ReceivedDataMultiPushTaskStrategy receivedDataMultiPushTaskStrategy, - AsyncHashedWheelTimer asyncHashedWheelTimer) { + AsyncHashedWheelTimer asyncHashedWheelTimer, + Interests sessionInterests) { this.sessionServerConfig = sessionServerConfig; this.clientNodeService = clientNodeService; this.executorManager = executorManager; this.boltExchange = boltExchange; this.receivedDataMultiPushTaskStrategy = receivedDataMultiPushTaskStrategy; this.asyncHashedWheelTimer = asyncHashedWheelTimer; + this.sessionInterests = sessionInterests; } @Override @@ -186,6 +191,17 @@ public void onException(Channel channel, Throwable exception) { } else { LOGGER.error("Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); + //set sessionInterests dataInfoId version zero + DataInfo dataInfo = new DataInfo(receivedData.getInstanceId(), receivedData.getDataId(), + receivedData.getGroup()); + boolean result = sessionInterests.checkAndUpdateInterestVersionZero(receivedData.getSegment(), dataInfo.getDataInfoId()); + if (result) { + LOGGER.info("Retry Push ReceivedData times have exceeded,set sessionInterests dataInfoId version zero! dataCenter:{} dataInfoId:{}!", receivedData.getSegment(), + dataInfo.getDataInfoId()); + } else { + LOGGER.info("Retry Push ReceivedData times have exceeded,but set sessionInterests dataInfoId version zero fail! dataCenter:{} dataInfoId:{}!", receivedData.getSegment(), + dataInfo.getDataInfoId()); + } } } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java index e3c0b65c1..fb93f1486 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java @@ -62,6 +62,14 @@ public interface Interests extends DataManager { */ boolean checkAndUpdateInterestVersions(String dataCenter, String dataInfoId, Long version); + /** + * set subscribers interest dataInfoId version zero + * @param dataCenter + * @param dataInfoId + * @return + */ + boolean checkAndUpdateInterestVersionZero(String dataCenter, String dataInfoId); + /** * get all subscriber dataInfoIds * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index a1b0719be..578c6ce59 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -257,6 +257,10 @@ public boolean checkAndUpdateInterestVersions(String dataCenter, String dataInfo } } + public boolean checkAndUpdateInterestVersionZero(String dataCenter, String dataInfoId) { + return checkAndUpdateInterestVersions(dataCenter, dataInfoId, 0l); + } + @Override public Collection getInterestDataInfoIds() { return interests.keySet(); From f15ef836db919446d059140b7ef337b3ecaf355c Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 1 Jul 2019 19:37:37 +0800 Subject: [PATCH 049/161] =?UTF-8?q?fix=20client=20fast=20chain=20breakage?= =?UTF-8?q?=20data=20can=20not=20be=20cleaned=20up=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/SessionServerConfig.java | 6 ++ .../bootstrap/SessionServerConfigBean.java | 60 +++++++++++++++++++ .../server/session/registry/Registry.java | 5 ++ .../session/registry/SessionRegistry.java | 23 +++++++ .../session/scheduler/ExecutorManager.java | 13 +++- .../server/session/store/DataStore.java | 7 +++ .../server/session/store/Interests.java | 6 ++ .../session/store/SessionDataStore.java | 4 ++ .../session/store/SessionInterests.java | 5 ++ 9 files changed, 128 insertions(+), 1 deletion(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 17dc2d866..1fd21eed8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -85,6 +85,12 @@ public interface SessionServerConfig { int getSchedulerConnectDataExpBackOffBound(); + int getSchedulerCleanInvalidClientTimeOut(); + + int getSchedulerCleanInvalidClientFirstDelay(); + + int getSchedulerCleanInvalidClientBackOffBound(); + int getAccessDataExecutorMinPoolSize(); int getAccessDataExecutorMaxPoolSize(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 8137f3c62..a3e18d0af 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -73,6 +73,12 @@ public class SessionServerConfigBean implements SessionServerConfig { private int schedulerConnectDataExpBackOffBound = 10; + private int schedulerCleanInvalidClientTimeOut = 3; + + private int schedulerCleanInvalidClientFirstDelay = 10; + + private int schedulerCleanInvalidClientBackOffBound = 5; + private int cancelDataTaskRetryTimes = 5; private int cancelDataTaskRetryFirstDelay = 100; @@ -781,6 +787,60 @@ public void setSchedulerConnectDataExpBackOffBound(int schedulerConnectDataExpBa this.schedulerConnectDataExpBackOffBound = schedulerConnectDataExpBackOffBound; } + /** + * Getter method for property schedulerCleanInvolidClientTimeOut. + * + * @return property value of schedulerCleanInvolidClientTimeOut + */ + public int getSchedulerCleanInvalidClientTimeOut() { + return schedulerCleanInvalidClientTimeOut; + } + + /** + * Getter method for property schedulerCleanInvolidClientFirstDelay. + * + * @return property value of schedulerCleanInvolidClientFirstDelay + */ + public int getSchedulerCleanInvalidClientFirstDelay() { + return schedulerCleanInvalidClientFirstDelay; + } + + /** + * Getter method for property schedulerCleanInvolidClientBackOffBound. + * + * @return property value of schedulerCleanInvolidClientBackOffBound + */ + public int getSchedulerCleanInvalidClientBackOffBound() { + return schedulerCleanInvalidClientBackOffBound; + } + + /** + * Setter method for property schedulerCleanInvolidClientTimeOut. + * + * @param schedulerCleanInvalidClientTimeOut value to be assigned to property schedulerCleanInvolidClientTimeOut + */ + public void setSchedulerCleanInvalidClientTimeOut(int schedulerCleanInvalidClientTimeOut) { + this.schedulerCleanInvalidClientTimeOut = schedulerCleanInvalidClientTimeOut; + } + + /** + * Setter method for property schedulerCleanInvolidClientFirstDelay. + * + * @param schedulerCleanInvalidClientFirstDelay value to be assigned to property schedulerCleanInvolidClientFirstDelay + */ + public void setSchedulerCleanInvalidClientFirstDelay(int schedulerCleanInvalidClientFirstDelay) { + this.schedulerCleanInvalidClientFirstDelay = schedulerCleanInvalidClientFirstDelay; + } + + /** + * Setter method for property schedulerCleanInvolidClientBackOffBound. + * + * @param schedulerCleanInvalidClientBackOffBound value to be assigned to property schedulerCleanInvolidClientBackOffBound + */ + public void setSchedulerCleanInvalidClientBackOffBound(int schedulerCleanInvalidClientBackOffBound) { + this.schedulerCleanInvalidClientBackOffBound = schedulerCleanInvalidClientBackOffBound; + } + /** * Getter method for property stopPushSwitch. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 09d55d945..1efb278f8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -70,4 +70,9 @@ public interface Registry { * for fetchChangData first invoke */ void fetchChangDataProcess(); + + /** + * for scheduler clean no connect client + */ + void cleanClientConnect(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index f06a52acb..e3b491be0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -24,6 +24,8 @@ import com.alipay.sofa.registry.common.model.store.Watcher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; @@ -39,6 +41,8 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import com.google.common.collect.Sets; +import com.google.common.collect.Sets.SetView; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; @@ -301,6 +305,25 @@ private void fireSubscriberPushEmptyTask(Subscriber subscriber) { getTaskListenerManager().sendTaskEvent(taskEvent); } + public void cleanClientConnect() { + + SetView intersection = Sets.union(sessionDataStore.getConnectPublishers().keySet(), + sessionInterests.getConnectSubscribers().keySet()); + + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + + List connectIds = new ArrayList<>(); + for (String connectId : intersection) { + Channel channel = sessionServer.getChannel(URL.valueOf(connectId)); + if (channel == null) { + connectIds.add(connectId); + LOGGER.warn("Client connect has not existed!it must be remove!connectId:{}", + connectId); + } + } + cancel(connectIds); + } + /** * Getter method for property sessionInterests. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index cd11a6ae6..4961266ce 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -51,6 +51,7 @@ public class ExecutorManager { private final ThreadPoolExecutor getSessionNodeExecutor; private final ThreadPoolExecutor connectMetaExecutor; private final ThreadPoolExecutor connectDataExecutor; + private final ThreadPoolExecutor cleanInvalidClientExecutor; private final ExecutorService checkPushExecutor; private final ExecutorService pushTaskClosureExecutor; @@ -97,7 +98,7 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { this.sessionServerConfig = sessionServerConfig; - scheduler = new ScheduledThreadPoolExecutor(7, new NamedThreadFactory("SessionScheduler")); + scheduler = new ScheduledThreadPoolExecutor(8, new NamedThreadFactory("SessionScheduler")); fetchDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-fetchData")); @@ -117,6 +118,9 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { connectDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-connectDataServer")); + cleanInvalidClientExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, + new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-cleanInvalidClient")); + accessDataExecutor = reportExecutors .computeIfAbsent(ACCESS_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(ACCESS_DATA_EXECUTOR, sessionServerConfig.getAccessDataExecutorMinPoolSize(), @@ -207,6 +211,13 @@ public void startScheduler() { sessionServerConfig.getSchedulerConnectDataExpBackOffBound(), () -> dataNodeExchanger.connectServer()), sessionServerConfig.getSchedulerConnectDataFirstDelay(), TimeUnit.SECONDS); + + scheduler.schedule( + new TimedSupervisorTask("CleanInvalidClient", scheduler, cleanInvalidClientExecutor, + sessionServerConfig.getSchedulerCleanInvalidClientTimeOut(), TimeUnit.MINUTES, + sessionServerConfig.getSchedulerCleanInvalidClientBackOffBound(), + () -> sessionRegistry.cleanClientConnect()), + sessionServerConfig.getSchedulerCleanInvalidClientFirstDelay(), TimeUnit.MINUTES); } public void stopScheduler() { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/DataStore.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/DataStore.java index c33dea1ce..455057c3c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/DataStore.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/DataStore.java @@ -19,6 +19,7 @@ import com.alipay.sofa.registry.common.model.store.Publisher; import java.util.Collection; +import java.util.Map; /** * @@ -49,4 +50,10 @@ public interface DataStore extends DataManager { */ Collection getStoreDataInfoIds(); + /** + * get all publishers group by connectId + * @return + */ + Map> getConnectPublishers(); + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java index fb93f1486..5f08bfb34 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/Interests.java @@ -93,4 +93,10 @@ Map> querySubscriberIndex(String data * @return */ Subscriber queryById(String registerId, String dataInfoId); + + /** + * get all subscribers group by connectId + * @return + */ + Map> getConnectSubscribers(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java index ffe24cf8b..8913e2d00 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java @@ -252,4 +252,8 @@ private void invalidateConnectIndex(String connectId) { connectIndex.remove(connectId); } + @Override + public Map> getConnectPublishers() { + return connectIndex; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index 578c6ce59..c04244031 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -432,6 +432,11 @@ public void clearReSubscribers() { stopPushInterests.clear(); } + @Override + public Map> getConnectSubscribers() { + return connectIndex; + } + public SessionServerConfig getSessionServerConfig() { return sessionServerConfig; } From fd18ce5464c4d2c4ad69db0c575ad56b7c63a601 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 2 Jul 2019 21:46:05 +0800 Subject: [PATCH 050/161] (1) remove logback.xml DEBUG level; (2) dataServerBootstrapConfig rename; (3) print conf when startup --- .../DataServerBeanConfiguration.java | 17 +++---- .../data/bootstrap/DataServerBootstrap.java | 37 ++++++++-------- .../data/bootstrap/DataServerConfig.java | 7 +++ .../server/data/change/DataChangeHandler.java | 4 +- .../change/event/DataChangeEventCenter.java | 8 ++-- .../change/notify/TempPublisherNotifier.java | 19 ++++---- .../datasync/sync/AbstractAcceptorStore.java | 10 ++--- .../handler/DataServerChangeEventHandler.java | 40 ++++++++--------- .../LocalDataServerChangeEventHandler.java | 18 ++++---- .../handler/MetaServerChangeEventHandler.java | 10 ++--- .../data/remoting/DataNodeExchanger.java | 16 ++++--- .../data/remoting/MetaNodeExchanger.java | 18 ++++---- .../dataserver/DataServerNodeFactory.java | 44 +++++++++---------- .../handler/NotifyDataSyncHandler.java | 11 +++-- .../handler/NotifyFetchDatumHandler.java | 11 +++-- .../metaserver/DefaultMetaServiceImpl.java | 31 ++++++------- .../forward/ForwardServiceImpl.java | 8 ++-- .../sessionserver/handler/GetDataHandler.java | 10 ++--- .../renew/LocalDataServerCleanHandler.java | 12 ++--- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/logback-spring.xml | 4 +- .../meta/bootstrap/MetaServerBootstrap.java | 30 +++++++------ .../meta/bootstrap/MetaServerConfigBean.java | 12 ++++- .../MetaServerInitializerConfiguration.java | 9 ++-- .../src/main/resources/logback-spring.xml | 25 ----------- .../session/acceptor/WriteDataProcessor.java | 6 +-- .../session/bootstrap/CommonConfig.java | 11 ++++- .../bootstrap/SessionServerBootstrap.java | 32 ++++++++------ .../bootstrap/SessionServerConfigBean.java | 7 +++ .../bootstrap/SessionServerInitializer.java | 9 ++-- .../session/renew/DefaultRenewService.java | 2 - .../src/main/resources/logback-spring.xml | 4 +- 32 files changed, 245 insertions(+), 239 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 47433f54f..f5499061a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -120,7 +120,8 @@ public CommonConfig commonConfig() { } @Bean - public DataServerConfig dataServerBootstrapConfig(CommonConfig commonConfig) { + @ConditionalOnMissingBean(name = "dataServerConfig") + public DataServerConfig dataServerConfig(CommonConfig commonConfig) { return new DataServerConfig(commonConfig); } @@ -199,12 +200,12 @@ public MetaServerConnectionFactory metaServerConnectionFactory() { } @Bean(name = "serverHandlers") - public Collection serverHandlers(DataServerConfig dataServerBootstrapConfig) { + public Collection serverHandlers(DataServerConfig dataServerConfig) { Collection list = new ArrayList<>(); list.add(getDataHandler()); list.add(clientOffHandler()); list.add(getDataVersionsHandler()); - list.add(publishDataProcessor(dataServerBootstrapConfig)); + list.add(publishDataProcessor(dataServerConfig)); list.add(sessionServerRegisterHandler()); list.add(unPublishDataHandler()); list.add(dataServerConnectionHandler()); @@ -214,10 +215,10 @@ public Collection serverHandlers(DataServerConfig dataSer } @Bean(name = "serverSyncHandlers") - public Collection serverSyncHandlers(DataServerConfig dataServerBootstrapConfig) { + public Collection serverSyncHandlers(DataServerConfig dataServerConfig) { Collection list = new ArrayList<>(); list.add(getDataHandler()); - list.add(publishDataProcessor(dataServerBootstrapConfig)); + list.add(publishDataProcessor(dataServerConfig)); list.add(unPublishDataHandler()); list.add(notifyFetchDatumHandler()); list.add(notifyOnlineHandler()); @@ -278,8 +279,8 @@ public AbstractServerHandler renewDatumHandler() { } @Bean - public AbstractServerHandler publishDataProcessor(DataServerConfig dataServerBootstrapConfig) { - return new PublishDataHandler(dataServerBootstrapConfig); + public AbstractServerHandler publishDataProcessor(DataServerConfig dataServerConfig) { + return new PublishDataHandler(dataServerConfig); } @Bean @@ -351,7 +352,7 @@ public BackUpNotifier backUpNotifier() { } @Bean(name = "dataChangeNotifiers") - public List dataChangeNotifiers(DataServerConfig dataServerBootstrapConfig) { + public List dataChangeNotifiers() { List list = new ArrayList<>(); list.add(sessionServerNotifier()); list.add(tempPublisherNotifier()); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index 523f23679..24e9e31f9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -61,7 +61,7 @@ public class DataServerBootstrap { .getLogger(DataServerBootstrap.class); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private IMetaServerService metaServerService; @@ -112,7 +112,9 @@ public class DataServerBootstrap { */ public void start() { try { - LOGGER.info("[DataServerBootstrap] begin start server"); + LOGGER.info("begin start server"); + + LOGGER.info("the configuration items are as follows: " + dataServerConfig.toString()); openDataServer(); @@ -126,9 +128,9 @@ public void start() { Runtime.getRuntime().addShutdownHook(new Thread(this::doStop)); - LOGGER.info("[DataServerBootstrap] start server success"); + LOGGER.info("start server success"); } catch (Exception e) { - throw new RuntimeException("[DataServerBootstrap] start server error", e); + throw new RuntimeException("start server error", e); } } @@ -136,15 +138,13 @@ private void openDataServer() { try { if (serverForSessionStarted.compareAndSet(false, true)) { server = boltExchange.open(new URL(NetUtil.getLocalAddress().getHostAddress(), - dataServerBootstrapConfig.getPort()), serverHandlers + dataServerConfig.getPort()), serverHandlers .toArray(new ChannelHandler[serverHandlers.size()])); - LOGGER.info("Data server for session started! port:{}", - dataServerBootstrapConfig.getPort()); + LOGGER.info("Data server for session started! port:{}", dataServerConfig.getPort()); } } catch (Exception e) { serverForSessionStarted.set(false); - LOGGER - .error("Data server start error! port:{}", dataServerBootstrapConfig.getPort(), e); + LOGGER.error("Data server start error! port:{}", dataServerConfig.getPort(), e); throw new RuntimeException("Data server start error!", e); } } @@ -153,15 +153,15 @@ private void openDataSyncServer() { try { if (serverForDataSyncStarted.compareAndSet(false, true)) { dataSyncServer = boltExchange.open(new URL(NetUtil.getLocalAddress() - .getHostAddress(), dataServerBootstrapConfig.getSyncDataPort()), - serverSyncHandlers.toArray(new ChannelHandler[serverSyncHandlers.size()])); + .getHostAddress(), dataServerConfig.getSyncDataPort()), serverSyncHandlers + .toArray(new ChannelHandler[serverSyncHandlers.size()])); LOGGER.info("Data server for sync started! port:{}", - dataServerBootstrapConfig.getSyncDataPort()); + dataServerConfig.getSyncDataPort()); } } catch (Exception e) { serverForDataSyncStarted.set(false); LOGGER.error("Data sync server start error! port:{}", - dataServerBootstrapConfig.getSyncDataPort(), e); + dataServerConfig.getSyncDataPort(), e); throw new RuntimeException("Data sync server start error!", e); } } @@ -171,15 +171,15 @@ private void openHttpServer() { if (httpServerStarted.compareAndSet(false, true)) { bindResourceConfig(); httpServer = jerseyExchange.open( - new URL(NetUtil.getLocalAddress().getHostAddress(), dataServerBootstrapConfig + new URL(NetUtil.getLocalAddress().getHostAddress(), dataServerConfig .getHttpServerPort()), new ResourceConfig[] { jerseyResourceConfig }); LOGGER.info("Open http server port {} success!", - dataServerBootstrapConfig.getHttpServerPort()); + dataServerConfig.getHttpServerPort()); } } catch (Exception e) { httpServerStarted.set(false); - LOGGER.error("Open http server port {} error!", - dataServerBootstrapConfig.getHttpServerPort(), e); + LOGGER + .error("Open http server port {} error!", dataServerConfig.getHttpServerPort(), e); throw new RuntimeException("Open http server error!", e); } } @@ -187,8 +187,7 @@ private void openHttpServer() { private void startRaftClient() { metaServerService.startRaftClient(); eventCenter.post(new MetaServerChangeEvent(metaServerService.getMetaServerMap())); - LOGGER.info("[DataServerBootstrap] raft client started!Leader is {}", - metaServerService.getLeader()); + LOGGER.info("raft client started!Leader is {}", metaServerService.getLeader()); } private void startScheduler() { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index efc4e637e..ccb19fe77 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -22,6 +22,8 @@ import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; import com.alipay.sofa.registry.net.NetUtil; @@ -721,4 +723,9 @@ public int getSessionServerNotifierRetryExecutorQueueSize() { public void setSessionServerNotifierRetryExecutorQueueSize(int sessionServerNotifierRetryExecutorQueueSize) { this.sessionServerNotifierRetryExecutorQueueSize = sessionServerNotifierRetryExecutorQueueSize; } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index 306b68bbd..fc97994f8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -51,7 +51,7 @@ public class DataChangeHandler { private static final Logger LOGGER_START = LoggerFactory.getLogger("DATA-START-LOGS"); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DataChangeEventCenter dataChangeEventCenter; @@ -68,7 +68,7 @@ public void start() { int queueCount = queues.length; Executor executor = ExecutorFactory.newFixedThreadPool(queueCount, DataChangeHandler.class.getSimpleName()); Executor notifyExecutor = ExecutorFactory - .newFixedThreadPool(dataServerBootstrapConfig.getQueueCount() * 5, this.getClass().getSimpleName()); + .newFixedThreadPool(dataServerConfig.getQueueCount() * 5, this.getClass().getSimpleName()); for (int idx = 0; idx < queueCount; idx++) { final DataChangeEventQueue dataChangeEventQueue = queues[idx]; final String name = dataChangeEventQueue.getName(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java index 3834411d8..01b5e220d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventCenter.java @@ -50,7 +50,7 @@ public class DataChangeEventCenter { private DataChangeEventQueue[] dataChangeEventQueues; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DatumCache datumCache; @@ -58,11 +58,11 @@ public class DataChangeEventCenter { @PostConstruct public void init() { if (isInited.compareAndSet(false, true)) { - queueCount = dataServerBootstrapConfig.getQueueCount(); + queueCount = dataServerConfig.getQueueCount(); dataChangeEventQueues = new DataChangeEventQueue[queueCount]; for (int idx = 0; idx < queueCount; idx++) { - dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, - dataServerBootstrapConfig, this, datumCache); + dataChangeEventQueues[idx] = new DataChangeEventQueue(idx, dataServerConfig, this, + datumCache); dataChangeEventQueues[idx].start(); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java index b37fa7541..f4f5f5e9a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.data.change.notify; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.remoting.InvokeCallback; import com.alipay.sofa.registry.common.model.CommonResponse; @@ -31,12 +38,6 @@ import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Executor; /** * @@ -54,7 +55,7 @@ public class TempPublisherNotifier implements IDataChangeNotifier { .getSimpleName()); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private Exchange boltExchange; @@ -83,7 +84,7 @@ private void doNotify(NotifyPushDataCallback notifyPushdataCallback) { Connection connection = notifyPushdataCallback.getConnection(); DataPushRequest request = notifyPushdataCallback.getRequest(); try { - Server sessionServer = boltExchange.getServer(dataServerBootstrapConfig.getPort()); + Server sessionServer = boltExchange.getServer(dataServerConfig.getPort()); sessionServer.sendCallback(sessionServer.getChannel(connection.getRemoteAddress()), request, new CallbackHandler() { @@ -96,7 +97,7 @@ public void onCallback(Channel channel, Object message) { public void onException(Channel channel, Throwable exception) { notifyPushdataCallback.onException(exception); } - }, dataServerBootstrapConfig.getRpcTimeout()); + }, dataServerConfig.getRpcTimeout()); } catch (Exception e) { LOGGER.error("[TempPublisherNotifier] notify sessionserver {} failed, {}", connection.getRemoteIP(), request, e); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java index e32684453..7ea73a3da 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java @@ -63,7 +63,7 @@ public abstract class AbstractAcceptorStore implements AcceptorStore { private Exchange boltExchange; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DataServerConnectionFactory dataServerConnectionFactory; @@ -198,7 +198,7 @@ private void notifyChange(Acceptor acceptor) { continue; } - Server syncServer = boltExchange.getServer(dataServerBootstrapConfig.getSyncDataPort()); + Server syncServer = boltExchange.getServer(dataServerConfig.getSyncDataPort()); for (int tryCount = 0; tryCount < NOTIFY_RETRY; tryCount++) { try { @@ -278,11 +278,11 @@ public SyncData getSyncData(SyncDataRequest syncDataRequest) { } /** - * Getter method for property dataServerBootstrapConfig. + * Getter method for property dataServerConfig. * - * @return property value of dataServerBootstrapConfig + * @return property value of dataServerConfig */ public DataServerConfig getDataServerConfig() { - return dataServerBootstrapConfig; + return dataServerConfig; } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java index 931877b03..84fa90dfe 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.data.event.handler; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.common.model.store.URL; @@ -32,15 +42,6 @@ import com.alipay.sofa.registry.server.data.remoting.DataNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; import com.alipay.sofa.registry.server.data.util.TimeUtil; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; /** * @@ -55,7 +56,7 @@ public class DataServerChangeEventHandler extends AbstractEventHandler localDataServers = dataServerCache.getDataServers( - dataServerBootstrapConfig.getLocalDataCenter()).keySet(); + dataServerConfig.getLocalDataCenter()).keySet(); //get changed dataservers Map> changedMap = dataServerCache .compareAndSet(dataServerChangeItem); @@ -102,7 +103,7 @@ public void doHandle(DataServerChangeEvent event) { Set ipSet = DataServerNodeFactory.getIps(dataCenter); for (String ip : ipSet) { if (!ips.contains(ip)) { - DataServerNodeFactory.remove(dataCenter, ip, dataServerBootstrapConfig); + DataServerNodeFactory.remove(dataCenter, ip, dataServerConfig); LOGGER.info( "[DataServerChangeEventHandler] remove connection, datacenter:{}, ip:{}", dataCenter, ip); @@ -112,7 +113,7 @@ public void doHandle(DataServerChangeEvent event) { Long newVersion = dataServerCache.getDataCenterNewVersion(dataCenter); Map newDataNodes = dataServerCache.getNewDataServerMap(dataCenter); //if the datacenter is self, post LocalDataServerChangeEvent - if (dataServerBootstrapConfig.getLocalDataCenter().equals(dataCenter)) { + if (dataServerConfig.getLocalDataCenter().equals(dataCenter)) { Set newjoined = new HashSet<>(ips); newjoined.removeAll(localDataServers); //avoid input map reference operation DataServerNodeFactory MAP @@ -122,14 +123,14 @@ public void doHandle(DataServerChangeEvent event) { map.keySet(), newVersion); eventCenter.post(new LocalDataServerChangeEvent(map, newjoined, dataServerChangeItem.getVersionMap() - .get(dataServerBootstrapConfig.getLocalDataCenter()), + .get(dataServerConfig.getLocalDataCenter()), newVersion)); } else { dataServerCache.updateItem(newDataNodes, newVersion, dataCenter); } } else { //if the datacenter which has no dataservers is not self, remove it - if (!dataServerBootstrapConfig.getLocalDataCenter().equals(dataCenter)) { + if (!dataServerConfig.getLocalDataCenter().equals(dataCenter)) { removeDataCenter(dataCenter); } Long newVersion = dataServerCache.getDataCenterNewVersion(dataCenter); @@ -170,8 +171,8 @@ private void connectDataServer(String dataCenter, String ip) { Connection conn = null; for (int tryCount = 0; tryCount < TRY_COUNT; tryCount++) { try { - conn = ((BoltChannel) dataNodeExchanger.connect(new URL(ip, - dataServerBootstrapConfig.getSyncDataPort()))).getConnection(); + conn = ((BoltChannel) dataNodeExchanger.connect(new URL(ip, dataServerConfig + .getSyncDataPort()))).getConnection(); break; } catch (Exception e) { LOGGER.error("[DataServerChangeEventHandler] connect dataServer {} in {} error", @@ -190,8 +191,7 @@ private void connectDataServer(String dataCenter, String ip) { ip, dataCenter)); } //maybe get dataNode from metaServer,current has not start! register dataNode info to factory,wait for connect task next execute - DataServerNodeFactory.register(new DataServerNode(ip, dataCenter, conn), - dataServerBootstrapConfig); + DataServerNodeFactory.register(new DataServerNode(ip, dataCenter, conn), dataServerConfig); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 3902dc653..17dd49267 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -67,7 +67,7 @@ public class LocalDataServerChangeEventHandler extends .getLogger(LocalDataServerChangeEventHandler.class); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private LocalDataServerCleanHandler localDataServerCleanHandler; @@ -147,7 +147,7 @@ public void run() { dataServerCache.updateItem(event.getLocalDataServerMap(), event.getLocalDataCenterversion(), - dataServerBootstrapConfig.getLocalDataCenter()); + dataServerConfig.getLocalDataCenter()); } } catch (Throwable t) { LOGGER.error("sync local data error", t); @@ -166,7 +166,7 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) Map dataServerMapIn = event.getLocalDataServerMap(); List dataServerNodeList = Lists.newArrayList(dataServerMapIn.values()); ConsistentHash consistentHash = new ConsistentHash<>( - dataServerBootstrapConfig.getNumberOfReplicas(), dataServerNodeList); + dataServerConfig.getNumberOfReplicas(), dataServerNodeList); Map dataServerMap = new ConcurrentHashMap<>(dataServerMapIn); Map>> toBeSyncMap = getToBeSyncMap(consistentHash); @@ -216,7 +216,7 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) if (!isChanged.get()) { //update server list dataServerCache.updateItem(dataServerMapIn, event.getLocalDataCenterversion(), - dataServerBootstrapConfig.getLocalDataCenter()); + dataServerConfig.getLocalDataCenter()); } } } @@ -233,7 +233,7 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) Map> triadCache = new HashMap<>(); ConsistentHash consistentHashOld = dataServerCache - .calculateOldConsistentHash(dataServerBootstrapConfig.getLocalDataCenter()); + .calculateOldConsistentHash(dataServerConfig.getLocalDataCenter()); if (consistentHash == null) { LOGGER.error("Calculate Old ConsistentHash error!"); throw new RuntimeException("Calculate Old ConsistentHash error!"); @@ -255,12 +255,12 @@ private void notifyToFetch(LocalDataServerChangeEvent event, long changeVersion) backupNodes = triadCache.get(dataInfoId); } else { backupNodes = consistentHash.getNUniqueNodesFor(dataInfoId, - dataServerBootstrapConfig.getStoreNodes()); + dataServerConfig.getStoreNodes()); triadCache.put(dataInfoId, backupNodes); } BackupTriad backupTriad = new BackupTriad(dataInfoId, consistentHashOld.getNUniqueNodesFor(dataInfoId, - dataServerBootstrapConfig.getStoreNodes())); + dataServerConfig.getStoreNodes())); if (backupTriad != null) { List newJoinedNodes = backupTriad.getNewJoined(backupNodes, dataServerCache.getNotWorking()); @@ -300,7 +300,7 @@ private boolean doNotify(String targetIp, Map> notifyV long version) { while (!isChanged.get()) { DataServerNode targetNode = DataServerNodeFactory.getDataServerNode( - dataServerBootstrapConfig.getLocalDataCenter(), targetIp); + dataServerConfig.getLocalDataCenter(), targetIp); if (targetNode == null || targetNode.getConnection() == null) { LOGGER.info( "notify version change to sync has not connect,targetNode={}, map={}", @@ -347,7 +347,7 @@ public URL getRequestUrl() { */ private void notifyOnline(long changeVersion) { Map dataServerNodeMap = DataServerNodeFactory - .getDataServerNodes(dataServerBootstrapConfig.getLocalDataCenter()); + .getDataServerNodes(dataServerConfig.getLocalDataCenter()); for (Entry serverEntry : dataServerNodeMap.entrySet()) { while (true) { String ip = serverEntry.getKey(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java index e516f5160..056109e9e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java @@ -57,7 +57,7 @@ public class MetaServerChangeEventHandler extends AbstractEventHandler dataClientHandlers; @@ -60,11 +62,11 @@ public Response request(Request request) { if (null != request.getCallBackHandler()) { client.sendCallback(channel, request.getRequestBody(), request.getCallBackHandler(), - dataServerBootstrapConfig.getRpcTimeout()); + dataServerConfig.getRpcTimeout()); return () -> Response.ResultStatus.SUCCESSFUL; } else { final Object result = client.sendSync(channel, request.getRequestBody(), - dataServerBootstrapConfig.getRpcTimeout()); + dataServerConfig.getRpcTimeout()); return () -> result; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java index 607beec97..c79b8dabf 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.data.remoting; +import java.util.Collection; + +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -29,10 +35,6 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.Resource; -import java.util.Collection; /** * @author xuanbei @@ -49,7 +51,7 @@ public class MetaNodeExchanger implements NodeExchanger { private IMetaServerService metaServerService; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Resource(name = "metaClientHandlers") private Collection metaClientHandlers; @@ -63,12 +65,12 @@ public Response request(Request request) { try { final Object result = client.sendSync(channel, request.getRequestBody(), - dataServerBootstrapConfig.getRpcTimeout()); + dataServerConfig.getRpcTimeout()); return () -> result; } catch (Exception e) { //retry URL url = new URL(metaServerService.refreshLeader().getIp(), - dataServerBootstrapConfig.getMetaServerPort()); + dataServerConfig.getMetaServerPort()); channel = client.getChannel(url); if (channel == null) { channel = client.connect(url); @@ -76,7 +78,7 @@ public Response request(Request request) { LOGGER.warn("MetaNode Exchanger request send error!It will be retry once!Request url:{}", url); final Object result = client.sendSync(channel, request.getRequestBody(), - dataServerBootstrapConfig.getRpcTimeout()); + dataServerConfig.getRpcTimeout()); return () -> result; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java index 53a484bea..62f0f3472 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java @@ -16,12 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver; -import com.alipay.remoting.Connection; -import com.alipay.sofa.registry.consistency.hash.ConsistentHash; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; -import com.alipay.sofa.registry.server.data.node.DataServerNode; -import com.google.common.collect.Lists; - import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -30,6 +24,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import com.alipay.remoting.Connection; +import com.alipay.sofa.registry.consistency.hash.ConsistentHash; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.node.DataServerNode; +import com.google.common.collect.Lists; + /** * the factory to hold other dataservers and connection connected to them * @@ -59,14 +59,13 @@ public class DataServerNodeFactory { * * @param dataServerNode */ - public static void register(DataServerNode dataServerNode, - DataServerConfig dataServerBootstrapConfig) { + public static void register(DataServerNode dataServerNode, DataServerConfig dataServerConfig) { String dataCenter = dataServerNode.getDataCenter(); if (!MAP.containsKey(dataCenter)) { MAP.put(dataCenter, new ConcurrentHashMap<>()); } MAP.get(dataCenter).put(dataServerNode.getIp(), dataServerNode); - refreshConsistent(dataCenter, dataServerBootstrapConfig); + refreshConsistent(dataCenter, dataServerConfig); } /** @@ -74,31 +73,29 @@ public static void register(DataServerNode dataServerNode, * * @param dataCenter */ - public static void refreshConsistent(String dataCenter, - DataServerConfig dataServerBootstrapConfig) { + public static void refreshConsistent(String dataCenter, DataServerConfig dataServerConfig) { List dataServerNodes = Lists.newArrayList(MAP.get(dataCenter).values()); - if (dataServerBootstrapConfig.getLocalDataCenter().equals(dataCenter)) { + if (dataServerConfig.getLocalDataCenter().equals(dataCenter)) { if (!MAP.get(dataCenter).keySet().contains(DataServerConfig.IP)) { - dataServerNodes.add(new DataServerNode(DataServerConfig.IP, - dataServerBootstrapConfig.getLocalDataCenter(), null)); + dataServerNodes.add(new DataServerNode(DataServerConfig.IP, dataServerConfig + .getLocalDataCenter(), null)); } } CONSISTENT_HASH_MAP.put(dataCenter, - new ConsistentHash<>(dataServerBootstrapConfig.getNumberOfReplicas(), dataServerNodes)); + new ConsistentHash<>(dataServerConfig.getNumberOfReplicas(), dataServerNodes)); } /** * for single node consistentHash - * @param dataServerBootstrapConfig + * @param dataServerConfig */ - public static void initConsistent(DataServerConfig dataServerBootstrapConfig) { + public static void initConsistent(DataServerConfig dataServerConfig) { if (init.compareAndSet(false, true)) { List dataServerNodes = Lists.newArrayList(); - dataServerNodes.add(new DataServerNode(DataServerConfig.IP, dataServerBootstrapConfig + dataServerNodes.add(new DataServerNode(DataServerConfig.IP, dataServerConfig .getLocalDataCenter(), null)); - CONSISTENT_HASH_MAP.put(dataServerBootstrapConfig.getLocalDataCenter(), - new ConsistentHash<>(dataServerBootstrapConfig.getNumberOfReplicas(), - dataServerNodes)); + CONSISTENT_HASH_MAP.put(dataServerConfig.getLocalDataCenter(), new ConsistentHash<>( + dataServerConfig.getNumberOfReplicas(), dataServerNodes)); } } @@ -155,8 +152,7 @@ public static Set getIps(String dataCenter) { * @param dataCenter * @param ip */ - public static void remove(String dataCenter, String ip, - DataServerConfig dataServerBootstrapConfig) { + public static void remove(String dataCenter, String ip, DataServerConfig dataServerConfig) { if (MAP.containsKey(dataCenter)) { Map map = MAP.get(dataCenter); if (map != null) { @@ -168,7 +164,7 @@ public static void remove(String dataCenter, String ip, map.remove(ip); } } - refreshConsistent(dataCenter, dataServerBootstrapConfig); + refreshConsistent(dataCenter, dataServerConfig); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java index 82cc09555..c1dd0cead 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java @@ -61,7 +61,7 @@ public class NotifyDataSyncHandler extends AbstractClientHandler( - dataServerBootstrapConfig.getNotifyDataSyncExecutorQueueSize()), + dataServerConfig.getNotifyDataSyncExecutorMinPoolSize(), + dataServerConfig.getNotifyDataSyncExecutorMaxPoolSize(), + dataServerConfig.getNotifyDataSyncExecutorKeepAliveTime(), TimeUnit.SECONDS, + new ArrayBlockingQueue<>(dataServerConfig.getNotifyDataSyncExecutorQueueSize()), new NamedThreadFactory("DataServer-NotifyDataSyncProcessor-executor", true)); } return notifyExecutor; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index a0e3e2a31..29855bcb3 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -68,7 +68,7 @@ public class NotifyFetchDatumHandler extends AbstractServerHandler> response = (GenericResponse>) syncServer .sendSync(syncServer.getChannel(connection.getRemoteAddress()), new GetDataRequest(dataInfoId, dataCenter), - dataServerBootstrapConfig.getRpcTimeout()); + dataServerConfig.getRpcTimeout()); if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); if (datum != null) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java index 8670f962b..8aef5f909 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java @@ -61,7 +61,7 @@ public class DefaultMetaServiceImpl implements IMetaServerService { .getLogger(DefaultMetaServiceImpl.class); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private MetaNodeExchanger metaNodeExchanger; @@ -76,25 +76,24 @@ public class DefaultMetaServiceImpl implements IMetaServerService { @Override public Map> getMetaServerMap() { HashMap> map = new HashMap<>(); - Set set = dataServerBootstrapConfig.getMetaServerIpAddresses(); + Set set = dataServerConfig.getMetaServerIpAddresses(); Map connectionMap = metaServerConnectionFactory - .getConnections(dataServerBootstrapConfig.getLocalDataCenter()); + .getConnections(dataServerConfig.getLocalDataCenter()); Connection connection = null; try { if (connectionMap.isEmpty()) { List list = new ArrayList(set); Collections.shuffle(list); connection = ((BoltChannel) metaNodeExchanger.connect(new URL(list.iterator() - .next(), dataServerBootstrapConfig.getMetaServerPort()))).getConnection(); + .next(), dataServerConfig.getMetaServerPort()))).getConnection(); } else { List connections = new ArrayList<>(connectionMap.values()); Collections.shuffle(connections); connection = connections.iterator().next(); if (!connection.isFine()) { connection = ((BoltChannel) metaNodeExchanger.connect(new URL(connection - .getRemoteIP(), dataServerBootstrapConfig.getMetaServerPort()))) - .getConnection(); + .getRemoteIP(), dataServerConfig.getMetaServerPort()))).getConnection(); } } @@ -116,11 +115,10 @@ public URL getRequestUrl() { Map> metaNodesMap = result.getNodes(); if (metaNodesMap != null && !metaNodesMap.isEmpty()) { - Map metaNodeMap = metaNodesMap.get(dataServerBootstrapConfig + Map metaNodeMap = metaNodesMap.get(dataServerConfig .getLocalDataCenter()); if (metaNodeMap != null && !metaNodeMap.isEmpty()) { - map.put(dataServerBootstrapConfig.getLocalDataCenter(), - metaNodeMap.keySet()); + map.put(dataServerConfig.getLocalDataCenter(), metaNodeMap.keySet()); } else { LOGGER .error( @@ -151,13 +149,13 @@ public DataServerNode getDataServer(String dataCenter, String dataInfoId) { @Override public List getDataServers(String dataCenter, String dataInfoId) { return DataServerNodeFactory.computeDataServerNodes(dataCenter, dataInfoId, - dataServerBootstrapConfig.getStoreNodes()); + dataServerConfig.getStoreNodes()); } @Override public DataServerChangeItem getDateServers() { Map connectionMap = metaServerConnectionFactory - .getConnections(dataServerBootstrapConfig.getLocalDataCenter()); + .getConnections(dataServerConfig.getLocalDataCenter()); String leader = getLeader().getIp(); if (connectionMap.containsKey(leader)) { Connection connection = connectionMap.get(leader); @@ -204,14 +202,14 @@ public URL getRequestUrl() { @Override public List getOtherDataCenters() { Set all = new HashSet<>(DataServerNodeFactory.getAllDataCenters()); - all.remove(dataServerBootstrapConfig.getLocalDataCenter()); + all.remove(dataServerConfig.getLocalDataCenter()); return new ArrayList<>(all); } @Override public void renewNodeTask() { Map connectionMap = metaServerConnectionFactory - .getConnections(dataServerBootstrapConfig.getLocalDataCenter()); + .getConnections(dataServerConfig.getLocalDataCenter()); for (Entry connectEntry : connectionMap.entrySet()) { String ip = connectEntry.getKey(); //just send to leader @@ -221,7 +219,7 @@ public void renewNodeTask() { try { RenewNodesRequest renewNodesRequest = new RenewNodesRequest<>( new DataNode(new URL(DataServerConfig.IP), - dataServerBootstrapConfig.getLocalDataCenter())); + dataServerConfig.getLocalDataCenter())); metaNodeExchanger.request(new Request() { @Override public Object getRequestBody() { @@ -269,7 +267,7 @@ public void startRaftClient() { private String getServerConfig() { String ret = ""; - Set ips = dataServerBootstrapConfig.getMetaServerIpAddresses(); + Set ips = dataServerConfig.getMetaServerIpAddresses(); if (ips != null && !ips.isEmpty()) { ret = ips.stream().map(ip -> ip + ":" + ValueConstants.RAFT_SERVER_PORT) .collect(Collectors.joining(",")); @@ -281,8 +279,7 @@ private String getServerConfig() { } private String getGroup() { - return ValueConstants.RAFT_SERVER_GROUP + "_" - + dataServerBootstrapConfig.getLocalDataCenter(); + return ValueConstants.RAFT_SERVER_GROUP + "_" + dataServerConfig.getLocalDataCenter(); } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java index 1cf27fb53..b8985153a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/forward/ForwardServiceImpl.java @@ -44,7 +44,7 @@ public class ForwardServiceImpl implements ForwardService { private static final Logger LOGGER = LoggerFactory.getLogger(ForwardServiceImpl.class); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DataNodeStatus dataNodeStatus; @@ -67,9 +67,9 @@ public boolean needForward() { public Object forwardRequest(String dataInfoId, Object request) throws RemotingException { try { // 1. get store nodes - List dataServerNodes = DataServerNodeFactory.computeDataServerNodes( - dataServerBootstrapConfig.getLocalDataCenter(), dataInfoId, - dataServerBootstrapConfig.getStoreNodes()); + List dataServerNodes = DataServerNodeFactory + .computeDataServerNodes(dataServerConfig.getLocalDataCenter(), dataInfoId, + dataServerConfig.getStoreNodes()); // 2. find next node if (null == dataServerNodes || dataServerNodes.size() <= 0) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java index e449826ee..bf49e27f5 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataHandler.java @@ -54,7 +54,7 @@ public class GetDataHandler extends AbstractServerHandler { private ForwardService forwardService; @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DatumCache datumCache; @@ -110,10 +110,10 @@ protected Node.NodeType getConnectNodeType() { public Executor getExecutor() { if (getDataProcessorExecutor == null) { getDataProcessorExecutor = new ThreadPoolExecutorDataServer("GetDataProcessorExecutor", - dataServerBootstrapConfig.getGetDataExecutorMinPoolSize(), - dataServerBootstrapConfig.getGetDataExecutorMaxPoolSize(), - dataServerBootstrapConfig.getGetDataExecutorKeepAliveTime(), TimeUnit.SECONDS, - new ArrayBlockingQueue<>(dataServerBootstrapConfig.getGetDataExecutorQueueSize()), + dataServerConfig.getGetDataExecutorMinPoolSize(), + dataServerConfig.getGetDataExecutorMaxPoolSize(), + dataServerConfig.getGetDataExecutorKeepAliveTime(), TimeUnit.SECONDS, + new ArrayBlockingQueue<>(dataServerConfig.getGetDataExecutorQueueSize()), new NamedThreadFactory("DataServer-GetDataProcessor-executor", true)); } return getDataProcessorExecutor; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java index f947c19dd..b6aa61547 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/LocalDataServerCleanHandler.java @@ -52,7 +52,7 @@ public class LocalDataServerCleanHandler { .getLogger("DATA-START-LOGS"); @Autowired - private DataServerConfig dataServerBootstrapConfig; + private DataServerConfig dataServerConfig; @Autowired private DataServerCache dataServerCache; @@ -99,7 +99,7 @@ public void reset() { EVENT_QUEUE.clear(); } } - EVENT_QUEUE.add(new DelayItem<>(new LocalCleanTask(), dataServerBootstrapConfig + EVENT_QUEUE.add(new DelayItem<>(new LocalCleanTask(), dataServerConfig .getLocalDataServerCleanDelay())); } @@ -115,14 +115,14 @@ public void run() { try { Map dataNodeMap = dataServerCache - .getDataServers(dataServerBootstrapConfig.getLocalDataCenter()); + .getDataServers(dataServerConfig.getLocalDataCenter()); if (dataNodeMap == null || dataNodeMap.isEmpty()) { LOGGER.warn("Calculate Old BackupTriad,old dataServer list is empty!"); return; } ConsistentHash consistentHash = new ConsistentHash<>( - dataServerBootstrapConfig.getNumberOfReplicas(), dataNodeMap.values()); + dataServerConfig.getNumberOfReplicas(), dataNodeMap.values()); Map> dataMapAll = datumCache.getAll(); @@ -142,7 +142,7 @@ public void run() { BackupTriad backupTriad = new BackupTriad(dataInfoId, consistentHash.getNUniqueNodesFor(dataInfoId, - dataServerBootstrapConfig.getStoreNodes())); + dataServerConfig.getStoreNodes())); if (!backupTriad.containsSelf()) { if (datum != null) { int size = datum.getPubMap() != null ? datum.getPubMap().size() @@ -159,7 +159,7 @@ public void run() { } catch (Throwable e) { LOGGER.error("[LocalDataServerCleanHandler] clean local datum task error!", e); } finally { - EVENT_QUEUE.add(new DelayItem<>(new LocalCleanTask(), dataServerBootstrapConfig + EVENT_QUEUE.add(new DelayItem<>(new LocalCleanTask(), dataServerConfig .getLocalDataServerCleanDelay())); } } diff --git a/server/server/data/src/main/resources/logback-spring.xml b/server/server/data/src/main/resources/logback-spring.xml index 98fe1548b..bc99d0067 100644 --- a/server/server/data/src/main/resources/logback-spring.xml +++ b/server/server/data/src/main/resources/logback-spring.xml @@ -285,7 +285,7 @@ - + diff --git a/server/server/integration/src/main/resources/logback-spring.xml b/server/server/integration/src/main/resources/logback-spring.xml index 2eb614d24..5b5142bb5 100644 --- a/server/server/integration/src/main/resources/logback-spring.xml +++ b/server/server/integration/src/main/resources/logback-spring.xml @@ -100,7 +100,7 @@ true - DEBUG + ${LOG_LEVEL} ERROR @@ -491,7 +491,7 @@ - + diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerBootstrap.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerBootstrap.java index 613b338cf..9e700c199 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerBootstrap.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerBootstrap.java @@ -16,6 +16,20 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -27,18 +41,6 @@ import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; import com.alipay.sofa.registry.server.meta.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * @@ -99,8 +101,10 @@ public class MetaServerBootstrap { /** * Do initialized. */ - public void doInitialized() { + public void start() { try { + LOGGER.info("the configuration items are as follows: " + metaServerConfig.toString()); + openSessionRegisterServer(); openDataRegisterServer(); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java index bb484c923..68864e817 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java @@ -16,10 +16,13 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; -import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import java.io.File; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; -import java.io.File; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; /** * @@ -599,4 +602,9 @@ public boolean isEnableMetrics() { public void setEnableMetrics(boolean enableMetrics) { this.enableMetrics = enableMetrics; } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } } \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerInitializerConfiguration.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerInitializerConfiguration.java index 1add54080..cca6532fc 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerInitializerConfiguration.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerInitializerConfiguration.java @@ -16,12 +16,13 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; +import java.util.concurrent.atomic.AtomicBoolean; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.SmartLifecycle; -import java.util.concurrent.atomic.AtomicBoolean; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; /** * @@ -47,7 +48,7 @@ public boolean isAutoStartup() { public void start() { try { - metaServerBootstrap.doInitialized(); + metaServerBootstrap.start(); LOGGER.info("Started MetaServer"); MetaServerInitializerConfiguration.this.running.set(true); diff --git a/server/server/meta/src/main/resources/logback-spring.xml b/server/server/meta/src/main/resources/logback-spring.xml index d248c369d..0d5cb2faa 100644 --- a/server/server/meta/src/main/resources/logback-spring.xml +++ b/server/server/meta/src/main/resources/logback-spring.xml @@ -71,26 +71,6 @@ - - true - - ${LOG_LEVEL} - - - ERROR - DENY - - ${META_LOG_HOME}/registry-renew.log - - ${META_LOG_HOME}/registry-renew.log.%d{yyyy-MM-dd} - 30 - - - [%d{ISO8601}][%p][%t][%c{0}] - %m%n - ${LOG_ENCODE} - - - @@ -277,11 +257,6 @@ - - - - - diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 9a073e6bb..14bffdafd 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -251,10 +251,8 @@ private void doPublishAsync(WriteDataRequest request) { } private void doSnapshotAsync(WriteDataRequest request) { - if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("doSnapshotAsync: connectId={}, requestType={}, requestBody={}", - connectId, request.getRequestType(), request.getRequestBody()); - } + RENEW_LOGGER.info("doSnapshotAsync: connectId={}, requestType={}, requestBody={}", + connectId, request.getRequestType(), request.getRequestBody()); String connectId = (String) request.getRequestBody(); List datumSnapshotRequests = renewService diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/CommonConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/CommonConfig.java index 71e4f81a2..7ae7a8cec 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/CommonConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/CommonConfig.java @@ -16,11 +16,13 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import org.springframework.beans.factory.annotation.Value; - import java.util.Collection; import java.util.Map; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.springframework.beans.factory.annotation.Value; + /** * * @author shangyu.wh @@ -85,4 +87,9 @@ public String getLocalRegion() { return localRegion; } + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 87b01b6bb..697883a2b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -16,6 +16,21 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; @@ -39,19 +54,6 @@ import com.alipay.sofa.registry.server.session.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.util.CollectionUtils; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * The type Session server bootstrap. @@ -120,8 +122,10 @@ public class SessionServerBootstrap { /** * Do initialized. */ - public void doInitialized() { + public void start() { try { + LOGGER.info("the configuration items are as follows: " + sessionServerConfig.toString()); + initEnvironment(); startRaftClient(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 29e16dcda..2de74bb08 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -21,6 +21,8 @@ import java.util.Set; import java.util.regex.Pattern; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -1613,4 +1615,9 @@ public boolean isInvalidIgnored(String dataId) { public static int cpus() { return Runtime.getRuntime().availableProcessors(); } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerInitializer.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerInitializer.java index 163a152da..3d798072a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerInitializer.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerInitializer.java @@ -16,12 +16,13 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; +import java.util.concurrent.atomic.AtomicBoolean; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.SmartLifecycle; -import java.util.concurrent.atomic.AtomicBoolean; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; /** * SmartLifecycle for SessionServerBootstrap @@ -46,7 +47,7 @@ public boolean isAutoStartup() { @Override public void start() { try { - sessionServerBootstrap.doInitialized(); + sessionServerBootstrap.start(); LOGGER.info("Started SessionServer"); SessionServerInitializer.this.running.set(true); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java index 42f709eb5..a971fd445 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java @@ -88,8 +88,6 @@ public List getDatumSnapshotRequests(String connectId) { } } return list; - } else { - RENEW_LOGGER.warn("No publishers of connectId:{}!", connectId); } return null; } diff --git a/server/server/session/src/main/resources/logback-spring.xml b/server/server/session/src/main/resources/logback-spring.xml index 29683e0f1..568a803ca 100644 --- a/server/server/session/src/main/resources/logback-spring.xml +++ b/server/server/session/src/main/resources/logback-spring.xml @@ -74,7 +74,7 @@ true - DEBUG + ${LOG_LEVEL} ERROR @@ -293,7 +293,7 @@ - + From c321f54b8496e6701a4e9dd7568be5f89bcab08f Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 3 Jul 2019 19:05:49 +0800 Subject: [PATCH 051/161] update log --- .../sessionserver/handler/DatumSnapshotHandler.java | 6 ++---- .../sessionserver/handler/RenewDatumHandler.java | 9 +++++++-- .../server/session/scheduler/task/RenewDatumTask.java | 7 +++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 02e568825..7672d84ca 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -32,9 +32,9 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; -import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.util.ParaCheckUtil; /** @@ -73,9 +73,7 @@ public void checkParam(DatumSnapshotRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, DatumSnapshotRequest request) { - if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("doHandle: request={}", request); - } + RENEW_LOGGER.info("Received datumSnapshotRequest: {}", request); if (forwardService.needForward()) { LOGGER.warn("[forward] Snapshot request refused, request: {}", request); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index e67da5515..407423596 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -32,9 +32,9 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.cache.DatumCache; -import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.util.ParaCheckUtil; /** @@ -125,6 +125,11 @@ private boolean renewDatum(RenewDatumRequest request) { // record the renew timestamp datumLeaseManager.renew(connectId); - return StringUtils.equals(renewDigest, cacheDigest); + boolean result = StringUtils.equals(renewDigest, cacheDigest); + + if (!result) { + RENEW_LOGGER.info("Digest different! renewDatumRequest={}", request); + } + return result; } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index 37af59d2f..fb8c0254d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -57,10 +57,9 @@ public void execute() { try { Boolean result = dataNodeService.renewDatum(renewDatumRequest); if (!result) { - RENEW_LOGGER - .info( - "Renew datum request to dataNode got sub digest different! renewDatumRequest={}", - renewDatumRequest); + RENEW_LOGGER.info( + "Renew datum request to dataNode got digest different! renewDatumRequest={}", + renewDatumRequest); // send snapshot datum for the corresponding connId sessionRegistry.sendDatumSnapshot(renewDatumRequest.getConnectId()); From d7b6a1e63926e150cac9777672c825bbe79b1776 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 3 Jul 2019 19:15:00 +0800 Subject: [PATCH 052/161] fix update zero version,and fix log --- .../server/session/registry/SessionRegistry.java | 4 +++- .../scheduler/task/ReceivedDataMultiPushTask.java | 10 ++++++---- .../server/session/store/SessionInterests.java | 5 ++++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index e3b491be0..fa0a694f8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -321,7 +321,9 @@ public void cleanClientConnect() { connectId); } } - cancel(connectIds); + if (!connectIds.isEmpty()) { + cancel(connectIds); + } } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index 1d2e8bdd1..79860f222 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -189,17 +189,19 @@ public void onException(Channel channel, Throwable exception) { receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); } } else { - LOGGER.error("Retry Push ReceivedData times have exceeded!dataId:{}, group:{},url:{},taskId:{},dataPush:{},retryTimes:{}", - receivedData.getDataId(), receivedData.getGroup(), targetUrl,getTaskId(),dataPush,retryTimes); //set sessionInterests dataInfoId version zero DataInfo dataInfo = new DataInfo(receivedData.getInstanceId(), receivedData.getDataId(), receivedData.getGroup()); boolean result = sessionInterests.checkAndUpdateInterestVersionZero(receivedData.getSegment(), dataInfo.getDataInfoId()); if (result) { - LOGGER.info("Retry Push ReceivedData times have exceeded,set sessionInterests dataInfoId version zero! dataCenter:{} dataInfoId:{}!", receivedData.getSegment(), + LOGGER.warn("Retry Push ReceivedData times have exceeded,set sessionInterests dataInfoId version zero! url:{},taskId:{},dataPush:{},retryTimes:{},dataCenter:{},dataInfoId:{}!", + targetUrl,getTaskId(),dataPush,retryTimes, + receivedData.getSegment(), dataInfo.getDataInfoId()); } else { - LOGGER.info("Retry Push ReceivedData times have exceeded,but set sessionInterests dataInfoId version zero fail! dataCenter:{} dataInfoId:{}!", receivedData.getSegment(), + LOGGER.warn("Retry Push ReceivedData times have exceeded,but set sessionInterests dataInfoId version zero fail!url:{},taskId:{},dataPush:{},retryTimes:{},dataCenter:{},dataInfoId:{}!", + targetUrl,getTaskId(),dataPush,retryTimes, + receivedData.getSegment(), dataInfo.getDataInfoId()); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index c04244031..fd5cb9595 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -250,7 +250,10 @@ public boolean checkAndUpdateInterestVersions(String dataCenter, String dataInfo dataInfoVersions = newDataInfoVersions; } } - + //set zero + if (version.longValue() == 0l) { + return dataInfoVersions.put(dataInfoId, version) != null; + } return VersionsMapUtils.checkAndUpdateVersions(dataInfoVersions, dataInfoId, version); } finally { read.unlock(); From 8928acf241c79198b427336ebb39de3ffbd2c9a4 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 3 Jul 2019 19:18:35 +0800 Subject: [PATCH 053/161] add clientOffDelayMs default value --- .../sofa/registry/server/data/bootstrap/DataServerConfig.java | 2 +- .../data/remoting/sessionserver/handler/ClientOffHandler.java | 2 +- .../sofa/registry/server/data/renew/DatumLeaseManager.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index ccb19fe77..284fa8478 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -57,7 +57,7 @@ public class DataServerConfig { private int notifyIntervalMs; - private int clientOffDelayMs; + private int clientOffDelayMs = 1000; private int notifyTempDataIntervalMs; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java index d0ad8dfe9..5a775dea5 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java @@ -54,7 +54,7 @@ public Object doHandle(Channel channel, ClientOffRequest request) { List hosts = request.getHosts(); for (String host : hosts) { disconnectEventHandler.receive(new ClientDisconnectEvent(host, request.getGmtOccur(), - dataServerConfig.getClientOffDelayMs() * 10)); + dataServerConfig.getClientOffDelayMs())); } return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index 08dd318c2..cb22bbf01 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -143,8 +143,7 @@ private void scheduleEvictTask(String connectId, long delaySec) { if (isExpired) { LOGGER.info("ConnectId({}) expired, lastRenewTime is {}", connectId, format(lastRenewTime)); connectIdRenewTimestampMap.remove(connectId, lastRenewTime); - disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), - dataServerConfig.getClientOffDelayMs() * 10)); + disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), 0)); continued = false; } else { nextDelaySec = dataServerConfig.getDatumTimeToLiveSec() From 061b61297a5f3701b5f41215a1936e58ce54d9c3 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 3 Jul 2019 19:34:31 +0800 Subject: [PATCH 054/161] fix clientOffDelayMs --- .../data/remoting/sessionserver/handler/ClientOffHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java index 2ebd53d7f..61724135b 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java @@ -53,7 +53,7 @@ public Object doHandle(Channel channel, ClientOffRequest request) { List hosts = request.getHosts(); for (String host : hosts) { disconnectEventHandler.receive(new ClientDisconnectEvent(host, request.getGmtOccur(), - dataServerBootstrapConfig.getClientOffDelayMs() * 10)); + dataServerBootstrapConfig.getClientOffDelayMs())); } return CommonResponse.buildSuccessResponse(); } From 21d79c73b36f8bba250e469bcf8e1c54b70ec707 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 4 Jul 2019 16:29:21 +0800 Subject: [PATCH 055/161] Task(DatumSnapshot/Pub/UnPub) add retry strategy --- .../remoting/exchange/RequestException.java | 12 +- .../remoting/RequestExceptionTest.java | 15 +- .../meta/node/impl/DataNodeServiceImpl.java | 20 +- .../meta/node/impl/MetaNodeServiceImpl.java | 6 +- .../node/impl/SessionNodeServiceImpl.java | 20 +- .../bootstrap/SessionServerConfig.java | 18 +- .../bootstrap/SessionServerConfigBean.java | 192 +++++-- .../listener/DatumSnapshotTaskListener.java | 6 +- .../listener/PublishDataTaskListener.java | 6 +- .../listener/UnPublishDataTaskListener.java | 10 +- .../session/node/AbstractNodeManager.java | 21 +- .../server/session/node/DataNodeManager.java | 1 - .../session/node/SessionNodeManager.java | 4 +- .../node/service/ClientNodeServiceImpl.java | 6 +- .../node/service/DataNodeServiceImpl.java | 469 +++++++----------- .../node/service/MetaNodeServiceImpl.java | 7 +- .../scheduler/task/DatumSnapshotTask.java | 19 +- .../scheduler/task/PublishDataTask.java | 17 +- .../scheduler/task/RenewDatumTask.java | 5 +- .../scheduler/task/UnPublishDataTask.java | 19 +- 20 files changed, 448 insertions(+), 425 deletions(-) diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java index 3340bbf4b..848cb3bd0 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java @@ -23,7 +23,7 @@ * @author shangyu.wh * @version $Id: RequestException.java, v 0.1 2018-01-15 18:16 shangyu.wh Exp $ */ -public class RequestException extends Exception { +public class RequestException extends RuntimeException { private Request request; @@ -77,14 +77,14 @@ public RequestException(Throwable cause) { * get requestInfo from Request * @return */ - public String getRequestMessage() { + @Override + public String getMessage() { StringBuilder sb = new StringBuilder(); if (request != null) { - sb.append("Request url:").append(request.getRequestUrl()).append(" body:") - .append(request.getRequestBody()); - } else { - sb.append("Request data can not be null!"); + sb.append("request url: ").append(request.getRequestUrl()).append(", body: ") + .append(request.getRequestBody()).append(", "); } + sb.append("message: ").append(super.getMessage()); return sb.toString(); } } \ No newline at end of file diff --git a/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java b/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java index 7f98cc690..a0b546141 100644 --- a/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java +++ b/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java @@ -16,11 +16,12 @@ */ package com.alipay.sofa.registry.remoting; +import org.junit.Assert; +import org.junit.Test; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.remoting.exchange.RequestException; import com.alipay.sofa.registry.remoting.exchange.message.Request; -import org.junit.Assert; -import org.junit.Test; /** * @author xuanbei @@ -31,18 +32,18 @@ public class RequestExceptionTest { public void doTest() { RequestException exception = new RequestException("error message"); Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request data can not be null!", exception.getRequestMessage()); + Assert.assertEquals("Request data can not be null!", exception.getMessage()); RuntimeException runtimeException = new RuntimeException("error message"); exception = new RequestException(runtimeException); Assert.assertEquals("java.lang.RuntimeException: error message", exception.getMessage()); Assert.assertEquals(runtimeException, exception.getCause()); - Assert.assertEquals("Request data can not be null!", exception.getRequestMessage()); + Assert.assertEquals("Request data can not be null!", exception.getMessage()); exception = new RequestException("error message", runtimeException); Assert.assertEquals("error message", exception.getMessage()); Assert.assertEquals(runtimeException, exception.getCause()); - Assert.assertEquals("Request data can not be null!", exception.getRequestMessage()); + Assert.assertEquals("Request data can not be null!", exception.getMessage()); Request request = new Request() { @Override @@ -57,10 +58,10 @@ public URL getRequestUrl() { }; exception = new RequestException("error message", request); Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request url:null body:request body", exception.getRequestMessage()); + Assert.assertEquals("Request url:null body:request body", exception.getMessage()); exception = new RequestException("error message", request, runtimeException); Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request url:null body:request body", exception.getRequestMessage()); + Assert.assertEquals("Request url:null body:request body", exception.getMessage()); } } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java index d7bb82df1..26cd6ba53 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java @@ -16,6 +16,14 @@ */ package com.alipay.sofa.registry.server.meta.node.impl; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; @@ -34,13 +42,6 @@ import com.alipay.sofa.registry.server.meta.remoting.connection.NodeConnectManager; import com.alipay.sofa.registry.server.meta.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.meta.store.StoreService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * @@ -134,7 +135,7 @@ public URL getRequestUrl() { } } catch (RequestException e) { - LOGGER.error("Push dataNode list error! " + e.getRequestMessage(), e); + LOGGER.error("Push dataNode list error! " + e.getMessage(), e); exceptions.add(e); } catch (RuntimeException e) { LOGGER.error("Push dataNode list runtime error! ", e); @@ -178,8 +179,7 @@ public URL getRequestUrl() { } } catch (RequestException e) { - LOGGER.error("Notify status confirm error! " + e.getRequestMessage(), e); - throw new RuntimeException("Notify status confirm error! ", e); + throw new RuntimeException("Notify status confirm error: " + e.getMessage(), e); } } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/MetaNodeServiceImpl.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/MetaNodeServiceImpl.java index e0aead477..255287c97 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/MetaNodeServiceImpl.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/MetaNodeServiceImpl.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.meta.node.impl; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.GetChangeListRequest; @@ -27,7 +29,6 @@ import com.alipay.sofa.registry.remoting.exchange.message.Response; import com.alipay.sofa.registry.server.meta.node.MetaNodeService; import com.alipay.sofa.registry.server.meta.remoting.MetaClientExchanger; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -69,9 +70,8 @@ public URL getRequestUrl() { } } catch (RequestException e) { - LOGGER.error("MetaNodeService get DataCenter Nodes error! " + e.getRequestMessage(), e); throw new RuntimeException("MetaNodeService get DataCenter Nodes error! " - + e.getRequestMessage(), e); + + e.getMessage(), e); } } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/SessionNodeServiceImpl.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/SessionNodeServiceImpl.java index 9e3da8ab4..9aa2e3ff7 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/SessionNodeServiceImpl.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/SessionNodeServiceImpl.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.meta.node.impl; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; @@ -32,11 +38,6 @@ import com.alipay.sofa.registry.server.meta.remoting.connection.NodeConnectManager; import com.alipay.sofa.registry.server.meta.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.meta.store.StoreService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.Map; /** * @@ -113,8 +114,7 @@ public URL getRequestUrl() { confirmNodeIp); } catch (RequestException e) { - LOGGER.error("Push sessionNode list error! " + e.getRequestMessage(), e); - throw new RuntimeException("SessionNodeService push sessionNode list error!"); + throw new RuntimeException("Push sessionNode list error: " + e.getMessage(), e); } } @@ -163,8 +163,7 @@ public URL getRequestUrl() { sessionNodeExchanger.request(nodeChangeRequestRequest); } catch (RequestException e) { - LOGGER.error("Push sessionNode list error! " + e.getRequestMessage(), e); - throw new RuntimeException("SessionNodeService push dataNode list error!"); + throw new RuntimeException("Push sessionNode list error: " + e.getMessage(), e); } } } @@ -212,8 +211,7 @@ public URL getRequestUrl() { sessionNodeExchanger.request(request); } catch (RequestException e) { - LOGGER.error("Notify provide data change error! " + e.getRequestMessage(), e); - throw new RuntimeException("Notify provide data change error!"); + throw new RuntimeException("Notify provide data change error: " + e.getMessage(), e); } } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 52640a815..2a92a19d5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -63,16 +63,28 @@ public interface SessionServerConfig { int getCancelDataTaskRetryTimes(); - int getCancelDataTaskRetryFirstDelay(); + long getCancelDataTaskRetryFirstDelay(); long getCancelDataTaskRetryIncrementDelay(); int getPublishDataTaskRetryTimes(); + long getPublishDataTaskRetryFirstDelay(); + + long getPublishDataTaskRetryIncrementDelay(); + int getUnPublishDataTaskRetryTimes(); + long getUnPublishDataTaskRetryFirstDelay(); + + long getUnPublishDataTaskRetryIncrementDelay(); + int getDatumSnapshotTaskRetryTimes(); + long getDatumSnapshotTaskRetryFirstDelay(); + + long getDatumSnapshotTaskRetryIncrementDelay(); + int getRenewDatumTaskRetryTimes(); int getDataChangeFetchTaskRetryTimes(); @@ -163,7 +175,7 @@ public interface SessionServerConfig { int getWriteDataAcceptorQueueSize(); - int getClientOffRetryExecutorQueueSize(); + int getDataNodeRetryExecutorQueueSize(); - int getClientOffRetryExecutorThreadSize(); + int getDataNodeRetryExecutorThreadSize(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 2de74bb08..2f0800e58 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -78,15 +78,27 @@ public class SessionServerConfigBean implements SessionServerConfig { private int cancelDataTaskRetryTimes = 5; - private int cancelDataTaskRetryFirstDelay = 100; + private long cancelDataTaskRetryFirstDelay = 500; - private long cancelDataTaskRetryIncrementDelay = 200; + private long cancelDataTaskRetryIncrementDelay = 500; - private int publishDataTaskRetryTimes = 3; + private int publishDataTaskRetryTimes = 5; - private int unPublishDataTaskRetryTimes = 3; + private long publishDataTaskRetryFirstDelay = 500; - private int datumSnapshotTaskRetryTimes = 3; + private long publishDataTaskRetryIncrementDelay = 500; + + private int unPublishDataTaskRetryTimes = 5; + + private long unPublishDataTaskRetryFirstDelay = 500; + + private long unPublishDataTaskRetryIncrementDelay = 500; + + private int datumSnapshotTaskRetryTimes = 5; + + private long datumSnapshotTaskRetryFirstDelay = 1000; + + private long datumSnapshotTaskRetryIncrementDelay = 1000; private int renewDatumTaskRetryTimes = 3; @@ -191,9 +203,9 @@ public class SessionServerConfigBean implements SessionServerConfig { private int writeDataAcceptorQueueSize = 10000; - private int clientOffRetryExecutorQueueSize = 100000; + private int dataNodeRetryExecutorQueueSize = 1000000; - private int clientOffRetryExecutorThreadSize = 100; + private int dataNodeRetryExecutorThreadSize = 100; //end config for enterprise version @@ -246,41 +258,41 @@ public void setUserDataPushRetryExecutorThreadSize(int userDataPushRetryExecutor } /** - * Getter method for property clientOffRetryExecutorThreadSize. + * Getter method for property dataNodeRetryExecutorThreadSize. * - * @return property value of clientOffRetryExecutorThreadSize + * @return property value of dataNodeRetryExecutorThreadSize */ @Override - public int getClientOffRetryExecutorThreadSize() { - return clientOffRetryExecutorThreadSize; + public int getDataNodeRetryExecutorThreadSize() { + return dataNodeRetryExecutorThreadSize; } /** - * Setter method for property clientOffRetryExecutorThreadSize . + * Setter method for property dataNodeRetryExecutorThreadSize . * - * @param clientOffRetryExecutorThreadSize value to be assigned to property clientOffRetryExecutorThreadSize + * @param dataNodeRetryExecutorThreadSize value to be assigned to property dataNodeRetryExecutorThreadSize */ - public void setClientOffRetryExecutorThreadSize(int clientOffRetryExecutorThreadSize) { - this.clientOffRetryExecutorThreadSize = clientOffRetryExecutorThreadSize; + public void setDataNodeRetryExecutorThreadSize(int dataNodeRetryExecutorThreadSize) { + this.dataNodeRetryExecutorThreadSize = dataNodeRetryExecutorThreadSize; } /** - * Getter method for property clientOffRetryExecutorQueueSize. + * Getter method for property dataNodeRetryExecutorQueueSize. * - * @return property value of clientOffRetryExecutorQueueSize + * @return property value of dataNodeRetryExecutorQueueSize */ @Override - public int getClientOffRetryExecutorQueueSize() { - return clientOffRetryExecutorQueueSize; + public int getDataNodeRetryExecutorQueueSize() { + return dataNodeRetryExecutorQueueSize; } /** - * Setter method for property clientOffRetryExecutorQueueSize . + * Setter method for property dataNodeRetryExecutorQueueSize . * - * @param clientOffRetryExecutorQueueSize value to be assigned to property clientOffRetryExecutorQueueSize + * @param dataNodeRetryExecutorQueueSize value to be assigned to property dataNodeRetryExecutorQueueSize */ - public void setClientOffRetryExecutorQueueSize(int clientOffRetryExecutorQueueSize) { - this.clientOffRetryExecutorQueueSize = clientOffRetryExecutorQueueSize; + public void setDataNodeRetryExecutorQueueSize(int dataNodeRetryExecutorQueueSize) { + this.dataNodeRetryExecutorQueueSize = dataNodeRetryExecutorQueueSize; } /** @@ -553,19 +565,10 @@ public void setCancelDataTaskRetryTimes(int cancelDataTaskRetryTimes) { * @return property value of cancelDataTaskRetryFirstDelay */ @Override - public int getCancelDataTaskRetryFirstDelay() { + public long getCancelDataTaskRetryFirstDelay() { return cancelDataTaskRetryFirstDelay; } - /** - * Setter method for property cancelDataTaskRetryFirstDelay. - * - * @param cancelDataTaskRetryFirstDelay value to be assigned to property cancelDataTaskRetryFirstDelay - */ - public void setCancelDataTaskRetryFirstDelay(int cancelDataTaskRetryFirstDelay) { - this.cancelDataTaskRetryFirstDelay = cancelDataTaskRetryFirstDelay; - } - /** * Getter method for property cancelDataTaskRetryIncrementDelay. * @@ -585,6 +588,129 @@ public void setCancelDataTaskRetryIncrementDelay(long cancelDataTaskRetryIncreme this.cancelDataTaskRetryIncrementDelay = cancelDataTaskRetryIncrementDelay; } + /** + * Setter method for property cancelDataTaskRetryFirstDelay . + * + * @param cancelDataTaskRetryFirstDelay value to be assigned to property cancelDataTaskRetryFirstDelay + */ + public void setCancelDataTaskRetryFirstDelay(long cancelDataTaskRetryFirstDelay) { + this.cancelDataTaskRetryFirstDelay = cancelDataTaskRetryFirstDelay; + } + + /** + * Getter method for property publishDataTaskRetryFirstDelay. + * + * @return property value of publishDataTaskRetryFirstDelay + */ + @Override + public long getPublishDataTaskRetryFirstDelay() { + return publishDataTaskRetryFirstDelay; + } + + /** + * Setter method for property publishDataTaskRetryFirstDelay . + * + * @param publishDataTaskRetryFirstDelay value to be assigned to property publishDataTaskRetryFirstDelay + */ + public void setPublishDataTaskRetryFirstDelay(long publishDataTaskRetryFirstDelay) { + this.publishDataTaskRetryFirstDelay = publishDataTaskRetryFirstDelay; + } + + /** + * Getter method for property publishDataTaskRetryIncrementDelay. + * + * @return property value of publishDataTaskRetryIncrementDelay + */ + @Override + public long getPublishDataTaskRetryIncrementDelay() { + return publishDataTaskRetryIncrementDelay; + } + + /** + * Setter method for property publishDataTaskRetryIncrementDelay . + * + * @param publishDataTaskRetryIncrementDelay value to be assigned to property publishDataTaskRetryIncrementDelay + */ + public void setPublishDataTaskRetryIncrementDelay(long publishDataTaskRetryIncrementDelay) { + this.publishDataTaskRetryIncrementDelay = publishDataTaskRetryIncrementDelay; + } + + /** + * Getter method for property unPublishDataTaskRetryFirstDelay. + * + * @return property value of unPublishDataTaskRetryFirstDelay + */ + @Override + public long getUnPublishDataTaskRetryFirstDelay() { + return unPublishDataTaskRetryFirstDelay; + } + + /** + * Setter method for property unPublishDataTaskRetryFirstDelay . + * + * @param unPublishDataTaskRetryFirstDelay value to be assigned to property unPublishDataTaskRetryFirstDelay + */ + public void setUnPublishDataTaskRetryFirstDelay(long unPublishDataTaskRetryFirstDelay) { + this.unPublishDataTaskRetryFirstDelay = unPublishDataTaskRetryFirstDelay; + } + + /** + * Getter method for property unPublishDataTaskRetryIncrementDelay. + * + * @return property value of unPublishDataTaskRetryIncrementDelay + */ + @Override + public long getUnPublishDataTaskRetryIncrementDelay() { + return unPublishDataTaskRetryIncrementDelay; + } + + /** + * Setter method for property unPublishDataTaskRetryIncrementDelay . + * + * @param unPublishDataTaskRetryIncrementDelay value to be assigned to property unPublishDataTaskRetryIncrementDelay + */ + public void setUnPublishDataTaskRetryIncrementDelay(long unPublishDataTaskRetryIncrementDelay) { + this.unPublishDataTaskRetryIncrementDelay = unPublishDataTaskRetryIncrementDelay; + } + + /** + * Getter method for property datumSnapshotTaskRetryFirstDelay. + * + * @return property value of datumSnapshotTaskRetryFirstDelay + */ + @Override + public long getDatumSnapshotTaskRetryFirstDelay() { + return datumSnapshotTaskRetryFirstDelay; + } + + /** + * Setter method for property datumSnapshotTaskRetryFirstDelay . + * + * @param datumSnapshotTaskRetryFirstDelay value to be assigned to property datumSnapshotTaskRetryFirstDelay + */ + public void setDatumSnapshotTaskRetryFirstDelay(long datumSnapshotTaskRetryFirstDelay) { + this.datumSnapshotTaskRetryFirstDelay = datumSnapshotTaskRetryFirstDelay; + } + + /** + * Getter method for property datumSnapshotTaskRetryIncrementDelay. + * + * @return property value of datumSnapshotTaskRetryIncrementDelay + */ + @Override + public long getDatumSnapshotTaskRetryIncrementDelay() { + return datumSnapshotTaskRetryIncrementDelay; + } + + /** + * Setter method for property datumSnapshotTaskRetryIncrementDelay . + * + * @param datumSnapshotTaskRetryIncrementDelay value to be assigned to property datumSnapshotTaskRetryIncrementDelay + */ + public void setDatumSnapshotTaskRetryIncrementDelay(long datumSnapshotTaskRetryIncrementDelay) { + this.datumSnapshotTaskRetryIncrementDelay = datumSnapshotTaskRetryIncrementDelay; + } + /** * Getter method for property receivedDataMultiPushTaskRetryTimes. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java index 13d059a54..be81dc7d0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.DatumSnapshotTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; @@ -41,9 +40,6 @@ public class DatumSnapshotTaskListener implements TaskListener { @Autowired private DataNodeService dataNodeService; - @Autowired - private SessionServerConfig sessionServerConfig; - private TaskDispatcher singleTaskDispatcher; @Autowired @@ -63,7 +59,7 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { - SessionTask datumSnapshotTask = new DatumSnapshotTask(sessionServerConfig, dataNodeService); + SessionTask datumSnapshotTask = new DatumSnapshotTask(dataNodeService); datumSnapshotTask.setTaskEvent(event); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java index 88068b16f..a8f57e491 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; @@ -41,9 +40,6 @@ public class PublishDataTaskListener implements TaskListener { @Autowired private DataNodeService dataNodeService; - @Autowired - private SessionServerConfig sessionServerConfig; - private TaskDispatcher singleTaskDispatcher; @Autowired @@ -63,7 +59,7 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { - SessionTask publishDataTask = new PublishDataTask(sessionServerConfig, dataNodeService); + SessionTask publishDataTask = new PublishDataTask(dataNodeService); publishDataTask.setTaskEvent(event); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java index 781d977c7..566910f07 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java @@ -22,8 +22,8 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; -import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; +import com.alipay.sofa.registry.server.session.scheduler.task.UnPublishDataTask; import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; @@ -84,12 +84,12 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { - SessionTask publishDataTask = new PublishDataTask(sessionServerConfig, dataNodeService); + SessionTask unPublishDataTask = new UnPublishDataTask(dataNodeService); - publishDataTask.setTaskEvent(event); + unPublishDataTask.setTaskEvent(event); - singleTaskDispatcher.dispatch(publishDataTask.getTaskId(), publishDataTask, - publishDataTask.getExpiryTime()); + singleTaskDispatcher.dispatch(unPublishDataTask.getTaskId(), unPublishDataTask, + unPublishDataTask.getExpiryTime()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/AbstractNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/AbstractNodeManager.java index 274aa4dc4..ea956a588 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/AbstractNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/AbstractNodeManager.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.node; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.metaserver.GetNodesRequest; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; @@ -28,14 +37,6 @@ import com.alipay.sofa.registry.remoting.exchange.message.Response; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.util.VersionsMapUtils; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -148,9 +149,9 @@ public URL getRequestUrl() { } } catch (RequestException e) { - LOGGER.error("NodeManager get all dataCenter nodes error! " + e.getRequestMessage(), e); + LOGGER.error("NodeManager get all dataCenter nodes error! " + e.getMessage(), e); throw new RuntimeException("NodeManager get all dataCenter nodes error! " - + e.getRequestMessage(), e); + + e.getMessage(), e); } return nodeChangeResult; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java index d4bb467ef..d62baaff7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/DataNodeManager.java @@ -45,7 +45,6 @@ public class DataNodeManager extends AbstractNodeManager { public DataNode getNode(String dataInfoId) { DataNode dataNode = consistentHash.getNodeFor(dataInfoId); if (dataNode == null) { - LOGGER.error("calculate data node error!,dataInfoId={}", dataInfoId); throw new RuntimeException("DataNodeManager calculate data node error!,dataInfoId=" + dataInfoId); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java index ecfdea5ea..b20f0f66c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/SessionNodeManager.java @@ -94,9 +94,7 @@ public URL getRequestUrl() { metaNodeExchanger.request(renewNodesRequestRequest); } catch (RequestException e) { - LOGGER.error("SessionNodeManager renew node error! " + e.getRequestMessage(), e); - throw new RuntimeException("SessionNodeManager renew node error! " - + e.getRequestMessage(), e); + throw new RuntimeException("SessionNodeManager renew node error! " + e.getMessage(), e); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/ClientNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/ClientNodeServiceImpl.java index 7ab6333cf..788c6b844 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/ClientNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/ClientNodeServiceImpl.java @@ -16,12 +16,13 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.remoting.CallbackHandler; import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; import com.alipay.sofa.registry.remoting.exchange.RequestException; import com.alipay.sofa.registry.remoting.exchange.message.Request; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -57,8 +58,7 @@ public CallbackHandler getCallBackHandler() { clientNodeExchanger.request(request); } catch (RequestException e) { - throw new RuntimeException("Push data to client node error !" + e.getRequestMessage(), - e); + throw new RuntimeException("Push data to client node error !" + e.getMessage(), e); } } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 7be56acdd..2dcf96043 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import javax.annotation.PostConstruct; @@ -79,11 +80,11 @@ public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); asyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "Registry-DataNodeServiceImpl-ClientOffRetry-WheelTimer").build(), 100, - TimeUnit.MILLISECONDS, 1024, sessionServerConfig.getClientOffRetryExecutorThreadSize(), - sessionServerConfig.getClientOffRetryExecutorQueueSize(), threadFactoryBuilder - .setNameFormat("Registry-DataNodeServiceImpl-ClientOffRetry-WheelExecutor-%d") - .build(), new TaskFailedCallback() { + "Registry-DataNodeServiceImpl-Retry-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, + 1024, sessionServerConfig.getDataNodeRetryExecutorThreadSize(), + sessionServerConfig.getDataNodeRetryExecutorQueueSize(), threadFactoryBuilder + .setNameFormat("Registry-DataNodeServiceImpl-Retry-WheelExecutor-%d").build(), + new TaskFailedCallback() { @Override public void executionRejected(Throwable e) { LOGGER.error("executionRejected: " + e.getMessage(), e); @@ -98,98 +99,65 @@ public void executionFailed(Throwable e) { @Override public void register(final Publisher publisher) { - + Request request = buildPublishDataRequest(publisher); try { + sendRequest(request); + } catch (RequestException e) { + Consumer> bizConsumer = _request -> sendRequest(_request); + doRetryAsync("PublishData", request, bizConsumer, e, sessionServerConfig.getPublishDataTaskRetryTimes(), + sessionServerConfig.getPublishDataTaskRetryFirstDelay(), + sessionServerConfig.getPublishDataTaskRetryIncrementDelay()); + } + } - Request publisherRequest = new Request() { - - private URL url; - - @Override - public PublishDataRequest getRequestBody() { - PublishDataRequest publishDataRequest = new PublishDataRequest(); - publishDataRequest.setPublisher(publisher); - publishDataRequest.setSessionServerProcessId(SessionProcessIdGenerator - .getSessionProcessId()); - return publishDataRequest; - } - - @Override - public URL getRequestUrl() { - if (url == null) { - url = getUrl(publisher.getDataInfoId()); - } - return url; - } - }; - - Response response = dataNodeExchanger.request(publisherRequest); + private Request buildPublishDataRequest(Publisher publisher) { + return new Request() { + @Override + public PublishDataRequest getRequestBody() { + PublishDataRequest publishDataRequest = new PublishDataRequest(); + publishDataRequest.setPublisher(publisher); + publishDataRequest.setSessionServerProcessId(SessionProcessIdGenerator + .getSessionProcessId()); + return publishDataRequest; + } - Object result = response.getResult(); - if (result instanceof CommonResponse) { - CommonResponse commonResponse = (CommonResponse) result; - if (!commonResponse.isSuccess()) { - LOGGER.error( - "PublishDataRequest get server response failed!target url:{},message:{}", - publisherRequest.getRequestUrl(), commonResponse.getMessage()); - throw new RuntimeException( - "PublishDataRequest get server response failed! msg:" - + commonResponse.getMessage()); - } + @Override + public URL getRequestUrl() { + return getUrl(publisher.getDataInfoId()); } - } catch (RequestException e) { - LOGGER.error("DataNodeService register new publisher error! " + e.getRequestMessage(), - e); - throw new RuntimeException("DataNodeService register new publisher error! " - + e.getRequestMessage(), e); - } + }; } @Override public void unregister(final Publisher publisher) { + Request request = buildUnPublishDataRequest(publisher); try { - Request unPublishRequest = new Request() { - - private URL url; - - @Override - public UnPublishDataRequest getRequestBody() { - UnPublishDataRequest unPublishDataRequest = new UnPublishDataRequest(); - unPublishDataRequest.setDataInfoId(publisher.getDataInfoId()); - unPublishDataRequest.setRegisterId(publisher.getRegisterId()); - unPublishDataRequest.setRegisterTimestamp(publisher.getRegisterTimestamp()); - return unPublishDataRequest; - } - - @Override - public URL getRequestUrl() { - if (url == null) { - url = getUrl(publisher.getDataInfoId()); - } - return url; - } - }; + sendRequest(request); + } catch (RequestException e) { + Consumer> bizConsumer = _request -> sendRequest(_request); + doRetryAsync("UnPublishData", request, bizConsumer, e, sessionServerConfig.getUnPublishDataTaskRetryTimes(), + sessionServerConfig.getUnPublishDataTaskRetryFirstDelay(), + sessionServerConfig.getUnPublishDataTaskRetryIncrementDelay()); + } + } - Response response = dataNodeExchanger.request(unPublishRequest); + private Request buildUnPublishDataRequest(Publisher publisher) { + return new Request() { - Object result = response.getResult(); - if (result instanceof CommonResponse) { - CommonResponse commonResponse = (CommonResponse) result; - if (!commonResponse.isSuccess()) { - LOGGER.error( - "UnPublishRequest get server response failed!target url:{},message:{}", - unPublishRequest.getRequestUrl(), commonResponse.getMessage()); - throw new RuntimeException("UnPublishRequest get server response failed! msg:" - + commonResponse.getMessage()); - } + @Override + public UnPublishDataRequest getRequestBody() { + UnPublishDataRequest unPublishDataRequest = new UnPublishDataRequest(); + unPublishDataRequest.setDataInfoId(publisher.getDataInfoId()); + unPublishDataRequest.setRegisterId(publisher.getRegisterId()); + unPublishDataRequest.setRegisterTimestamp(publisher.getRegisterTimestamp()); + return unPublishDataRequest; } - } catch (RequestException e) { - LOGGER.error("Unregister publisher to data node error! " + e.getRequestMessage(), e); - throw new RuntimeException("Unregister publisher to data node error! " - + e.getRequestMessage(), e); - } - + @Override + public URL getRequestUrl() { + return getUrl(publisher.getDataInfoId()); + } + }; } @Override @@ -200,118 +168,53 @@ public void clientOff(List connectIds) { //get all local dataCenter data node Collection nodes = dataNodeManager.getDataCenterNodes(); if (nodes != null && nodes.size() > 0) { - for (Node node : nodes) { - Request clientOffRequestRequest = new Request() { - - private AtomicInteger retryTimes = new AtomicInteger(); - - @Override - public ClientOffRequest getRequestBody() { - ClientOffRequest clientOffRequest = new ClientOffRequest(); - clientOffRequest.setHosts(connectIds); - clientOffRequest.setGmtOccur(System.currentTimeMillis()); - return clientOffRequest; - } - - @Override - public URL getRequestUrl() { - return new URL(node.getNodeUrl().getIpAddress(), - sessionServerConfig.getDataServerPort()); - } - - @Override - public AtomicInteger getRetryTimes() { - return retryTimes; - } - }; + Request request = buildClientOffRequest(connectIds, node); try { - - Response response = dataNodeExchanger.request(clientOffRequestRequest); - Object result = response.getResult(); - if (result instanceof CommonResponse) { - CommonResponse commonResponse = (CommonResponse) result; - if (!commonResponse.isSuccess()) { - LOGGER - .error( - "ClientOff RequestRequest get response failed!target url:{},message:{}", - node.getNodeUrl(), commonResponse.getMessage()); - throw new RuntimeException( - "ClientOff RequestRequest get response failed! msg:" - + commonResponse.getMessage()); - } - } else { - LOGGER - .error( - "ClientOff Request has not get response or response type illegal!url:{}", - node.getNodeUrl()); - throw new RuntimeException( - "ClientOff Request has not get response or response type illegal!"); - } + sendRequest(request); } catch (Exception e) { - LOGGER.error("Client Off request error! ", e); - clientOffRetry(clientOffRequestRequest); - } + Consumer> bizConsumer = _request -> sendRequest(_request); + doRetryAsync("ClientOff", request, bizConsumer, e, + sessionServerConfig.getCancelDataTaskRetryTimes(), + sessionServerConfig.getCancelDataTaskRetryFirstDelay(), + sessionServerConfig.getCancelDataTaskRetryIncrementDelay()); + } } } } - private void clientOffRetry(Request clientOffRequestRequest) { + private Request buildClientOffRequest(List connectIds, Node node) { + return new Request() { - URL url = clientOffRequestRequest.getRequestUrl(); + private AtomicInteger retryTimes = new AtomicInteger(); - int retryTimes = clientOffRequestRequest.getRetryTimes().incrementAndGet(); + @Override + public ClientOffRequest getRequestBody() { + ClientOffRequest clientOffRequest = new ClientOffRequest(); + clientOffRequest.setHosts(connectIds); + clientOffRequest.setGmtOccur(System.currentTimeMillis()); + return clientOffRequest; + } - if (retryTimes <= sessionServerConfig.getCancelDataTaskRetryTimes()) { - asyncHashedWheelTimer.newTimeout(timeout -> { - try { - Response response = dataNodeExchanger.request(clientOffRequestRequest); - Object result = response.getResult(); - if (result instanceof CommonResponse) { - CommonResponse commonResponse = (CommonResponse) result; - if (!commonResponse.isSuccess()) { - LOGGER.error( - "ClientOff retry RequestRequest get response failed!retryTimes={},target url:{},message:{}", - retryTimes, url, commonResponse.getMessage()); - throw new RuntimeException( - "ClientOff retry RequestRequest get response failed! msg:" + commonResponse - .getMessage()); - } - } else { - LOGGER.error( - "ClientOff retry Request has not get response or response type illegal!retryTimes={},url:{}", - retryTimes, url); - throw new RuntimeException( - "ClientOff retry Request has not get response or response type illegal!"); - } - } catch (Exception e) { - clientOffRetry(clientOffRequestRequest); - } - }, getBlockTime(retryTimes), TimeUnit.MILLISECONDS); - } else { - LOGGER.error("ClientOff retryTimes have exceeded! stop retry! retryTimes={}, url={}, request={}", - retryTimes, url, clientOffRequestRequest.getRequestBody()); - } - } + @Override + public URL getRequestUrl() { + return new URL(node.getNodeUrl().getIpAddress(), + sessionServerConfig.getDataServerPort()); + } - private long getBlockTime(int retry) { - long initialSleepTime = TimeUnit.MILLISECONDS.toMillis(sessionServerConfig - .getCancelDataTaskRetryFirstDelay()); - long increment = TimeUnit.MILLISECONDS.toMillis(sessionServerConfig - .getCancelDataTaskRetryIncrementDelay()); - long result = initialSleepTime + (increment * (retry - 1)); - return result >= 0L ? result : 0L; + @Override + public AtomicInteger getRetryTimes() { + return retryTimes; + } + }; } @Override public void registerSessionProcessId(final SessionServerRegisterRequest sessionServerRegisterRequest, final URL dataUrl) { - try { - Request request = new Request() { - @Override public SessionServerRegisterRequest getRequestBody() { return sessionServerRegisterRequest; @@ -322,22 +225,18 @@ public URL getRequestUrl() { return dataUrl; } }; - dataNodeExchanger.request(request); } catch (RequestException e) { - LOGGER.error("DataNodeService register processId error! " + e.getRequestMessage(), e); throw new RuntimeException("DataNodeService register processId error! " - + e.getRequestMessage(), e); + + e.getMessage(), e); } } @Override public Map> fetchDataVersion(URL dataNodeUrl, Collection dataInfoIdList) { - Map> map = new HashMap<>(); try { - Request getDataVersionRequestRequest = new Request() { @Override public GetDataVersionRequest getRequestBody() { @@ -353,33 +252,22 @@ public URL getRequestUrl() { }; Response response = dataNodeExchanger.request(getDataVersionRequestRequest); - Object result = response.getResult(); - if (result instanceof GenericResponse) { - GenericResponse genericResponse = (GenericResponse) result; - if (genericResponse.isSuccess()) { - map = (Map>) genericResponse.getData(); - if (map.isEmpty()) { - LOGGER - .warn( - "GetDataVersionRequestRequest get response contains no data!target data Node url:{} about dataInfoIds size:{}", - dataNodeUrl.getAddressString(), dataInfoIdList.size()); - } - } else { - LOGGER.error("fetchDataVersion has not get fail response!msg:{}", - genericResponse.getMessage()); - throw new RuntimeException("fetchDataVersion has not get fail response! msg:" - + genericResponse.getMessage()); + GenericResponse genericResponse = (GenericResponse) result; + if (genericResponse.isSuccess()) { + map = (Map>) genericResponse.getData(); + if (map.isEmpty()) { + LOGGER + .warn( + "GetDataVersionRequestRequest get response contains no data!target data Node url:{} about dataInfoIds size:{}", + dataNodeUrl.getAddressString(), dataInfoIdList.size()); } } else { - LOGGER - .error("GetDataVersionRequestRequest has not get response or response type illegal!"); + throw new RuntimeException("fetchDataVersion has not get fail response! msg:" + + genericResponse.getMessage()); } - } catch (RequestException e) { - LOGGER.error("Fetch data Version request error! " + e.getRequestMessage(), e); - throw new RuntimeException( - "Fetch data Version request error! " + e.getRequestMessage(), e); + throw new RuntimeException("Fetch data Version request error! " + e.getMessage(), e); } return map; @@ -411,7 +299,6 @@ public Map getDatumMap(String dataInfoId, String dataCenterId) { Map map; try { - GetDataRequest getDataRequest = new GetDataRequest(); //dataCenter null means all dataCenters @@ -436,105 +323,127 @@ public URL getRequestUrl() { Response response = dataNodeExchanger.request(getDataRequestStringRequest); Object result = response.getResult(); - if (result instanceof GenericResponse) { - GenericResponse genericResponse = (GenericResponse) result; - if (genericResponse.isSuccess()) { - map = (Map) genericResponse.getData(); - if (map == null || map.isEmpty()) { - LOGGER.warn("GetDataRequest get response contains no datum!"); - } else { - map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); - } + GenericResponse genericResponse = (GenericResponse) result; + if (genericResponse.isSuccess()) { + map = (Map) genericResponse.getData(); + if (map == null || map.isEmpty()) { + LOGGER.warn("GetDataRequest get response contains no datum!"); } else { - LOGGER.error("GetDataRequest has not get fail response!msg:{}", genericResponse.getMessage()); - throw new RuntimeException( - "GetDataRequest has not get fail response! msg:" + genericResponse.getMessage()); + map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); } } else { - LOGGER.error("GetDataRequest has not get response or response type illegal!"); - throw new RuntimeException("GetDataRequest has not get response or response type illegal!"); + throw new RuntimeException( + "GetDataRequest has not get fail response! msg:" + genericResponse.getMessage()); } } catch (RequestException e) { - LOGGER.error("Get data request to data node error! " + e.getRequestMessage(), e); - throw new RuntimeException("Get data request to data node error! " + e.getRequestMessage(), e); + throw new RuntimeException("Get data request to data node error! " + e.getMessage(), e); } return map; } - private URL getUrl(String dataInfoId) { - - Node dataNode = dataNodeManager.getNode(dataInfoId); - if (dataNode != null) { - //meta push data node has not port - String dataIp = dataNode.getNodeUrl().getIpAddress(); - return new URL(dataIp, sessionServerConfig.getDataServerPort()); + @Override + public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { + Request request = buildRenewDatumRequest(renewDatumRequest); + Response response = dataNodeExchanger.request(request); + GenericResponse genericResponse = (GenericResponse) response.getResult(); + if (genericResponse.isSuccess()) { + return (Boolean) genericResponse.getData(); + } else { + throw new RuntimeException(String.format( + "RenewDatum get response not success, target url: %s, message: %s", + request.getRequestUrl(), genericResponse.getMessage())); } - return null; } - public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { - try { - Request request = new Request() { - @Override - public RenewDatumRequest getRequestBody() { - return renewDatumRequest; - } + private Request buildRenewDatumRequest(RenewDatumRequest renewDatumRequest) { + return new Request() { + @Override + public RenewDatumRequest getRequestBody() { + return renewDatumRequest; + } - @Override - public URL getRequestUrl() { - return new URL(renewDatumRequest.getDataServerIp(), - sessionServerConfig.getDataServerPort()); - } - }; + @Override + public URL getRequestUrl() { + return new URL(renewDatumRequest.getDataServerIp(), + sessionServerConfig.getDataServerPort()); + } + }; + } - Response response = dataNodeExchanger.request(request); + @Override + public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { + Request request = buildDatumSnapshotRequest(datumSnapshotRequest); + try { + sendRequest(request); + } catch (RequestException e) { + Consumer> bizConsumer = _request -> sendRequest(_request); + doRetryAsync("DatumSnapshot", request, bizConsumer, e, sessionServerConfig.getDatumSnapshotTaskRetryTimes(), + sessionServerConfig.getDatumSnapshotTaskRetryFirstDelay(), + sessionServerConfig.getDatumSnapshotTaskRetryIncrementDelay()); + } - Object result = response.getResult(); - if (result instanceof GenericResponse) { - GenericResponse genericResponse = (GenericResponse) result; - if (genericResponse.isSuccess()) { - return (Boolean) genericResponse.getData(); + } - } else { - LOGGER.error("renewDatum has not get fail response!msg:{}", - genericResponse.getMessage()); - throw new RuntimeException("renewDatum has not get fail response! msg:" - + genericResponse.getMessage()); - } - } else { - LOGGER.error("renewDatum has not get response or response type illegal!"); - throw new RuntimeException( - "renewDatum has not get response or response type illegal!"); + private Request buildDatumSnapshotRequest(DatumSnapshotRequest datumSnapshotRequest) { + return new Request() { + @Override + public DatumSnapshotRequest getRequestBody() { + return datumSnapshotRequest; } - } catch (RequestException e) { - LOGGER.error("RenewDatum request error! " + e.getRequestMessage(), e); - throw new RuntimeException("RenewDatum request error! " + e.getRequestMessage(), e); - } + @Override + public URL getRequestUrl() { + return new URL(datumSnapshotRequest.getDataServerIp(), + sessionServerConfig.getDataServerPort()); + } + }; } - public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { - try { - Request request = new Request() { - @Override - public DatumSnapshotRequest getRequestBody() { - return datumSnapshotRequest; - } + private void sendRequest(Request request) throws RequestException { + Response response = dataNodeExchanger.request(request); + Object result = response.getResult(); + CommonResponse commonResponse = (CommonResponse) result; + if (!commonResponse.isSuccess()) { + throw new RuntimeException(String.format( + "response not success, failed! target url: %s, message: %s", + request.getRequestUrl(), commonResponse.getMessage())); + } else { + throw new RuntimeException("type of response.result is illegal: " + + response.getResult()); + } + } - @Override - public URL getRequestUrl() { - return new URL(datumSnapshotRequest.getDataServerIp(), - sessionServerConfig.getDataServerPort()); + private void doRetryAsync(String bizName, Request request, Consumer bizConsumer, Exception e, int maxRetryTimes, + long firstDelay, long incrementDelay) { + int retryTimes = request.getRetryTimes().incrementAndGet(); + if (retryTimes <= maxRetryTimes) { + LOGGER.warn("%s failed, will retry again, retryTimes: {}, msg: {}", bizName, retryTimes, e.getMessage()); + asyncHashedWheelTimer.newTimeout(timeout -> { + try { + bizConsumer.accept(request); + } catch (Exception ex) { + doRetryAsync(bizName, request, bizConsumer, ex, maxRetryTimes, firstDelay, incrementDelay); } - }; + }, getDelayTime(retryTimes, firstDelay, incrementDelay), TimeUnit.MILLISECONDS); + } else { + LOGGER.error(String.format( + "%s failed, retryTimes have exceeded! stop retry! retryTimes: %s, url: %s, request: %s, msg: %s", + bizName, retryTimes, request.getRequestUrl(), request.getRequestBody(), e.getMessage()), e); + } + } - dataNodeExchanger.request(request); + private long getDelayTime(int retry, long firstDelay, long incrementDelay) { + long initialSleepTime = TimeUnit.MILLISECONDS.toMillis(firstDelay); + long increment = TimeUnit.MILLISECONDS.toMillis(incrementDelay); + long result = initialSleepTime + (increment * (retry - 1)); + return result >= 0L ? result : 0L; + } - } catch (RequestException e) { - LOGGER.error("DataNodeService rectify Datum error! " + e.getRequestMessage(), e); - throw new RuntimeException("DataNodeService rectify Datum error! " - + e.getRequestMessage(), e); - } + private URL getUrl(String dataInfoId) { + Node dataNode = dataNodeManager.getNode(dataInfoId); + //meta push data node has not port + String dataIp = dataNode.getNodeUrl().getIpAddress(); + return new URL(dataIp, sessionServerConfig.getDataServerPort()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/MetaNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/MetaNodeServiceImpl.java index 85eef1f9a..eaceb1e09 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/MetaNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/MetaNodeServiceImpl.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.common.model.store.URL; @@ -28,7 +30,6 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.RaftClientManager; import com.alipay.sofa.registry.server.session.node.SessionNodeManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -78,8 +79,8 @@ public URL getRequestUrl() { throw new RuntimeException("MetaNodeService fetch null provider data!"); } } catch (RequestException e) { - LOGGER.error("fetch provider data error! " + e.getRequestMessage(), e); - throw new RuntimeException("fetch provider data error! " + e.getRequestMessage(), e); + LOGGER.error("fetch provider data error! " + e.getMessage(), e); + throw new RuntimeException("fetch provider data error! " + e.getMessage(), e); } } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java index 46dfeed16..ae7d88f6e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DatumSnapshotTask.java @@ -17,7 +17,6 @@ package com.alipay.sofa.registry.server.session.scheduler.task; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; @@ -30,15 +29,11 @@ public class DatumSnapshotTask extends AbstractSessionTask { /** * transfer data to DataNode */ - private final DataNodeService dataNodeService; + private final DataNodeService dataNodeService; - private final SessionServerConfig sessionServerConfig; + private DatumSnapshotRequest datumSnapshotRequest; - private DatumSnapshotRequest datumSnapshotRequest; - - public DatumSnapshotTask(SessionServerConfig sessionServerConfig, - DataNodeService dataNodeService) { - this.sessionServerConfig = sessionServerConfig; + public DatumSnapshotTask(DataNodeService dataNodeService) { this.dataNodeService = dataNodeService; } @@ -64,13 +59,13 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "DATUM_SNAPSHOT_TASK{" + "taskId='" + getTaskId() + '\'' + ", datumSnapshotRequest=" - + datumSnapshotRequest + ", retry='" - + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + return String.format("DATUM_SNAPSHOT_TASK{ taskId=%s, datumSnapshotRequest=%s }", + getTaskId(), datumSnapshotRequest); } @Override public boolean checkRetryTimes() { - return checkRetryTimes(sessionServerConfig.getDatumSnapshotTaskRetryTimes()); + //dataNodeService.sendDatumSnapshot will be retry all the failed + return false; } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java index 1403d2c16..b5fa227a3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PublishDataTask.java @@ -17,7 +17,6 @@ package com.alipay.sofa.registry.server.session.scheduler.task; import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; @@ -28,14 +27,11 @@ */ public class PublishDataTask extends AbstractSessionTask { - private final DataNodeService dataNodeService; + private final DataNodeService dataNodeService; - private final SessionServerConfig sessionServerConfig; + private Publisher publisher; - private Publisher publisher; - - public PublishDataTask(SessionServerConfig sessionServerConfig, DataNodeService dataNodeService) { - this.sessionServerConfig = sessionServerConfig; + public PublishDataTask(DataNodeService dataNodeService) { this.dataNodeService = dataNodeService; } @@ -61,12 +57,13 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "PUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", publisher=" + publisher - + ", retry='" + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + return String + .format("PUBLISH_DATA_TASK{ taskId=%s, publisher=%s }", getTaskId(), publisher); } @Override public boolean checkRetryTimes() { - return checkRetryTimes(sessionServerConfig.getPublishDataTaskRetryTimes()); + //dataNodeService.register will be retry all the failed + return false; } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index fb8c0254d..9896aaeb8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -88,9 +88,8 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "RENEW_DATUM_TASK{" + "taskId='" + getTaskId() + '\'' + ", renewDatumRequest=" - + renewDatumRequest + ", retry='" - + sessionServerConfig.getPublishDataTaskRetryTimes() + '\'' + '}'; + return String.format("RENEW_DATUM_TASK{ taskId=%s, renewDatumRequest=%s }", getTaskId(), + renewDatumRequest); } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java index ab4814eae..46fa86298 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/UnPublishDataTask.java @@ -17,7 +17,6 @@ package com.alipay.sofa.registry.server.session.scheduler.task; import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; @@ -28,15 +27,11 @@ */ public class UnPublishDataTask extends AbstractSessionTask { - private final DataNodeService dataNodeService; + private final DataNodeService dataNodeService; - private final SessionServerConfig sessionServerConfig; + private Publisher unPublisher; - private Publisher unPublisher; - - public UnPublishDataTask(SessionServerConfig sessionServerConfig, - DataNodeService dataNodeService) { - this.sessionServerConfig = sessionServerConfig; + public UnPublishDataTask(DataNodeService dataNodeService) { this.dataNodeService = dataNodeService; } @@ -62,13 +57,13 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public String toString() { - return "UN_PUBLISH_DATA_TASK{" + "taskId='" + getTaskId() + '\'' + ", unPublisher=" - + unPublisher + ", retry='" + sessionServerConfig.getUnPublishDataTaskRetryTimes() - + '\'' + '}'; + return String.format("UN_PUBLISH_DATA_TASK{ taskId=%s, unPublisher=%s }", getTaskId(), + unPublisher); } @Override public boolean checkRetryTimes() { - return checkRetryTimes(sessionServerConfig.getUnPublishDataTaskRetryTimes()); + //dataNodeService.unregister will be retry all the failed + return false; } } \ No newline at end of file From 22286fbc68756dfc2f6db52a490f6690eb4e827a Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 4 Jul 2019 16:58:31 +0800 Subject: [PATCH 056/161] bugfix DataNodeServiceImpl: retryTimes --- .../node/service/DataNodeServiceImpl.java | 30 ++++++++++++++++++- .../session/remoting/DataNodeExchanger.java | 11 +++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 2dcf96043..5b0c1e43c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -112,6 +112,8 @@ public void register(final Publisher publisher) { private Request buildPublishDataRequest(Publisher publisher) { return new Request() { + private AtomicInteger retryTimes = new AtomicInteger(); + @Override public PublishDataRequest getRequestBody() { PublishDataRequest publishDataRequest = new PublishDataRequest(); @@ -125,6 +127,11 @@ public PublishDataRequest getRequestBody() { public URL getRequestUrl() { return getUrl(publisher.getDataInfoId()); } + + @Override + public AtomicInteger getRetryTimes() { + return retryTimes; + } }; } @@ -144,6 +151,8 @@ public void unregister(final Publisher publisher) { private Request buildUnPublishDataRequest(Publisher publisher) { return new Request() { + private AtomicInteger retryTimes = new AtomicInteger(); + @Override public UnPublishDataRequest getRequestBody() { UnPublishDataRequest unPublishDataRequest = new UnPublishDataRequest(); @@ -157,6 +166,11 @@ public UnPublishDataRequest getRequestBody() { public URL getRequestUrl() { return getUrl(publisher.getDataInfoId()); } + + @Override + public AtomicInteger getRetryTimes() { + return retryTimes; + } }; } @@ -358,6 +372,8 @@ public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { private Request buildRenewDatumRequest(RenewDatumRequest renewDatumRequest) { return new Request() { + private AtomicInteger retryTimes = new AtomicInteger(); + @Override public RenewDatumRequest getRequestBody() { return renewDatumRequest; @@ -368,6 +384,11 @@ public URL getRequestUrl() { return new URL(renewDatumRequest.getDataServerIp(), sessionServerConfig.getDataServerPort()); } + + @Override + public AtomicInteger getRetryTimes() { + return retryTimes; + } }; } @@ -387,6 +408,8 @@ public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { private Request buildDatumSnapshotRequest(DatumSnapshotRequest datumSnapshotRequest) { return new Request() { + private AtomicInteger retryTimes = new AtomicInteger(); + @Override public DatumSnapshotRequest getRequestBody() { return datumSnapshotRequest; @@ -397,6 +420,11 @@ public URL getRequestUrl() { return new URL(datumSnapshotRequest.getDataServerIp(), sessionServerConfig.getDataServerPort()); } + + @Override + public AtomicInteger getRetryTimes() { + return retryTimes; + } }; } @@ -418,7 +446,7 @@ private void doRetryAsync(String bizName, Request request, Consumer bizConsumer, long firstDelay, long incrementDelay) { int retryTimes = request.getRetryTimes().incrementAndGet(); if (retryTimes <= maxRetryTimes) { - LOGGER.warn("%s failed, will retry again, retryTimes: {}, msg: {}", bizName, retryTimes, e.getMessage()); + LOGGER.warn("{} failed, will retry again, retryTimes: {}, msg: {}", bizName, retryTimes, e.getMessage()); asyncHashedWheelTimer.newTimeout(timeout -> { try { bizConsumer.accept(request); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index fb49eb26f..fc7efc388 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.session.remoting; +import java.util.Collection; + +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -31,10 +37,6 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractClientHandler; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.Resource; -import java.util.Collection; /** * The type Data node exchanger. @@ -95,7 +97,6 @@ public Response request(Request request) throws RequestException { } response = () -> result; } catch (Exception e) { - LOGGER.error("DataNode Exchanger request data error!request={},url={}", request.getRequestBody(), url, e); throw new RequestException("DataNode Exchanger request data error!Request url:" + url, request, e); } From 341d4573da669bd5b21822e9c79599893a5eb142 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 4 Jul 2019 20:56:28 +0800 Subject: [PATCH 057/161] (1)cancelDataTaskListener duplicate (2)bugfix DataNodeServiceImpl and SessionRegistry --- .../remoting/exchange/RequestException.java | 2 +- .../bootstrap/SessionServerConfiguration.java | 1 + .../node/service/DataNodeServiceImpl.java | 71 ++++++++++--------- .../session/registry/SessionRegistry.java | 46 ++++++------ .../session/remoting/DataNodeExchanger.java | 1 - 5 files changed, 64 insertions(+), 57 deletions(-) diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java index 848cb3bd0..429684188 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java @@ -23,7 +23,7 @@ * @author shangyu.wh * @version $Id: RequestException.java, v 0.1 2018-01-15 18:16 shangyu.wh Exp $ */ -public class RequestException extends RuntimeException { +public class RequestException extends Exception { private Request request; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index edf9ea59a..a6e4071d1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -511,6 +511,7 @@ public TaskListener receivedConfigDataPushTaskListener(TaskListenerManager taskL } @Bean + @ConditionalOnMissingBean(name = "cancelDataTaskListener") public TaskListener cancelDataTaskListener(TaskListenerManager taskListenerManager) { TaskListener taskListener = new CancelDataTaskListener(); taskListenerManager.addTaskListener(taskListener); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 5b0c1e43c..dfca26ea5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; import javax.annotation.PostConstruct; @@ -103,10 +102,10 @@ public void register(final Publisher publisher) { try { sendRequest(request); } catch (RequestException e) { - Consumer> bizConsumer = _request -> sendRequest(_request); - doRetryAsync("PublishData", request, bizConsumer, e, sessionServerConfig.getPublishDataTaskRetryTimes(), - sessionServerConfig.getPublishDataTaskRetryFirstDelay(), - sessionServerConfig.getPublishDataTaskRetryIncrementDelay()); + doRetryAsync("PublishData", request, e, + sessionServerConfig.getPublishDataTaskRetryTimes(), + sessionServerConfig.getPublishDataTaskRetryFirstDelay(), + sessionServerConfig.getPublishDataTaskRetryIncrementDelay()); } } @@ -141,10 +140,10 @@ public void unregister(final Publisher publisher) { try { sendRequest(request); } catch (RequestException e) { - Consumer> bizConsumer = _request -> sendRequest(_request); - doRetryAsync("UnPublishData", request, bizConsumer, e, sessionServerConfig.getUnPublishDataTaskRetryTimes(), - sessionServerConfig.getUnPublishDataTaskRetryFirstDelay(), - sessionServerConfig.getUnPublishDataTaskRetryIncrementDelay()); + doRetryAsync("UnPublishData", request, e, + sessionServerConfig.getUnPublishDataTaskRetryTimes(), + sessionServerConfig.getUnPublishDataTaskRetryFirstDelay(), + sessionServerConfig.getUnPublishDataTaskRetryIncrementDelay()); } } @@ -186,12 +185,11 @@ public void clientOff(List connectIds) { Request request = buildClientOffRequest(connectIds, node); try { sendRequest(request); - } catch (Exception e) { - Consumer> bizConsumer = _request -> sendRequest(_request); - doRetryAsync("ClientOff", request, bizConsumer, e, - sessionServerConfig.getCancelDataTaskRetryTimes(), - sessionServerConfig.getCancelDataTaskRetryFirstDelay(), - sessionServerConfig.getCancelDataTaskRetryIncrementDelay()); + } catch (RequestException e) { + doRetryAsync("ClientOff", request, e, + sessionServerConfig.getCancelDataTaskRetryTimes(), + sessionServerConfig.getCancelDataTaskRetryFirstDelay(), + sessionServerConfig.getCancelDataTaskRetryIncrementDelay()); } } @@ -359,14 +357,19 @@ public URL getRequestUrl() { @Override public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { Request request = buildRenewDatumRequest(renewDatumRequest); - Response response = dataNodeExchanger.request(request); - GenericResponse genericResponse = (GenericResponse) response.getResult(); - if (genericResponse.isSuccess()) { - return (Boolean) genericResponse.getData(); - } else { - throw new RuntimeException(String.format( - "RenewDatum get response not success, target url: %s, message: %s", - request.getRequestUrl(), genericResponse.getMessage())); + String msgFormat = "RenewDatum get response not success, target url: %s, message: %s"; + try { + Response response = dataNodeExchanger.request(request); + GenericResponse genericResponse = (GenericResponse) response.getResult(); + if (genericResponse.isSuccess()) { + return (Boolean) genericResponse.getData(); + } else { + throw new RuntimeException(String.format(msgFormat, request.getRequestUrl(), + genericResponse.getMessage())); + } + } catch (RequestException e) { + throw new RuntimeException(String.format(msgFormat, request.getRequestUrl(), + e.getMessage())); } } @@ -398,10 +401,10 @@ public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { try { sendRequest(request); } catch (RequestException e) { - Consumer> bizConsumer = _request -> sendRequest(_request); - doRetryAsync("DatumSnapshot", request, bizConsumer, e, sessionServerConfig.getDatumSnapshotTaskRetryTimes(), - sessionServerConfig.getDatumSnapshotTaskRetryFirstDelay(), - sessionServerConfig.getDatumSnapshotTaskRetryIncrementDelay()); + doRetryAsync("DatumSnapshot", request, e, + sessionServerConfig.getDatumSnapshotTaskRetryTimes(), + sessionServerConfig.getDatumSnapshotTaskRetryFirstDelay(), + sessionServerConfig.getDatumSnapshotTaskRetryIncrementDelay()); } } @@ -436,22 +439,19 @@ private void sendRequest(Request request) throws RequestException { throw new RuntimeException(String.format( "response not success, failed! target url: %s, message: %s", request.getRequestUrl(), commonResponse.getMessage())); - } else { - throw new RuntimeException("type of response.result is illegal: " - + response.getResult()); } } - private void doRetryAsync(String bizName, Request request, Consumer bizConsumer, Exception e, int maxRetryTimes, - long firstDelay, long incrementDelay) { + private void doRetryAsync(String bizName, Request request, Exception e, int maxRetryTimes, long firstDelay, + long incrementDelay) { int retryTimes = request.getRetryTimes().incrementAndGet(); if (retryTimes <= maxRetryTimes) { LOGGER.warn("{} failed, will retry again, retryTimes: {}, msg: {}", bizName, retryTimes, e.getMessage()); asyncHashedWheelTimer.newTimeout(timeout -> { try { - bizConsumer.accept(request); - } catch (Exception ex) { - doRetryAsync(bizName, request, bizConsumer, ex, maxRetryTimes, firstDelay, incrementDelay); + sendRequest(request); + } catch (RequestException ex) { + doRetryAsync(bizName, request, ex, maxRetryTimes, firstDelay, incrementDelay); } }, getDelayTime(retryTimes, firstDelay, incrementDelay), TimeUnit.MILLISECONDS); } else { @@ -474,4 +474,5 @@ private URL getUrl(String dataInfoId) { String dataIp = dataNode.getNodeUrl().getIpAddress(); return new URL(dataIp, sessionServerConfig.getDataServerPort()); } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 2678780b7..5ab3f65b1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -59,65 +59,63 @@ */ public class SessionRegistry implements Registry { - private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, - "[Task]"); + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, "[Task]"); - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[SessionRegistry]"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger(ValueConstants.LOGGER_NAME_RENEW, "[SessionRegistry]"); /** * store subscribers */ @Autowired - private Interests sessionInterests; + private Interests sessionInterests; /** * store watchers */ @Autowired - private Watchers sessionWatchers; + private Watchers sessionWatchers; /** * store publishers */ @Autowired - private DataStore sessionDataStore; + private DataStore sessionDataStore; /** * transfer data to DataNode */ @Autowired - private DataNodeService dataNodeService; + private DataNodeService dataNodeService; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; /** * calculate data node url */ @Autowired - private NodeManager dataNodeManager; + private NodeManager dataNodeManager; @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Exchange boltExchange; + private Exchange boltExchange; @Autowired private SessionRegistryStrategy sessionRegistryStrategy; @Autowired - private RenewService renewService; + private RenewService renewService; @Autowired - private WriteDataAcceptor writeDataAcceptor; + private WriteDataAcceptor writeDataAcceptor; @Override public void register(StoreData storeData) { @@ -228,6 +226,14 @@ public String getConnectId() { public void cancel(List connectIds) { //update local firstly, data node send error depend on renew check List connectIdsWithPub = new ArrayList<>(); + removeFromSession(connectIds, connectIdsWithPub); + + // clientOff to dataNode async + clientOffToDataNode(connectIdsWithPub); + + } + + private void removeFromSession(List connectIds, List connectIdsWithPub) { for (String connectId : connectIds) { if (sessionDataStore.deleteByConnectId(connectId)) { connectIdsWithPub.add(connectId); @@ -235,7 +241,9 @@ public void cancel(List connectIds) { sessionInterests.deleteByConnectId(connectId); sessionWatchers.deleteByConnectId(connectId); } + } + private void clientOffToDataNode(List connectIdsWithPub) { // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) // are handed over to WriteDataAcceptor for (String connectId : connectIdsWithPub) { @@ -257,7 +265,6 @@ public String getConnectId() { }); writeDataAcceptor.remove(connectId); } - } @Override @@ -326,9 +333,8 @@ private void checkConnect(StoreData storeData) { Channel channel = sessionServer.getChannel(baseInfo.getSourceAddress()); if (channel == null) { - throw new RuntimeException(String.format( - "Register address %s has not connected session server!", - baseInfo.getSourceAddress())); + throw new RuntimeException(String.format("Register address %s has not connected session server!", + baseInfo.getSourceAddress())); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index fc7efc388..fe1c2666a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -91,7 +91,6 @@ public Response request(Request request) throws RequestException { final Object result = sessionClient.sendSync(channel, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); if (result == null) { - LOGGER.error("DataNode Exchanger request data get null result!Request url:" + url); throw new RequestException("DataNode Exchanger request data get null result!", request); } From 46c93f35684d5d73ac3300077f364768358c2304 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 5 Jul 2019 00:44:49 +0800 Subject: [PATCH 058/161] refactor datum version --- .../common/model/dataserver/Datum.java | 9 ++- .../sofa/registry/util/DatumVersionUtil.java | 79 +++++++++++++++++++ .../data/change/event/ClientChangeEvent.java | 4 +- .../change/event/DataChangeEventQueue.java | 16 ++-- .../server/data/datasync/sync/Acceptor.java | 4 +- .../converter/ReceivedDataConverter.java | 17 ++-- .../session/registry/SessionRegistry.java | 35 ++++---- .../scheduler/task/DataChangeFetchTask.java | 44 +++++------ .../test/sync/MockSyncDataHandler.java | 27 ++++--- 9 files changed, 162 insertions(+), 73 deletions(-) create mode 100644 server/common/util/src/main/java/com/alipay/sofa/registry/util/DatumVersionUtil.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java index 61044ea8f..246363fa0 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java @@ -16,13 +16,14 @@ */ package com.alipay.sofa.registry.common.model.dataserver; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.common.model.store.WordCache; - import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; +import com.alipay.sofa.registry.util.DatumVersionUtil; + /** * datum store in dataserver * @@ -96,7 +97,7 @@ public Datum(Publisher publisher, String dataCenter, long version) { } public void updateVersion() { - this.version = System.currentTimeMillis(); + this.version = DatumVersionUtil.nextId(); } /** diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/util/DatumVersionUtil.java b/server/common/util/src/main/java/com/alipay/sofa/registry/util/DatumVersionUtil.java new file mode 100644 index 000000000..78112433b --- /dev/null +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/util/DatumVersionUtil.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.util; + +/** + * generates ID: 49 bit millisecond timestamp + 15 bit incremental ID + * + * refer to: https://github.com/twitter/snowflake + * + * @author kezhu.wukz + * @version $Id: DatumVersionUtil.java, v 0.1 2019-07-04 22:05 kezhu.wukz Exp $ + */ +public class DatumVersionUtil { + + private static long sequence = 0L; + + /** Tue Jan 01 00:00:00 CST 2019 */ + private static long twepoch = 1546272000000L; + + private static long sequenceBits = 15L; + private static long timestampLeftShift = sequenceBits; + private static long sequenceMask = -1L ^ (-1L << sequenceBits); + + private static long lastTimestamp = -1L; + + public synchronized static long nextId() { + long timestamp = timeGen(); + + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format( + "Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp + - timestamp)); + } + + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = untilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + + lastTimestamp = timestamp; + + return ((timestamp - twepoch) << timestampLeftShift) | sequence; + } + + public static long getRealTimestamp(long id) { + return (id >> timestampLeftShift) + twepoch; + } + + private static long untilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + private static long timeGen() { + return System.currentTimeMillis(); + } + +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/ClientChangeEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/ClientChangeEvent.java index c063f50d4..b2eb9f036 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/ClientChangeEvent.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/ClientChangeEvent.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.change.event; +import com.alipay.sofa.registry.util.DatumVersionUtil; + /** * * @author qian.lqlq @@ -41,7 +43,7 @@ public ClientChangeEvent(String host, String dataCenter, long occurredTimestamp) this.host = host; this.dataCenter = dataCenter; this.occurredTimestamp = occurredTimestamp; - this.version = System.currentTimeMillis(); + this.version = DatumVersionUtil.nextId(); } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index bf1b2a187..277751530 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -37,6 +37,7 @@ import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.node.DataServerNode; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; +import com.alipay.sofa.registry.util.DatumVersionUtil; import com.google.common.collect.Interners; /** @@ -181,12 +182,12 @@ private ChangeData getChangeData(String dataCenter, String dataInfoId, * */ public void start() { - Executor executor = ExecutorFactory.newSingleThreadExecutor( - String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), getName())); + Executor executor = ExecutorFactory + .newSingleThreadExecutor(String.format("%s_%s", DataChangeEventQueue.class.getSimpleName(), getName())); executor.execute(() -> { while (true) { try { - IDataChangeEvent event = eventQueue.take(); + IDataChangeEvent event = eventQueue.take(); DataChangeScopeEnum scope = event.getScope(); if (scope == DataChangeScopeEnum.DATUM) { DataChangeEvent dataChangeEvent = (DataChangeEvent) event; @@ -195,8 +196,8 @@ public void start() { addTempChangeData(dataChangeEvent.getDatum(), dataChangeEvent.getChangeType(), dataChangeEvent.getSourceType()); } else { - handleDatum(dataChangeEvent.getChangeType(), - dataChangeEvent.getSourceType(), dataChangeEvent.getDatum()); + handleDatum(dataChangeEvent.getChangeType(), dataChangeEvent.getSourceType(), + dataChangeEvent.getDatum()); } } else if (scope == DataChangeScopeEnum.CLIENT) { handleClientOff((ClientChangeEvent) event); @@ -314,7 +315,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { long currentTimeStamp = System.currentTimeMillis(); Datum datum = new Datum(new UnPublisher(publisher.getDataInfoId(), publisher.getRegisterId(), currentTimeStamp), event.getDataCenter(), - currentTimeStamp); + DatumVersionUtil.nextId()); datum.setContainsUnPub(true); handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); unPubSize++; @@ -322,8 +323,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { } } for (Publisher publisher : snapshotPubMap.values()) { - long currentTimeStamp = System.currentTimeMillis(); - Datum datum = new Datum(publisher, event.getDataCenter(), currentTimeStamp); + Datum datum = new Datum(publisher, event.getDataCenter(), DatumVersionUtil.nextId()); handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); } LOGGER.info( diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java index 89c7886bb..c4cbfce26 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java @@ -35,6 +35,7 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.datasync.Operator; +import com.alipay.sofa.registry.util.DatumVersionUtil; /** * @@ -253,7 +254,8 @@ private boolean isFull() { private boolean isExpired(int durationSECS, long peekVersion) { durationSECS = (durationSECS > 0) ? durationSECS * 1000 : DEFAULT_DURATION_SECS * 1000; - boolean ret = System.currentTimeMillis() > peekVersion + durationSECS; + boolean ret = System.currentTimeMillis() > DatumVersionUtil.getRealTimestamp(peekVersion) + + durationSECS; if (LOGGER.isDebugEnabled()) { LOGGER.debug("now:" + System.currentTimeMillis() + " peek:" + peekVersion + " du:" + durationSECS + " result:" + ret); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/converter/ReceivedDataConverter.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/converter/ReceivedDataConverter.java index 5280cc0a5..70fcc9f15 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/converter/ReceivedDataConverter.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/converter/ReceivedDataConverter.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.session.converter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.ServerDataBox; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -28,13 +35,7 @@ import com.alipay.sofa.registry.core.model.ScopeEnum; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; +import com.alipay.sofa.registry.util.DatumVersionUtil; /** * The type Received data converter. @@ -173,7 +174,7 @@ public static ReceivedData getReceivedDataMulti(Map datums, Scope String regionLocal = subscriber.getCell(); receivedData.setLocalZone(regionLocal); - receivedData.setVersion(System.currentTimeMillis()); + receivedData.setVersion(DatumVersionUtil.nextId()); Map> swizzMap = new HashMap<>(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 5ab3f65b1..bb636f839 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -59,63 +59,65 @@ */ public class SessionRegistry implements Registry { - private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, "[Task]"); + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, + "[Task]"); - private static final Logger RENEW_LOGGER = LoggerFactory - .getLogger(ValueConstants.LOGGER_NAME_RENEW, "[SessionRegistry]"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[SessionRegistry]"); /** * store subscribers */ @Autowired - private Interests sessionInterests; + private Interests sessionInterests; /** * store watchers */ @Autowired - private Watchers sessionWatchers; + private Watchers sessionWatchers; /** * store publishers */ @Autowired - private DataStore sessionDataStore; + private DataStore sessionDataStore; /** * transfer data to DataNode */ @Autowired - private DataNodeService dataNodeService; + private DataNodeService dataNodeService; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; /** * calculate data node url */ @Autowired - private NodeManager dataNodeManager; + private NodeManager dataNodeManager; @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Exchange boltExchange; + private Exchange boltExchange; @Autowired private SessionRegistryStrategy sessionRegistryStrategy; @Autowired - private RenewService renewService; + private RenewService renewService; @Autowired - private WriteDataAcceptor writeDataAcceptor; + private WriteDataAcceptor writeDataAcceptor; @Override public void register(StoreData storeData) { @@ -333,8 +335,9 @@ private void checkConnect(StoreData storeData) { Channel channel = sessionServer.getChannel(baseInfo.getSourceAddress()); if (channel == null) { - throw new RuntimeException(String.format("Register address %s has not connected session server!", - baseInfo.getSourceAddress())); + throw new RuntimeException(String.format( + "Register address %s has not connected session server!", + baseInfo.getSourceAddress())); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 8a95b8548..a38068bf7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -39,15 +48,7 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; - -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; +import com.alipay.sofa.registry.util.DatumVersionUtil; /** * @@ -212,8 +213,7 @@ public PushTaskClosure getTaskClosure() { dataInfoId, version); } else { LOGGER.info("Push all tasks success,but dataCenter:{} dataInfoId:{} version:{} need not update!", - dataCenter, - dataInfoId, version); + dataCenter, dataInfoId, version); } } else { LOGGER.warn( @@ -232,9 +232,8 @@ private void evictReSubscribers(Collection subscribersPush) { } private void fireReceivedDataMultiPushTask(Datum datum, List subscriberRegisterIdList, - Collection subscribers, - ScopeEnum scopeEnum, Subscriber subscriber, - PushTaskClosure pushTaskClosure) { + Collection subscribers, ScopeEnum scopeEnum, + Subscriber subscriber, PushTaskClosure pushTaskClosure) { String dataId = datum.getDataId(); Predicate zonePredicate = (zone) -> { if (!sessionServerConfig.getSessionServerRegion().equals(zone)) { @@ -244,14 +243,15 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR } else if (ScopeEnum.dataCenter == scopeEnum) { // disable zone config - return sessionServerConfig.isInvalidForeverZone(zone) - && !sessionServerConfig.isInvalidIgnored(dataId); + return sessionServerConfig.isInvalidForeverZone(zone) && !sessionServerConfig + .isInvalidIgnored(dataId); } } return false; }; - ReceivedData receivedData = ReceivedDataConverter.getReceivedDataMulti(datum, scopeEnum, - subscriberRegisterIdList, sessionServerConfig.getSessionServerRegion(), zonePredicate); + ReceivedData receivedData = ReceivedDataConverter + .getReceivedDataMulti(datum, scopeEnum, subscriberRegisterIdList, + sessionServerConfig.getSessionServerRegion(), zonePredicate); //trigger push to client node Map parameter = new HashMap<>(); @@ -259,8 +259,8 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR TaskEvent taskEvent = new TaskEvent(parameter, TaskType.RECEIVED_DATA_MULTI_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - taskLogger.info("send {} taskURL:{},taskScope:{},,taskId={}", taskEvent.getTaskType(), subscriber.getSourceAddress(), - scopeEnum,taskEvent.getTaskId()); + taskLogger.info("send {} taskURL:{},taskScope:{},,taskId={}", taskEvent.getTaskType(), + subscriber.getSourceAddress(), scopeEnum, taskEvent.getTaskId()); taskListenerManager.sendTaskEvent(taskEvent); } @@ -282,7 +282,7 @@ private void fireUserDataElementPushTask(InetSocketAddress address, Datum datum, TaskEvent taskEvent = new TaskEvent(TaskType.USER_DATA_ELEMENT_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); - taskEvent.setSendTimeStamp(datum.getVersion()); + taskEvent.setSendTimeStamp(DatumVersionUtil.getRealTimestamp(datum.getVersion())); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); taskEvent.setAttribute(Constant.PUSH_CLIENT_URL, new URL(address)); @@ -302,7 +302,7 @@ private void fireUserDataElementMultiPushTask(InetSocketAddress address, Datum d TaskEvent taskEvent = new TaskEvent(TaskType.USER_DATA_ELEMENT_MULTI_PUSH_TASK); taskEvent.setTaskClosure(pushTaskClosure); - taskEvent.setSendTimeStamp(datum.getVersion()); + taskEvent.setSendTimeStamp(DatumVersionUtil.getRealTimestamp(datum.getVersion())); taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); taskEvent.setAttribute(Constant.PUSH_CLIENT_DATUM, datum); taskEvent.setAttribute(Constant.PUSH_CLIENT_URL, new URL(address)); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/MockSyncDataHandler.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/MockSyncDataHandler.java index 502fc2e30..732922460 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/MockSyncDataHandler.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/MockSyncDataHandler.java @@ -16,6 +16,18 @@ */ package com.alipay.sofa.registry.test.sync; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_ADDRESS; +import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_DATACENTER; +import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_REGION; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.ServerDataBox; @@ -28,20 +40,9 @@ import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; +import com.alipay.sofa.registry.util.DatumVersionUtil; import com.alipay.sofa.registry.util.ParaCheckUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; -import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_ADDRESS; -import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_DATACENTER; -import static com.alipay.sofa.registry.test.BaseIntegrationTest.LOCAL_REGION; - /** * mock SyncDataHandler, it will return fixed Datum. * @@ -51,7 +52,7 @@ public class MockSyncDataHandler extends AbstractServerHandler { public static String dataId = "test-dataId-" + System.currentTimeMillis(); public static String value = "MockSyncDataHandler"; - public static long version = System.currentTimeMillis(); + public static long version = DatumVersionUtil.nextId(); @Override public void checkParam(SyncDataRequest request) throws RuntimeException { From fddae5d21591aa2ccfb2430883fb2eaf477748c0 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 5 Jul 2019 14:24:28 +0800 Subject: [PATCH 059/161] add hessian black list --- .../src/main/resources/security/blacklist.txt | 78 +++++++++++++++++++ .../src/main/resources/security/blacklist.txt | 78 +++++++++++++++++++ .../src/main/resources/security/blacklist.txt | 78 +++++++++++++++++++ .../src/main/resources/security/blacklist.txt | 78 +++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 server/server/data/src/main/resources/security/blacklist.txt create mode 100644 server/server/integration/src/main/resources/security/blacklist.txt create mode 100644 server/server/meta/src/main/resources/security/blacklist.txt create mode 100644 server/server/session/src/main/resources/security/blacklist.txt diff --git a/server/server/data/src/main/resources/security/blacklist.txt b/server/server/data/src/main/resources/security/blacklist.txt new file mode 100644 index 000000000..e3413f8d4 --- /dev/null +++ b/server/server/data/src/main/resources/security/blacklist.txt @@ -0,0 +1,78 @@ +org.codehaus.groovy.runtime.MethodClosure +clojure.core$constantly +clojure.main$eval_opt +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactory +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactoryImpl +com.alibaba.citrus.springext.util.SpringExtUtil.AbstractProxy +com.alipay.custrelation.service.model.redress.Pair +com.caucho.hessian.test.TestCons +com.mchange.v2.c3p0.JndiRefForwardingDataSource +com.mchange.v2.c3p0.WrapperConnectionPoolDataSource +com.rometools.rome.feed.impl.EqualsBean +com.rometools.rome.feed.impl.ToStringBean +com.sun.jndi.rmi.registry.BindingEnumeration +com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl +com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl +com.sun.rowset.JdbcRowSetImpl +com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data +java.rmi.server.UnicastRemoteObject +java.security.SignedObject +java.util.ServiceLoader$LazyIterator +javax.imageio.ImageIO$ContainsFilter +javax.imageio.spi.ServiceRegistry +javax.management.BadAttributeValueExpException +javax.naming.InitialContext +javax.naming.spi.ObjectFactory +javax.script.ScriptEngineManager +javax.sound.sampled.AudioFormat$Encoding +org.apache.carbondata.core.scan.expression.ExpressionResult +org.apache.commons.dbcp +org.apache.commons.dbcp2 +org.apache.commons.beanutils +org.apache.ibatis.executor.loader.AbstractSerialStateHolder +org.apache.ibatis.executor.loader.CglibSerialStateHolder +org.apache.ibatis.executor.loader.JavassistSerialStateHolder +org.apache.ibatis.executor.loader.cglib.CglibProxyFactory +org.apache.ibatis.executor.loader.javassist.JavassistSerialStateHolder +org.apache.tomcat.dbcp.dbcp.datasources.SharedPoolDataSource +org.apache.wicket.util.upload.DiskFileItem +org.apache.xalan.xsltc.trax.TemplatesImpl +org.apache.xbean.naming.context.ContextUtil$ReadOnlyBinding +org.apache.xpath.XPathContext +org.eclipse.jetty.util.log.LoggerLog +org.geotools.filter.ConstantExpression +org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder +org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor +org.springframework.beans.factory.BeanFactory +org.springframework.beans.factory.config.PropertyPathFactoryBean +org.springframework.beans.factory.support.DefaultListableBeanFactory +org.springframework.jndi.support.SimpleJndiBeanFactory +org.springframework.orm.jpa.AbstractEntityManagerFactoryBean +org.springframework.transaction.jta.JtaTransactionManager +org.yaml.snakeyaml.tokens.DirectiveToken +sun.rmi.server.UnicastRef +javax.management.ImmutableDescriptor +org.springframework.jndi.JndiObjectTargetSource +ch.qos.logback.core.db.JNDIConnectionSource +java.beans.Expression +javassist.bytecode +javassist.tools.web.Viewer +javassist.util.proxy.SerializedProxy +org.apache.ibatis.javassist.bytecode +org.apache.ibatis.javassist.tools.web.Viewer +org.apache.ibatis.javassist.util.proxy.SerializedProxy +org.springframework.beans.factory.config.MethodInvokingFactoryBean +com.alibaba.druid +com.sun.corba +com.sun.org.apache.bcel +com.sun.org.apache.xml +com.sun.org.apache.xpath +org.apache.zookeeper.Shell +org.apache.tomcat.dbcp.dbcp.BasicDataSource +net.bytebuddy.dynamic.loading.ByteArrayClassLoader +org.jboss.resteasy.plugins +org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler +org.apache.velocity.runtime.resource.Resource +org.springframework.expression.spel.ast.Indexer$PropertyIndexingValueRef +org.mortbay.log.Slf4jLog +org.springframework.expression.spel.ast.MethodReference$MethodValueRef \ No newline at end of file diff --git a/server/server/integration/src/main/resources/security/blacklist.txt b/server/server/integration/src/main/resources/security/blacklist.txt new file mode 100644 index 000000000..e3413f8d4 --- /dev/null +++ b/server/server/integration/src/main/resources/security/blacklist.txt @@ -0,0 +1,78 @@ +org.codehaus.groovy.runtime.MethodClosure +clojure.core$constantly +clojure.main$eval_opt +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactory +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactoryImpl +com.alibaba.citrus.springext.util.SpringExtUtil.AbstractProxy +com.alipay.custrelation.service.model.redress.Pair +com.caucho.hessian.test.TestCons +com.mchange.v2.c3p0.JndiRefForwardingDataSource +com.mchange.v2.c3p0.WrapperConnectionPoolDataSource +com.rometools.rome.feed.impl.EqualsBean +com.rometools.rome.feed.impl.ToStringBean +com.sun.jndi.rmi.registry.BindingEnumeration +com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl +com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl +com.sun.rowset.JdbcRowSetImpl +com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data +java.rmi.server.UnicastRemoteObject +java.security.SignedObject +java.util.ServiceLoader$LazyIterator +javax.imageio.ImageIO$ContainsFilter +javax.imageio.spi.ServiceRegistry +javax.management.BadAttributeValueExpException +javax.naming.InitialContext +javax.naming.spi.ObjectFactory +javax.script.ScriptEngineManager +javax.sound.sampled.AudioFormat$Encoding +org.apache.carbondata.core.scan.expression.ExpressionResult +org.apache.commons.dbcp +org.apache.commons.dbcp2 +org.apache.commons.beanutils +org.apache.ibatis.executor.loader.AbstractSerialStateHolder +org.apache.ibatis.executor.loader.CglibSerialStateHolder +org.apache.ibatis.executor.loader.JavassistSerialStateHolder +org.apache.ibatis.executor.loader.cglib.CglibProxyFactory +org.apache.ibatis.executor.loader.javassist.JavassistSerialStateHolder +org.apache.tomcat.dbcp.dbcp.datasources.SharedPoolDataSource +org.apache.wicket.util.upload.DiskFileItem +org.apache.xalan.xsltc.trax.TemplatesImpl +org.apache.xbean.naming.context.ContextUtil$ReadOnlyBinding +org.apache.xpath.XPathContext +org.eclipse.jetty.util.log.LoggerLog +org.geotools.filter.ConstantExpression +org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder +org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor +org.springframework.beans.factory.BeanFactory +org.springframework.beans.factory.config.PropertyPathFactoryBean +org.springframework.beans.factory.support.DefaultListableBeanFactory +org.springframework.jndi.support.SimpleJndiBeanFactory +org.springframework.orm.jpa.AbstractEntityManagerFactoryBean +org.springframework.transaction.jta.JtaTransactionManager +org.yaml.snakeyaml.tokens.DirectiveToken +sun.rmi.server.UnicastRef +javax.management.ImmutableDescriptor +org.springframework.jndi.JndiObjectTargetSource +ch.qos.logback.core.db.JNDIConnectionSource +java.beans.Expression +javassist.bytecode +javassist.tools.web.Viewer +javassist.util.proxy.SerializedProxy +org.apache.ibatis.javassist.bytecode +org.apache.ibatis.javassist.tools.web.Viewer +org.apache.ibatis.javassist.util.proxy.SerializedProxy +org.springframework.beans.factory.config.MethodInvokingFactoryBean +com.alibaba.druid +com.sun.corba +com.sun.org.apache.bcel +com.sun.org.apache.xml +com.sun.org.apache.xpath +org.apache.zookeeper.Shell +org.apache.tomcat.dbcp.dbcp.BasicDataSource +net.bytebuddy.dynamic.loading.ByteArrayClassLoader +org.jboss.resteasy.plugins +org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler +org.apache.velocity.runtime.resource.Resource +org.springframework.expression.spel.ast.Indexer$PropertyIndexingValueRef +org.mortbay.log.Slf4jLog +org.springframework.expression.spel.ast.MethodReference$MethodValueRef \ No newline at end of file diff --git a/server/server/meta/src/main/resources/security/blacklist.txt b/server/server/meta/src/main/resources/security/blacklist.txt new file mode 100644 index 000000000..e3413f8d4 --- /dev/null +++ b/server/server/meta/src/main/resources/security/blacklist.txt @@ -0,0 +1,78 @@ +org.codehaus.groovy.runtime.MethodClosure +clojure.core$constantly +clojure.main$eval_opt +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactory +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactoryImpl +com.alibaba.citrus.springext.util.SpringExtUtil.AbstractProxy +com.alipay.custrelation.service.model.redress.Pair +com.caucho.hessian.test.TestCons +com.mchange.v2.c3p0.JndiRefForwardingDataSource +com.mchange.v2.c3p0.WrapperConnectionPoolDataSource +com.rometools.rome.feed.impl.EqualsBean +com.rometools.rome.feed.impl.ToStringBean +com.sun.jndi.rmi.registry.BindingEnumeration +com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl +com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl +com.sun.rowset.JdbcRowSetImpl +com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data +java.rmi.server.UnicastRemoteObject +java.security.SignedObject +java.util.ServiceLoader$LazyIterator +javax.imageio.ImageIO$ContainsFilter +javax.imageio.spi.ServiceRegistry +javax.management.BadAttributeValueExpException +javax.naming.InitialContext +javax.naming.spi.ObjectFactory +javax.script.ScriptEngineManager +javax.sound.sampled.AudioFormat$Encoding +org.apache.carbondata.core.scan.expression.ExpressionResult +org.apache.commons.dbcp +org.apache.commons.dbcp2 +org.apache.commons.beanutils +org.apache.ibatis.executor.loader.AbstractSerialStateHolder +org.apache.ibatis.executor.loader.CglibSerialStateHolder +org.apache.ibatis.executor.loader.JavassistSerialStateHolder +org.apache.ibatis.executor.loader.cglib.CglibProxyFactory +org.apache.ibatis.executor.loader.javassist.JavassistSerialStateHolder +org.apache.tomcat.dbcp.dbcp.datasources.SharedPoolDataSource +org.apache.wicket.util.upload.DiskFileItem +org.apache.xalan.xsltc.trax.TemplatesImpl +org.apache.xbean.naming.context.ContextUtil$ReadOnlyBinding +org.apache.xpath.XPathContext +org.eclipse.jetty.util.log.LoggerLog +org.geotools.filter.ConstantExpression +org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder +org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor +org.springframework.beans.factory.BeanFactory +org.springframework.beans.factory.config.PropertyPathFactoryBean +org.springframework.beans.factory.support.DefaultListableBeanFactory +org.springframework.jndi.support.SimpleJndiBeanFactory +org.springframework.orm.jpa.AbstractEntityManagerFactoryBean +org.springframework.transaction.jta.JtaTransactionManager +org.yaml.snakeyaml.tokens.DirectiveToken +sun.rmi.server.UnicastRef +javax.management.ImmutableDescriptor +org.springframework.jndi.JndiObjectTargetSource +ch.qos.logback.core.db.JNDIConnectionSource +java.beans.Expression +javassist.bytecode +javassist.tools.web.Viewer +javassist.util.proxy.SerializedProxy +org.apache.ibatis.javassist.bytecode +org.apache.ibatis.javassist.tools.web.Viewer +org.apache.ibatis.javassist.util.proxy.SerializedProxy +org.springframework.beans.factory.config.MethodInvokingFactoryBean +com.alibaba.druid +com.sun.corba +com.sun.org.apache.bcel +com.sun.org.apache.xml +com.sun.org.apache.xpath +org.apache.zookeeper.Shell +org.apache.tomcat.dbcp.dbcp.BasicDataSource +net.bytebuddy.dynamic.loading.ByteArrayClassLoader +org.jboss.resteasy.plugins +org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler +org.apache.velocity.runtime.resource.Resource +org.springframework.expression.spel.ast.Indexer$PropertyIndexingValueRef +org.mortbay.log.Slf4jLog +org.springframework.expression.spel.ast.MethodReference$MethodValueRef \ No newline at end of file diff --git a/server/server/session/src/main/resources/security/blacklist.txt b/server/server/session/src/main/resources/security/blacklist.txt new file mode 100644 index 000000000..e3413f8d4 --- /dev/null +++ b/server/server/session/src/main/resources/security/blacklist.txt @@ -0,0 +1,78 @@ +org.codehaus.groovy.runtime.MethodClosure +clojure.core$constantly +clojure.main$eval_opt +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactory +com.alibaba.citrus.springext.support.parser.AbstractNamedProxyBeanDefinitionParser$ProxyTargetFactoryImpl +com.alibaba.citrus.springext.util.SpringExtUtil.AbstractProxy +com.alipay.custrelation.service.model.redress.Pair +com.caucho.hessian.test.TestCons +com.mchange.v2.c3p0.JndiRefForwardingDataSource +com.mchange.v2.c3p0.WrapperConnectionPoolDataSource +com.rometools.rome.feed.impl.EqualsBean +com.rometools.rome.feed.impl.ToStringBean +com.sun.jndi.rmi.registry.BindingEnumeration +com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl +com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl +com.sun.rowset.JdbcRowSetImpl +com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data +java.rmi.server.UnicastRemoteObject +java.security.SignedObject +java.util.ServiceLoader$LazyIterator +javax.imageio.ImageIO$ContainsFilter +javax.imageio.spi.ServiceRegistry +javax.management.BadAttributeValueExpException +javax.naming.InitialContext +javax.naming.spi.ObjectFactory +javax.script.ScriptEngineManager +javax.sound.sampled.AudioFormat$Encoding +org.apache.carbondata.core.scan.expression.ExpressionResult +org.apache.commons.dbcp +org.apache.commons.dbcp2 +org.apache.commons.beanutils +org.apache.ibatis.executor.loader.AbstractSerialStateHolder +org.apache.ibatis.executor.loader.CglibSerialStateHolder +org.apache.ibatis.executor.loader.JavassistSerialStateHolder +org.apache.ibatis.executor.loader.cglib.CglibProxyFactory +org.apache.ibatis.executor.loader.javassist.JavassistSerialStateHolder +org.apache.tomcat.dbcp.dbcp.datasources.SharedPoolDataSource +org.apache.wicket.util.upload.DiskFileItem +org.apache.xalan.xsltc.trax.TemplatesImpl +org.apache.xbean.naming.context.ContextUtil$ReadOnlyBinding +org.apache.xpath.XPathContext +org.eclipse.jetty.util.log.LoggerLog +org.geotools.filter.ConstantExpression +org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder +org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor +org.springframework.beans.factory.BeanFactory +org.springframework.beans.factory.config.PropertyPathFactoryBean +org.springframework.beans.factory.support.DefaultListableBeanFactory +org.springframework.jndi.support.SimpleJndiBeanFactory +org.springframework.orm.jpa.AbstractEntityManagerFactoryBean +org.springframework.transaction.jta.JtaTransactionManager +org.yaml.snakeyaml.tokens.DirectiveToken +sun.rmi.server.UnicastRef +javax.management.ImmutableDescriptor +org.springframework.jndi.JndiObjectTargetSource +ch.qos.logback.core.db.JNDIConnectionSource +java.beans.Expression +javassist.bytecode +javassist.tools.web.Viewer +javassist.util.proxy.SerializedProxy +org.apache.ibatis.javassist.bytecode +org.apache.ibatis.javassist.tools.web.Viewer +org.apache.ibatis.javassist.util.proxy.SerializedProxy +org.springframework.beans.factory.config.MethodInvokingFactoryBean +com.alibaba.druid +com.sun.corba +com.sun.org.apache.bcel +com.sun.org.apache.xml +com.sun.org.apache.xpath +org.apache.zookeeper.Shell +org.apache.tomcat.dbcp.dbcp.BasicDataSource +net.bytebuddy.dynamic.loading.ByteArrayClassLoader +org.jboss.resteasy.plugins +org.springframework.beans.BeanWrapperImpl$BeanPropertyHandler +org.apache.velocity.runtime.resource.Resource +org.springframework.expression.spel.ast.Indexer$PropertyIndexingValueRef +org.mortbay.log.Slf4jLog +org.springframework.expression.spel.ast.MethodReference$MethodValueRef \ No newline at end of file From a92e12ce88eb9e22f58a60274b1dd835b38a4ee2 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 8 Jul 2019 12:13:02 +0800 Subject: [PATCH 060/161] bugfix: log "retryTimes" --- .../server/session/node/service/DataNodeServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index dfca26ea5..5a71bbc82 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -457,7 +457,7 @@ private void doRetryAsync(String bizName, Request request, Exception e, int maxR } else { LOGGER.error(String.format( "%s failed, retryTimes have exceeded! stop retry! retryTimes: %s, url: %s, request: %s, msg: %s", - bizName, retryTimes, request.getRequestUrl(), request.getRequestBody(), e.getMessage()), e); + bizName, (retryTimes - 1), request.getRequestUrl(), request.getRequestBody(), e.getMessage()), e); } } From e674065a418d74e40164489c1da4def39c2c60b7 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 9 Jul 2019 22:03:17 +0800 Subject: [PATCH 061/161] =?UTF-8?q?bugfix=20DatumLeaseManager:=20=20Consid?= =?UTF-8?q?er=20the=20situation=20of=20connectId=20lose=20after=20data=20r?= =?UTF-8?q?estart=EF=BC=9B=20ownConnectId=20should=20calculate=20dynamical?= =?UTF-8?q?ly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../common/model/DatumSnapshotRequest.java | 2 +- server/server/data/pom.xml | 4 ++ .../server/data/cache/DatumCache.java | 51 ++++++------- .../LocalDataServerChangeEventHandler.java | 10 ++- .../handler/DatumSnapshotHandler.java | 18 +++++ .../server/data/renew/DatumLeaseManager.java | 71 ++++++++++++++++++- 7 files changed, 131 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 87a9bc9c3..2fb8da118 100644 --- a/pom.xml +++ b/pom.xml @@ -307,6 +307,12 @@ ${metrics.version} + + commons-collections + commons-collections + 3.2.2 + + junit diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java index 49ae1da8e..0b517fa61 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/DatumSnapshotRequest.java @@ -77,7 +77,7 @@ public String toString() { final StringBuilder sb = new StringBuilder("DatumSnapshotRequest{"); sb.append("connectId='").append(connectId).append('\''); sb.append(", dataServerIp='").append(dataServerIp).append('\''); - sb.append(", publishers=").append(publishers); + sb.append(", publishers.size=").append(publishers.size()); sb.append('}'); return sb.toString(); } diff --git a/server/server/data/pom.xml b/server/server/data/pom.xml index 6860a8ab6..6efabfd19 100644 --- a/server/server/data/pom.xml +++ b/server/server/data/pom.xml @@ -73,6 +73,10 @@ commons-lang commons-lang + + commons-collections + commons-collections + junit junit diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 70c0229e2..0efd0c9a0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -59,15 +59,6 @@ public class DatumCache { */ private final Map> ALL_CONNECT_ID_INDEX = new ConcurrentHashMap<>(); - /** - * datum index, which only own by this dataServer - * - * row: ip:port - * column: registerId - * value: publisher - */ - private final Map> OWN_CONNECT_ID_INDEX = new ConcurrentHashMap<>(); - @Autowired private DataServerConfig dataServerConfig; @@ -145,13 +136,23 @@ public Map getByConnectId(String connectId) { } /** - * - * - * @param connectId - * @return + * get own publishers by connectId */ public Map getOwnByConnectId(String connectId) { - return OWN_CONNECT_ID_INDEX.getOrDefault(connectId, null); + Map ownPubMap = new HashMap<>(); + Map allPubMap = ALL_CONNECT_ID_INDEX.getOrDefault(connectId, null); + if (allPubMap != null) { + for (Map.Entry entry : allPubMap.entrySet()) { + String registerId = entry.getKey(); + Publisher publisher = entry.getValue(); + DataServerNode dataServerNode = DataServerNodeFactory.computeDataServerNode( + dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); + if (DataServerConfig.IP.equals(dataServerNode.getIp())) { + ownPubMap.put(registerId, publisher); + } + } + } + return ownPubMap; } /** @@ -333,12 +334,6 @@ private void removeFromIndex(Publisher publisher) { if (publisherMap != null) { publisherMap.remove(publisher.getRegisterId()); } - - // remove from OWN_CONNECT_ID_INDEX - Map ownPublisherMap = OWN_CONNECT_ID_INDEX.get(connectId); - if (ownPublisherMap != null) { - ownPublisherMap.remove(publisher.getRegisterId()); - } } private void addToConnectIndex(Publisher publisher) { @@ -352,18 +347,18 @@ private void addToConnectIndex(Publisher publisher) { .computeIfAbsent(connectId, s -> new ConcurrentHashMap<>()); publisherMap.put(publisher.getRegisterId(), publisher); - // add to OWN_CONNECT_ID_INDEX - DataServerNode dataServerNode = DataServerNodeFactory - .computeDataServerNode(dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); - if (DataServerConfig.IP.equals(dataServerNode.getIp())) { - Map ownPublisherMap = OWN_CONNECT_ID_INDEX - .computeIfAbsent(connectId, s -> new ConcurrentHashMap<>()); - ownPublisherMap.put(publisher.getRegisterId(), publisher); - } } private String getConnectId(Publisher cachePub) { return cachePub.getSourceAddress().getAddressString(); } + /** + * Getter method for property OWN_CONNECT_ID_INDEX. + * + * @return property value of OWN_CONNECT_ID_INDEX + */ + public Set getAllConnectIds() { + return ALL_CONNECT_ID_INDEX.keySet(); + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 17dd49267..55797a1aa 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -43,13 +43,14 @@ import com.alipay.sofa.registry.server.data.cache.BackupTriad; import com.alipay.sofa.registry.server.data.cache.DataServerCache; import com.alipay.sofa.registry.server.data.cache.DatumCache; -import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.event.LocalDataServerChangeEvent; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.node.DataServerNode; import com.alipay.sofa.registry.server.data.remoting.DataNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.google.common.collect.Lists; @@ -84,6 +85,9 @@ public class LocalDataServerChangeEventHandler extends @Autowired private DatumCache datumCache; + @Autowired + private DatumLeaseManager datumLeaseManager; + private BlockingQueue events = new LinkedBlockingDeque<>(); private AtomicBoolean isChanged = new AtomicBoolean(false); @@ -96,7 +100,11 @@ public Class interest() { @Override public void doHandle(LocalDataServerChangeEvent localDataServerChangeEvent) { isChanged.set(true); + + // Better change to Listener pattern localDataServerCleanHandler.reset(); + datumLeaseManager.reset(); + events.offer(localDataServerChangeEvent); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 7672d84ca..851944aa0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -16,9 +16,11 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import java.util.Collection; import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; @@ -30,6 +32,7 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; @@ -65,6 +68,9 @@ public class DatumSnapshotHandler extends AbstractServerHandler pubMap = request.getPublishers().stream() .collect(Collectors.toMap(p -> p.getRegisterId(), p -> p)); + + // diff the cache and snapshot + Map cachePubMap = datumCache.getOwnByConnectId(request.getConnectId()); + if (cachePubMap == null) { + RENEW_LOGGER.info(">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, the diff is: pubMap={}", + request.getConnectId(), pubMap.size(), pubMap); + } else { + Collection disjunction = CollectionUtils.disjunction(pubMap.values(), cachePubMap.values()); + RENEW_LOGGER.info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, the diff is: disjunction={}", + request.getConnectId(), cachePubMap.size(), pubMap.size(), disjunction); + } + dataChangeEventCenter.onChange( new DatumSnapshotEvent(request.getConnectId(), dataServerConfig.getLocalDataCenter(), pubMap)); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index cb22bbf01..1390de792 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -17,8 +17,11 @@ package com.alipay.sofa.registry.server.data.renew; import java.util.Map; +import java.util.Set; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; @@ -27,9 +30,11 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; @@ -65,6 +70,13 @@ public class DatumLeaseManager { @Autowired private DisconnectEventHandler disconnectEventHandler; + @Autowired + private DatumCache datumCache; + + private ScheduledThreadPoolExecutor executorForHeartbeatLess; + + private ScheduledFuture futureForHeartbeatLess; + /** * constructor */ @@ -88,6 +100,28 @@ public void executionFailed(Throwable e) { LOGGER.error("executionFailed: " + e.getMessage(), e); } }); + + executorForHeartbeatLess = new ScheduledThreadPoolExecutor(1, threadFactoryBuilder + .setNameFormat("Registry-DatumLeaseManager-ExecutorForHeartbeatLess").build()); + scheduleEvictTaskForHeartbeatLess(); + } + + /** + * reset EvictTaskForHeartbeatLess + */ + public synchronized void reset() { + LOGGER.info("reset is called, EvictTaskForHeartbeatLess will delay {}s", + dataServerConfig.getDatumTimeToLiveSec()); + if (futureForHeartbeatLess != null) { + futureForHeartbeatLess.cancel(false); + } + scheduleEvictTaskForHeartbeatLess(); + } + + private void scheduleEvictTaskForHeartbeatLess() { + futureForHeartbeatLess = executorForHeartbeatLess.scheduleWithFixedDelay( + new EvictTaskForHeartbeatLess(), dataServerConfig.getDatumTimeToLiveSec(), + dataServerConfig.getDatumTimeToLiveSec(), TimeUnit.SECONDS); } /** @@ -143,7 +177,7 @@ private void scheduleEvictTask(String connectId, long delaySec) { if (isExpired) { LOGGER.info("ConnectId({}) expired, lastRenewTime is {}", connectId, format(lastRenewTime)); connectIdRenewTimestampMap.remove(connectId, lastRenewTime); - disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), 0)); + evict(connectId); continued = false; } else { nextDelaySec = dataServerConfig.getDatumTimeToLiveSec() @@ -165,7 +199,42 @@ private void scheduleEvictTask(String connectId, long delaySec) { } + private void evict(String connectId) { + disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System + .currentTimeMillis(), 0)); + } + private String format(long lastRenewTime) { return DateFormatUtils.format(lastRenewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE); } + + /** + * evict own connectIds with heartbeat less + */ + private class EvictTaskForHeartbeatLess implements Runnable { + + @Override + public void run() { + LOGGER.info("EvictTaskForHeartbeatLess started."); + long startTime = System.currentTimeMillis(); + + Set allConnectIds = datumCache.getAllConnectIds(); + for (String connectId : allConnectIds) { + Long timestamp = connectIdRenewTimestampMap.get(connectId); + // no heartbeat + if (timestamp == null) { + Map ownPubs = datumCache.getOwnByConnectId(connectId); + if (ownPubs != null && ownPubs.size() > 0) { + LOGGER.info( + "ConnectId({}) expired cause it has no heartbeat, pub.size is {}", + connectId, ownPubs.size()); + evict(connectId); + } + } + } + + LOGGER.info("EvictTaskForHeartbeatLess end, elapsed time is {}ms.", + (System.currentTimeMillis() - startTime)); + } + } } \ No newline at end of file From ebb0b18006b579295e7cf29d5cd83277ab93873e Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 10 Jul 2019 10:48:53 +0800 Subject: [PATCH 062/161] add jvm blacklist api --- .../bootstrap/SessionServerConfiguration.java | 8 ++- .../resource/SessionSerialFilterResource.java | 53 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index aa51f5236..cc5a1518d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -24,12 +24,12 @@ import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumCacheGenerator; import com.alipay.sofa.registry.server.session.cache.SessionCacheService; -import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistMatchProcessFilter; import com.alipay.sofa.registry.server.session.filter.DataIdMatchStrategy; import com.alipay.sofa.registry.server.session.filter.IPMatchStrategy; import com.alipay.sofa.registry.server.session.filter.ProcessFilter; import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManagerImpl; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistMatchProcessFilter; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultDataIdMatchStrategy; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultIPMatchStrategy; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; @@ -83,6 +83,7 @@ import com.alipay.sofa.registry.server.session.resource.HealthResource; import com.alipay.sofa.registry.server.session.resource.SessionDigestResource; import com.alipay.sofa.registry.server.session.resource.SessionOpenResource; +import com.alipay.sofa.registry.server.session.resource.SessionSerialFilterResource; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.timertask.SyncClientsHeartbeatTask; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -320,6 +321,11 @@ public HealthResource healthResource() { public ClientsOpenResource clientsOpenResource() { return new ClientsOpenResource(); } + + @Bean + public SessionSerialFilterResource sessionSerialFilterResource() { + return new SessionSerialFilterResource(); + } } @Configuration diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java new file mode 100644 index 000000000..684decc0a --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.resource; + +import sun.misc.ObjectInputFilter; + +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import java.lang.reflect.Field; + +/** + * + * @author shangyu.wh + * @version 1.0: SessionSerialFilterResource.java, v 0.1 2019-07-09 15:24 shangyu.wh Exp $ + */ +@Path("serialFilter") +public class SessionSerialFilterResource { + + @POST + @Path("blacklist/jvm") + @Produces(MediaType.APPLICATION_JSON) + public void setJvmSerialFilter(String blacklist) { + try { + Field serialFilterField = ObjectInputFilter.Config.class + .getDeclaredField("serialFilter"); + serialFilterField.setAccessible(true); + serialFilterField.set(ObjectInputFilter.Config.class, + ObjectInputFilter.Config.createFilter(blacklist)); + serialFilterField.setAccessible(false); + } catch (Throwable e) { + System.err //NOPMD + .println("Current JDK do not support update black list, please update JDK if the feature is needed."); //NOPMD + e.printStackTrace(); //NOPMD + } + } + +} \ No newline at end of file From 0ba8324d204d8d5847fe7134b2ab73ab67cfe47b Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 10 Jul 2019 16:45:28 +0800 Subject: [PATCH 063/161] fix file name --- ...wDatumTaskListener.java => RenewDatumTaskListener.java} | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) rename server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/{ReNewDatumTaskListener.java => RenewDatumTaskListener.java} (99%) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java similarity index 99% rename from server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java rename to server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java index 0f36022a4..a5f497090 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReNewDatumTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.server.session.listener; -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.registry.SessionRegistry; @@ -31,6 +27,9 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; /** * From 57714eb60dc373ba31e109d60cf44f5353fd6545 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 10 Jul 2019 19:51:24 +0800 Subject: [PATCH 064/161] some code optimization --- .../change/event/DataChangeEventQueue.java | 11 ++++++-- .../handler/DatumSnapshotHandler.java | 28 +++++++++++++++---- .../server/data/renew/DatumLeaseManager.java | 15 +++++++--- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index 277751530..eb0944c5c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -24,6 +24,7 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.locks.ReentrantLock; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -54,6 +55,11 @@ public class DataChangeEventQueue { private static final Logger LOGGER_START = LoggerFactory .getLogger("DATA-START-LOGS"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DataChangeEventQueue]"); + /** * */ @@ -294,7 +300,8 @@ private void handleSnapshot(DatumSnapshotEvent event) { Map snapshotPubMap = event.getPubMap(); synchronized (Interners.newWeakInterner().intern(connectId)) { Map pubMap = datumCache.getByConnectId(connectId); - LOGGER.info("[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", + RENEW_LOGGER.info( + "[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", getName(), connectId, pubMap != null ? pubMap.size() : null, snapshotPubMap.size()); int unPubSize = 0; if (pubMap != null) { @@ -326,7 +333,7 @@ private void handleSnapshot(DatumSnapshotEvent event) { Datum datum = new Datum(publisher, event.getDataCenter(), DatumVersionUtil.nextId()); handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); } - LOGGER.info( + RENEW_LOGGER.info( "[{}] snapshot handle, connectId={}, handle unPubSize={}, handle pubSize={}", getName(), connectId, unPubSize, snapshotPubMap.size()); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 851944aa0..42b38e1ff 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -16,16 +16,17 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; -import java.util.Collection; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -98,9 +99,11 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { RENEW_LOGGER.info(">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, the diff is: pubMap={}", request.getConnectId(), pubMap.size(), pubMap); } else { - Collection disjunction = CollectionUtils.disjunction(pubMap.values(), cachePubMap.values()); - RENEW_LOGGER.info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, the diff is: disjunction={}", - request.getConnectId(), cachePubMap.size(), pubMap.size(), disjunction); + List diffPub1 = subtract(pubMap, cachePubMap); + List diffPub2 = subtract(cachePubMap, pubMap); + RENEW_LOGGER + .info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, the diff is: pubMap-cachePubMap={}, cachePubMap-pubMap={}", + request.getConnectId(), cachePubMap.size(), pubMap.size(), diffPub1, diffPub2); } dataChangeEventCenter.onChange( @@ -112,6 +115,21 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { return CommonResponse.buildSuccessResponse(); } + private List subtract(Map pubMap1, Map pubMap2) { + List list = new ArrayList(); + for (Map.Entry entry : pubMap1.entrySet()) { + String registerId = entry.getKey(); + Publisher publisher1 = entry.getValue(); + Publisher publisher2 = pubMap2.get(registerId); + if (publisher2 == null + || PublisherDigestUtil.getDigestValue(publisher1) != PublisherDigestUtil + .getDigestValue(publisher2)) { + list.add(publisher1); + } + } + return list; + } + @Override public CommonResponse buildFailedResponse(String msg) { return CommonResponse.buildFailedResponse(msg); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index 1390de792..026dd6464 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -175,7 +175,9 @@ private void scheduleEvictTask(String connectId, long delaySec) { boolean isExpired = System.currentTimeMillis() - lastRenewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; if (isExpired) { - LOGGER.info("ConnectId({}) expired, lastRenewTime is {}", connectId, format(lastRenewTime)); + int ownPubSize = getOwnPubSize(connectId); + LOGGER.info("ConnectId({}) expired, lastRenewTime is {}, pub.size is {}", connectId, + format(lastRenewTime), ownPubSize); connectIdRenewTimestampMap.remove(connectId, lastRenewTime); evict(connectId); continued = false; @@ -199,6 +201,11 @@ private void scheduleEvictTask(String connectId, long delaySec) { } + private int getOwnPubSize(String connectId) { + Map ownPubs = datumCache.getOwnByConnectId(connectId); + return ownPubs != null ? ownPubs.size() : 0; + } + private void evict(String connectId) { disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System .currentTimeMillis(), 0)); @@ -223,11 +230,11 @@ public void run() { Long timestamp = connectIdRenewTimestampMap.get(connectId); // no heartbeat if (timestamp == null) { - Map ownPubs = datumCache.getOwnByConnectId(connectId); - if (ownPubs != null && ownPubs.size() > 0) { + int ownPubSize = getOwnPubSize(connectId); + if (ownPubSize > 0) { LOGGER.info( "ConnectId({}) expired cause it has no heartbeat, pub.size is {}", - connectId, ownPubs.size()); + connectId, ownPubSize); evict(connectId); } } From c211e4e20dd317966bdbfbe46245bdd6b9c0ce11 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 12 Jul 2019 23:12:14 +0800 Subject: [PATCH 065/161] =?UTF-8?q?data=EF=BC=9Arefactor=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataServerBeanConfiguration.java | 11 +- .../server/data/cache/DatumCache.java | 140 ++++++++++++++++-- .../server/data/change/ChangeData.java | 4 +- .../server/data/change/DataChangeHandler.java | 108 +++++++------- .../data/change/DataSourceTypeEnum.java | 7 +- .../server/data/change/SnapshotData.java | 83 +++++++++++ .../change/event/DataChangeEventQueue.java | 127 +++++++++------- .../data/change/event/DatumSnapshotEvent.java | 37 ++--- .../change/notify/SnapshotBackUpNotifier.java | 51 +++++++ .../data/datasync/SnapshotOperator.java | 33 +++++ .../datasync/sync/AbstractAcceptorStore.java | 10 +- .../server/data/datasync/sync/Acceptor.java | 2 +- .../handler/DatumSnapshotHandler.java | 4 +- 13 files changed, 473 insertions(+), 144 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/SnapshotData.java create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SnapshotBackUpNotifier.java create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/SnapshotOperator.java diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index f5499061a..ef9bd3223 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -40,9 +40,8 @@ import com.alipay.sofa.registry.server.data.change.notify.BackUpNotifier; import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.change.notify.SessionServerNotifier; +import com.alipay.sofa.registry.server.data.change.notify.SnapshotBackUpNotifier; import com.alipay.sofa.registry.server.data.change.notify.TempPublisherNotifier; -import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; -import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.datasync.AcceptorStore; import com.alipay.sofa.registry.server.data.datasync.SyncDataService; import com.alipay.sofa.registry.server.data.datasync.sync.LocalAcceptorStore; @@ -91,6 +90,8 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.RenewDatumHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.SessionServerRegisterHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.UnPublishDataHandler; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; +import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.resource.DataDigestResource; import com.alipay.sofa.registry.server.data.resource.HealthResource; import com.alipay.sofa.registry.util.PropertySplitter; @@ -351,12 +352,18 @@ public BackUpNotifier backUpNotifier() { return new BackUpNotifier(); } + @Bean + public SnapshotBackUpNotifier snapshotBackUpNotifier() { + return new SnapshotBackUpNotifier(); + } + @Bean(name = "dataChangeNotifiers") public List dataChangeNotifiers() { List list = new ArrayList<>(); list.add(sessionServerNotifier()); list.add(tempPublisherNotifier()); list.add(backUpNotifier()); + list.add(snapshotBackUpNotifier()); return list; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 0efd0c9a0..92b5ca43d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -166,14 +166,7 @@ public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { MergeResult mergeResult; String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); - Map map = DATUM_MAP.get(dataCenter); - if (map == null) { - map = new ConcurrentHashMap<>(); - Map ret = DATUM_MAP.putIfAbsent(dataCenter, map); - if (ret != null) { - map = ret; - } - } + Map map = getDatumMapByDataCenter(dataCenter); //first put UnPublisher datum(dataId group instanceId is null),can not add to cache if (datum.getDataId() == null && map.get(dataInfoId) == null) { @@ -189,7 +182,7 @@ public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { Entry entry = iterator.next(); Publisher publisher = entry.getValue(); if (!(publisher instanceof UnPublisher)) { - addToConnectIndex(publisher); + addToIndex(publisher); } else { //first put to cache,UnPublisher data must remove,not so got error pub data exist iterator.remove(); @@ -207,6 +200,18 @@ public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { return mergeResult; } + private Map getDatumMapByDataCenter(String dataCenter) { + Map map = DATUM_MAP.get(dataCenter); + if (map == null) { + map = new ConcurrentHashMap<>(); + Map ret = DATUM_MAP.putIfAbsent(dataCenter, map); + if (ret != null) { + map = ret; + } + } + return map; + } + /** * remove datum ant contains all pub data,and clean all the client map reference * @param dataCenter @@ -262,6 +267,117 @@ private MergeResult mergeDatum(Datum datum) { return new MergeResult(lastVersion, isChanged); } + // /** + // * cover datum by connectId + // */ + // public void putSnapshot(Map toBeDeletedPubMap, Map snapshotPubMap) { + // + // //remove all old pub + // for (Entry toBeDeletedPubEntry : toBeDeletedPubMap.entrySet()) { + // String registerId = toBeDeletedPubEntry.getKey(); + // Publisher toBeDeletedPub = toBeDeletedPubEntry.getValue(); + // Datum cacheDatum = DATUM_MAP.get(dataServerConfig.getLocalDataCenter()).get(toBeDeletedPub.getDataInfoId()); + // if (cacheDatum != null) { + // Map cachePubMap = cacheDatum.getPubMap(); + // cachePubMap.remove(registerId); + // removeFromIndex(toBeDeletedPub); + // } + // } + // // add all snapshot pub + // for (Entry pubEntry : snapshotPubMap.entrySet()) { + // String registerId = pubEntry.getKey(); + // Publisher snapshotPub = pubEntry.getValue(); + // Map datumMap = getDatumMapByDataCenter(dataServerConfig.getLocalDataCenter()); + // String dataInfoId = snapshotPub.getDataInfoId(); + // Datum cacheDatum = datumMap.get(dataInfoId); + // if (cacheDatum == null) { + // cacheDatum = new Datum(dataInfoId, dataServerConfig.getLocalDataCenter()); + // Datum datum = datumMap.putIfAbsent(dataInfoId, cacheDatum); + // if (datum != null) { + // cacheDatum = datum; + // } + // } + // cacheDatum.getPubMap().put(registerId, snapshotPub); + // } + // + // } + + // /** + // * cover datum by connectId + // */ + // public void putSnapshot(String dataInfoId, Map toBeDeletedPubMap, + // Map snapshotPubMap) { + // // get cache datum + // Map datumMap = getDatumMapByDataCenter(dataServerConfig.getLocalDataCenter()); + // Datum cacheDatum = datumMap.get(dataInfoId); + // if (cacheDatum == null) { + // cacheDatum = new Datum(dataInfoId, dataServerConfig.getLocalDataCenter()); + // Datum datum = datumMap.putIfAbsent(dataInfoId, cacheDatum); + // if (datum != null) { + // cacheDatum = datum; + // } + // } + // //remove toBeDeletedPubMap from cacheDatum + // for (Entry toBeDeletedPubEntry : toBeDeletedPubMap.entrySet()) { + // String registerId = toBeDeletedPubEntry.getKey(); + // Publisher toBeDeletedPub = toBeDeletedPubEntry.getValue(); + // if (cacheDatum != null) { + // Map cachePubMap = cacheDatum.getPubMap(); + // cachePubMap.remove(registerId); + // removeFromIndex(toBeDeletedPub); + // } + // } + // // add snapshotPubMap to cacheDatum + // for (Entry pubEntry : snapshotPubMap.entrySet()) { + // String registerId = pubEntry.getKey(); + // Publisher snapshotPub = pubEntry.getValue(); + // cacheDatum.getPubMap().put(registerId, snapshotPub); + // addToIndex(snapshotPub); + // } + // + // } + + /** + * cover datum by snapshot + */ + public Datum putSnapshot(String dataInfoId, Map toBeDeletedPubMap, + Map snapshotPubMap) { + // get cache datum + Map datumMap = getDatumMapByDataCenter(dataServerConfig.getLocalDataCenter()); + Datum cacheDatum = datumMap.get(dataInfoId); + if (cacheDatum == null) { + cacheDatum = new Datum(dataInfoId, dataServerConfig.getLocalDataCenter()); + Publisher publisher = snapshotPubMap.values().iterator().next(); + cacheDatum.setInstanceId(publisher.getInstanceId()); + cacheDatum.setDataId(publisher.getDataId()); + cacheDatum.setGroup(publisher.getGroup()); + Datum datum = datumMap.putIfAbsent(dataInfoId, cacheDatum); + if (datum != null) { + cacheDatum = datum; + } + } + //remove toBeDeletedPubMap from cacheDatum + for (Entry toBeDeletedPubEntry : toBeDeletedPubMap.entrySet()) { + String registerId = toBeDeletedPubEntry.getKey(); + Publisher toBeDeletedPub = toBeDeletedPubEntry.getValue(); + if (cacheDatum != null) { + cacheDatum.getPubMap().remove(registerId); + removeFromIndex(toBeDeletedPub); + } + } + // add snapshotPubMap to cacheDatum + for (Entry pubEntry : snapshotPubMap.entrySet()) { + String registerId = pubEntry.getKey(); + Publisher snapshotPub = pubEntry.getValue(); + cacheDatum.getPubMap().put(registerId, snapshotPub); + addToIndex(snapshotPub); + } + + cacheDatum.updateVersion(); + + return cacheDatum; + } + private boolean mergePublisher(Publisher pub, Map cachePubMap, Publisher cachePub) { boolean isChanged = false; @@ -284,7 +400,7 @@ private boolean mergePublisher(Publisher pub, Map cachePubMap // eg: sessionserver crash, client(RegistryClient but not ConfregClient) reconnect to other sessionserver, sourceAddress changed, version not changed if (!connectId.equals(cacheConnectId) || cacheVersion < version) { removeFromIndex(cachePub); - addToConnectIndex(pub); + addToIndex(pub); isChanged = true; } } @@ -308,7 +424,7 @@ private Long coverDatum(Datum datum) { for (Entry pubEntry : pubMap.entrySet()) { String registerId = pubEntry.getKey(); Publisher pub = pubEntry.getValue(); - addToConnectIndex(pub); + addToIndex(pub); Publisher cachePub = cachePubMap.get(registerId); if (cachePub != null && getConnectId(pub).equals(getConnectId(cachePub))) { cachePubMap.remove(registerId); @@ -336,7 +452,7 @@ private void removeFromIndex(Publisher publisher) { } } - private void addToConnectIndex(Publisher publisher) { + private void addToIndex(Publisher publisher) { if (publisher == null) { return; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/ChangeData.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/ChangeData.java index 166f8fa48..f3e541877 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/ChangeData.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/ChangeData.java @@ -16,11 +16,11 @@ */ package com.alipay.sofa.registry.server.data.change; -import com.alipay.sofa.registry.common.model.dataserver.Datum; - import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; +import com.alipay.sofa.registry.common.model.dataserver.Datum; + /** * changed data * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index fc97994f8..a4fac3ca8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -107,66 +107,67 @@ public ChangeNotifier(ChangeData changeData, String name) { @Override public void run() { - Datum datum = changeData.getDatum(); - String dataCenter = datum.getDataCenter(); - String dataInfoId = datum.getDataInfoId(); - long version = datum.getVersion(); - DataSourceTypeEnum sourceType = changeData.getSourceType(); - DataChangeTypeEnum changeType = changeData.getChangeType(); - try { - if (sourceType == DataSourceTypeEnum.CLEAN) { - if (datumCache.cleanDatum(dataCenter, dataInfoId)) { - LOGGER - .info( - "[DataChangeHandler][{}] clean datum, dataCenter={}, dataInfoId={}, version={},sourceType={}, changeType={}", - name, dataCenter, dataInfoId, version, sourceType, changeType); - } - - } else { - Long lastVersion = null; + if (changeData instanceof SnapshotData) { + SnapshotData snapshotData = (SnapshotData) changeData; + String dataInfoId = snapshotData.getDataInfoId(); + Map toBeDeletedPubMap = snapshotData.getToBeDeletedPubMap(); + Map snapshotPubMap = snapshotData.getSnapshotPubMap(); + Datum datum = datumCache.putSnapshot(dataInfoId, toBeDeletedPubMap, snapshotPubMap); + notify(datum, changeData.getSourceType(), null); + + } else { + Datum datum = changeData.getDatum(); + String dataCenter = datum.getDataCenter(); + String dataInfoId = datum.getDataInfoId(); + long version = datum.getVersion(); + DataSourceTypeEnum sourceType = changeData.getSourceType(); + DataChangeTypeEnum changeType = changeData.getChangeType(); + try { + if (sourceType == DataSourceTypeEnum.CLEAN) { + if (datumCache.cleanDatum(dataCenter, dataInfoId)) { + LOGGER + .info( + "[DataChangeHandler][{}] clean datum, dataCenter={}, dataInfoId={}, version={},sourceType={}, changeType={}", + name, dataCenter, dataInfoId, version, sourceType, changeType); + } - if (sourceType == DataSourceTypeEnum.PUB_TEMP) { + } else if (sourceType == DataSourceTypeEnum.PUB_TEMP) { notifyTempPub(datum, sourceType, changeType); - return; - } - MergeResult mergeResult = datumCache.putDatum(changeType, datum); - lastVersion = mergeResult.getLastVersion(); + } else { + MergeResult mergeResult = datumCache.putDatum(changeType, datum); + Long lastVersion = mergeResult.getLastVersion(); + + if (lastVersion != null + && lastVersion.longValue() == datumCache.ERROR_DATUM_VERSION) { + LOGGER + .error( + "[DataChangeHandler][{}] first put unPub datum into cache error, dataCenter={}, dataInfoId={}, version={}, sourceType={},isContainsUnPub={}", + name, dataCenter, dataInfoId, version, sourceType, + datum.isContainsUnPub()); + return; + } - if (lastVersion != null - && lastVersion.longValue() == datumCache.ERROR_DATUM_VERSION) { LOGGER - .error( - "[DataChangeHandler][{}] first put unPub datum into cache error, dataCenter={}, dataInfoId={}, version={}, sourceType={},isContainsUnPub={}", - name, dataCenter, dataInfoId, version, sourceType, + .info( + "[DataChangeHandler][{}] datum handle,datum={},dataCenter={}, dataInfoId={}, version={}, lastVersion={}, sourceType={}, changeType={},changeFlag={},isContainsUnPub={}", + name, datum.hashCode(), dataCenter, dataInfoId, version, + lastVersion, sourceType, changeType, mergeResult.isChangeFlag(), datum.isContainsUnPub()); - return; - } - - boolean changeFlag = mergeResult.isChangeFlag(); - - LOGGER - .info( - "[DataChangeHandler][{}] datum handle,datum={},dataCenter={}, dataInfoId={}, version={}, lastVersion={}, sourceType={}, changeType={},changeFlag={},isContainsUnPub={}", - name, datum.hashCode(), dataCenter, dataInfoId, version, lastVersion, - sourceType, changeType, changeFlag, datum.isContainsUnPub()); - //lastVersion null means first add datum - if (lastVersion == null || version != lastVersion) { - if (changeFlag) { - for (IDataChangeNotifier notifier : dataChangeNotifiers) { - if (notifier.getSuitableSource().contains(sourceType)) { - notifier.notify(datum, lastVersion); - } + //lastVersion null means first add datum + if (lastVersion == null || version != lastVersion) { + if (mergeResult.isChangeFlag()) { + notify(datum, sourceType, lastVersion); } } } + } catch (Exception e) { + LOGGER + .error( + "[DataChangeHandler][{}] put datum into cache error, dataCenter={}, dataInfoId={}, version={}, sourceType={},isContainsUnPub={}", + name, dataCenter, dataInfoId, version, sourceType, + datum.isContainsUnPub(), e); } - } catch (Exception e) { - LOGGER - .error( - "[DataChangeHandler][{}] put datum into cache error, dataCenter={}, dataInfoId={}, version={}, sourceType={},isContainsUnPub={}", - name, dataCenter, dataInfoId, version, sourceType, datum.isContainsUnPub(), - e); } } @@ -191,11 +192,16 @@ private void notifyTempPub(Datum datum, DataSourceTypeEnum sourceType, "[DataChangeHandler][{}] datum handle temp pub,datum={},dataCenter={}, dataInfoId={}, version={}, sourceType={}, changeType={}", name, datum.hashCode(), dataCenter, dataInfoId, version, sourceType, changeType); + notify(datum, sourceType, null); + } + + private void notify(Datum datum, DataSourceTypeEnum sourceType, Long lastVersion) { for (IDataChangeNotifier notifier : dataChangeNotifiers) { if (notifier.getSuitableSource().contains(sourceType)) { - notifier.notify(datum, null); + notifier.notify(datum, lastVersion); } } } } + } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataSourceTypeEnum.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataSourceTypeEnum.java index c41a14f51..b2787fbb9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataSourceTypeEnum.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataSourceTypeEnum.java @@ -46,5 +46,10 @@ public enum DataSourceTypeEnum { /** * local dataInfo check,not belong this node schedule remove */ - CLEAN + CLEAN, + + /** + * Snapshot data, after renew finds data inconsistent + */ + SNAPSHOT, } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/SnapshotData.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/SnapshotData.java new file mode 100644 index 000000000..495019d65 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/SnapshotData.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.change; + +import java.util.Map; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +import com.alipay.sofa.registry.common.model.store.Publisher; + +/** + * changed data + * + * @author kezhu.wukz + * @version $Id: ChangeData.java, v 0.1 2019-07-12 16:23 kezhu.wukz Exp $ + */ +public class SnapshotData extends ChangeData { + + private String dataInfoId; + + private Map toBeDeletedPubMap; + + private Map snapshotPubMap; + + public SnapshotData(String dataInfoId, Map toBeDeletedPubMap, + Map snapshotPubMap) { + super(null, 0, DataSourceTypeEnum.SNAPSHOT, null); + this.dataInfoId = dataInfoId; + this.toBeDeletedPubMap = toBeDeletedPubMap; + this.snapshotPubMap = snapshotPubMap; + } + + /** + * Getter method for property dataInfoId. + * + * @return property value of dataInfoId + */ + public String getDataInfoId() { + return dataInfoId; + } + + /** + * Getter method for property toBeDeletedPubMap. + * + * @return property value of toBeDeletedPubMap + */ + public Map getToBeDeletedPubMap() { + return toBeDeletedPubMap; + } + + /** + * Getter method for property snapshotPubMap. + * + * @return property value of snapshotPubMap + */ + public Map getSnapshotPubMap() { + return snapshotPubMap; + } + + @Override + public long getDelay(TimeUnit unit) { + return 0; + } + + @Override + public int compareTo(Delayed o) { + return -1; + } +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index eb0944c5c..daa33c7e0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.data.change.event; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; @@ -35,10 +36,10 @@ import com.alipay.sofa.registry.server.data.change.ChangeData; import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; +import com.alipay.sofa.registry.server.data.change.SnapshotData; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.node.DataServerNode; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; -import com.alipay.sofa.registry.util.DatumVersionUtil; import com.google.common.collect.Interners; /** @@ -49,16 +50,16 @@ */ public class DataChangeEventQueue { - private static final Logger LOGGER = LoggerFactory - .getLogger(DataChangeEventQueue.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DataChangeEventQueue.class); - private static final Logger LOGGER_START = LoggerFactory - .getLogger("DATA-START-LOGS"); + private static final Logger LOGGER_START = LoggerFactory + .getLogger("DATA-START-LOGS"); - private static final Logger RENEW_LOGGER = LoggerFactory - .getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[DataChangeEventQueue]"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DataChangeEventQueue]"); /** * @@ -73,18 +74,18 @@ public class DataChangeEventQueue { /** * */ - private final Map> CHANGE_DATA_MAP = new ConcurrentHashMap<>(); + private final Map> CHANGE_DATA_MAP_FOR_MERGE = new ConcurrentHashMap<>(); /** * */ - private final DelayQueue CHANGE_QUEUE = new DelayQueue(); + private final DelayQueue CHANGE_QUEUE = new DelayQueue(); private final int notifyIntervalMs; private final int notifyTempDataIntervalMs; - private final ReentrantLock lock = new ReentrantLock(); + private final ReentrantLock lock = new ReentrantLock(); private final int queueIdx; @@ -142,16 +143,20 @@ public ChangeData take() throws InterruptedException { ChangeData changeData = CHANGE_QUEUE.take(); lock.lock(); try { - Datum datum = changeData.getDatum(); - if (changeData.getSourceType() != DataSourceTypeEnum.PUB_TEMP) { - CHANGE_DATA_MAP.get(datum.getDataCenter()).remove(datum.getDataInfoId()); - } + removeMapForMerge(changeData); return changeData; } finally { lock.unlock(); } } + private void removeMapForMerge(ChangeData changeData) { + Datum datum = changeData.getDatum(); + if (changeData.getSourceType() != DataSourceTypeEnum.PUB_TEMP && datum != null) { + CHANGE_DATA_MAP_FOR_MERGE.get(datum.getDataCenter()).remove(datum.getDataInfoId()); + } + } + /** * * @param dataCenter @@ -162,10 +167,10 @@ public ChangeData take() throws InterruptedException { */ private ChangeData getChangeData(String dataCenter, String dataInfoId, DataSourceTypeEnum sourceType, DataChangeTypeEnum changeType) { - Map map = CHANGE_DATA_MAP.get(dataCenter); + Map map = CHANGE_DATA_MAP_FOR_MERGE.get(dataCenter); if (map == null) { Map newMap = new ConcurrentHashMap<>(); - map = CHANGE_DATA_MAP.putIfAbsent(dataCenter, newMap); + map = CHANGE_DATA_MAP_FOR_MERGE.putIfAbsent(dataCenter, newMap); if (map == null) { map = newMap; } @@ -296,52 +301,66 @@ private void handleDatum(DataChangeTypeEnum changeType, DataSourceTypeEnum sourc } private void handleSnapshot(DatumSnapshotEvent event) { - String connectId = event.getHost(); + String connectId = event.getConnectId(); + Map cachePubMap = event.getCachePubMap(); Map snapshotPubMap = event.getPubMap(); - synchronized (Interners.newWeakInterner().intern(connectId)) { - Map pubMap = datumCache.getByConnectId(connectId); - RENEW_LOGGER.info( - "[{}] snapshot begin, connectId={}, old pubSize={}, snapshot pubSize={}", - getName(), connectId, pubMap != null ? pubMap.size() : null, snapshotPubMap.size()); - int unPubSize = 0; - if (pubMap != null) { - for (Publisher publisher : pubMap.values()) { - // Only care dataInfoIds which belong to this queue - if (!belongTo(publisher.getDataInfoId())) { - continue; - } - //backup datum do not need to unPub, it will be unPub by backup sync event - DataServerNode dataServerNode = DataServerNodeFactory.computeDataServerNode( - dataServerConfig.getLocalDataCenter(), publisher.getDataInfoId()); - if (!DataServerConfig.IP.equals(dataServerNode.getIp())) { - continue; - } - //If snapshot.pubMap does not contain this pub: then build the reverse operation as unPub - if (!snapshotPubMap.containsKey(publisher.getRegisterId())) { - long currentTimeStamp = System.currentTimeMillis(); - Datum datum = new Datum(new UnPublisher(publisher.getDataInfoId(), - publisher.getRegisterId(), currentTimeStamp), event.getDataCenter(), - DatumVersionUtil.nextId()); - datum.setContainsUnPub(true); - handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); - unPubSize++; - } + // build SnapshotData + Map dataInfoId2SnapshotData = new HashMap<>(); + synchronized (Interners.newWeakInterner().intern(connectId)) { + for (Map.Entry entry : snapshotPubMap.entrySet()) { + String registerId = entry.getKey(); + Publisher publisher = entry.getValue(); + String dataInfoId = publisher.getDataInfoId(); + + // Only care dataInfoIds which belong to this queue + if (!belongTo(dataInfoId)) { + continue; } + + SnapshotData snapshotData = getOrCreateSnapshotData(dataInfoId2SnapshotData, + dataInfoId); + snapshotData.getSnapshotPubMap().put(registerId, publisher); } - for (Publisher publisher : snapshotPubMap.values()) { - Datum datum = new Datum(publisher, event.getDataCenter(), DatumVersionUtil.nextId()); - handleDatum(DataChangeTypeEnum.MERGE, DataSourceTypeEnum.PUB, datum); + for (Map.Entry entry : cachePubMap.entrySet()) { + String registerId = entry.getKey(); + Publisher publisher = entry.getValue(); + String dataInfoId = publisher.getDataInfoId(); + + // Only care dataInfoIds which belong to this queue + if (!belongTo(dataInfoId)) { + continue; + } + + SnapshotData snapshotData = getOrCreateSnapshotData(dataInfoId2SnapshotData, + dataInfoId); + snapshotData.getToBeDeletedPubMap().put(registerId, publisher); } - RENEW_LOGGER.info( - "[{}] snapshot handle, connectId={}, handle unPubSize={}, handle pubSize={}", - getName(), connectId, unPubSize, snapshotPubMap.size()); + } + + // put all SnapshotDatas to queue + for (SnapshotData snapshotData : dataInfoId2SnapshotData.values()) { + RENEW_LOGGER + .info( + "SnapshotData: connectId={}, dataInfoId={}, cachePubSize={}, snapshotPubSize={}", + connectId, snapshotData.getDataInfoId(), snapshotData.getToBeDeletedPubMap() + .size(), snapshotData.getSnapshotPubMap().size()); + CHANGE_QUEUE.put(snapshotData); } } + private SnapshotData getOrCreateSnapshotData(Map dataInfoId2SnapshotData, + String dataInfoId) { + SnapshotData snapshotData = dataInfoId2SnapshotData.get(dataInfoId); + if (snapshotData == null) { + snapshotData = new SnapshotData(dataInfoId, new HashMap<>(), new HashMap<>()); + dataInfoId2SnapshotData.put(dataInfoId, snapshotData); + } + return snapshotData; + } + private void addTempChangeData(Datum targetDatum, DataChangeTypeEnum changeType, DataSourceTypeEnum sourceType) { - ChangeData tempChangeData = new ChangeData(targetDatum, this.notifyTempDataIntervalMs, sourceType, changeType); CHANGE_QUEUE.put(tempChangeData); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java index df3bef14f..af08c25c6 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DatumSnapshotEvent.java @@ -28,43 +28,44 @@ public class DatumSnapshotEvent implements IDataChangeEvent { /** connId, format is ip:port */ - private String host; - - private String dataCenter; + private String connectId; private Map pubMap; - public DatumSnapshotEvent(String host, String dataCenter, Map pubMap) { - this.host = host; - this.dataCenter = dataCenter; + private Map cachePubMap; + + public DatumSnapshotEvent(String connectId, Map cachePubMap, + Map pubMap) { + this.connectId = connectId; + this.cachePubMap = cachePubMap; this.pubMap = pubMap; } /** - * Getter method for property host. + * Getter method for property connectId. * - * @return property value of host + * @return property value of connectId */ - public String getHost() { - return host; + public String getConnectId() { + return connectId; } /** - * Getter method for property dataCenter. + * Getter method for property pubMap. * - * @return property value of dataCenter + * @return property value of pubMap */ - public String getDataCenter() { - return dataCenter; + public Map getPubMap() { + return pubMap; } /** - * Getter method for property pubMap. + * Getter method for property cachePubMap. * - * @return property value of pubMap + * @return property value of cachePubMap */ - public Map getPubMap() { - return pubMap; + public Map getCachePubMap() { + return cachePubMap; } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SnapshotBackUpNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SnapshotBackUpNotifier.java new file mode 100644 index 000000000..aab640fb2 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SnapshotBackUpNotifier.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.change.notify; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; +import com.alipay.sofa.registry.server.data.datasync.SnapshotOperator; +import com.alipay.sofa.registry.server.data.datasync.SyncDataService; + +/** + * + * @author kezhu.wukz + * @version $Id: SnapshotBackUpNotifier.java, v 0.1 2019-07-12 18:40 kezhu.wukz Exp $ + */ +public class SnapshotBackUpNotifier implements IDataChangeNotifier { + + @Autowired + private SyncDataService syncDataService; + + @Override + public Set getSuitableSource() { + Set set = new HashSet<>(); + set.add(DataSourceTypeEnum.SNAPSHOT); + return set; + } + + @Override + public void notify(Datum datum, Long lastVersion) { + syncDataService.appendOperator(new SnapshotOperator(datum.getVersion(), lastVersion, datum, + DataSourceTypeEnum.BACKUP)); + } +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/SnapshotOperator.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/SnapshotOperator.java new file mode 100644 index 000000000..dd7aaf163 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/SnapshotOperator.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.datasync; + +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; + +/** + * + * @author kezhu.wukz + * @version $Id: SnapshotOperator.java, v 0.1 2019-07-12 20:33 kezhu.wukz Exp $ + */ +public class SnapshotOperator extends Operator { + + public SnapshotOperator(Long version, Long sourceVersion, Datum datum, + DataSourceTypeEnum sourceType) { + super(version, sourceVersion, datum, sourceType); + } +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java index 7ea73a3da..b07713814 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/AbstractAcceptorStore.java @@ -36,6 +36,7 @@ import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.datasync.AcceptorStore; import com.alipay.sofa.registry.server.data.datasync.Operator; +import com.alipay.sofa.registry.server.data.datasync.SnapshotOperator; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.util.DelayItem; @@ -117,7 +118,14 @@ public void addOperator(Operator operator) { existAcceptor = newAcceptor; } } - existAcceptor.appendOperator(operator); + + if (operator instanceof SnapshotOperator) { + //snapshot: clear the queue, Make other data retrieve the latest memory data + existAcceptor.clearBefore(); + } else { + existAcceptor.appendOperator(operator); + } + //put cache putCache(existAcceptor); } catch (Exception e) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java index c4cbfce26..b758cf6fa 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/datasync/sync/Acceptor.java @@ -263,7 +263,7 @@ private boolean isExpired(int durationSECS, long peekVersion) { return ret; } - private void clearBefore() { + public void clearBefore() { write.lock(); try { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 42b38e1ff..679beddd2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -106,8 +106,8 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { request.getConnectId(), cachePubMap.size(), pubMap.size(), diffPub1, diffPub2); } - dataChangeEventCenter.onChange( - new DatumSnapshotEvent(request.getConnectId(), dataServerConfig.getLocalDataCenter(), pubMap)); + // build DatumSnapshotEvent and send to eventCenter + dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), cachePubMap, pubMap)); // record the renew timestamp datumLeaseManager.renew(request.getConnectId()); From 1f34eb4381d972c5afdac6b7b5ec9b7027a2005b Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 15 Jul 2019 14:55:55 +0800 Subject: [PATCH 066/161] fix jetty version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b15dc405..7a73144c3 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 1.2.4 4.0.2 2.4 - [9.4.17.v20190418,) + [9.4.17.v20190418,9.4.19.v20190610] ${user.dir} -Dnetwork_interface_denylist=docker0 From 22a13f698f5b8a3e7446941dac58caf44ef7cc44 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 16 Jul 2019 16:39:52 +0800 Subject: [PATCH 067/161] bugfix DatumLeaseManager: If in a non-working state, cannot clean up because the renew request cannot be received at this time. --- .../server/data/cache/DatumCache.java | 70 ------------------- .../server/data/renew/DatumLeaseManager.java | 18 +++-- 2 files changed, 13 insertions(+), 75 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 92b5ca43d..8487af26c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -267,76 +267,6 @@ private MergeResult mergeDatum(Datum datum) { return new MergeResult(lastVersion, isChanged); } - // /** - // * cover datum by connectId - // */ - // public void putSnapshot(Map toBeDeletedPubMap, Map snapshotPubMap) { - // - // //remove all old pub - // for (Entry toBeDeletedPubEntry : toBeDeletedPubMap.entrySet()) { - // String registerId = toBeDeletedPubEntry.getKey(); - // Publisher toBeDeletedPub = toBeDeletedPubEntry.getValue(); - // Datum cacheDatum = DATUM_MAP.get(dataServerConfig.getLocalDataCenter()).get(toBeDeletedPub.getDataInfoId()); - // if (cacheDatum != null) { - // Map cachePubMap = cacheDatum.getPubMap(); - // cachePubMap.remove(registerId); - // removeFromIndex(toBeDeletedPub); - // } - // } - // // add all snapshot pub - // for (Entry pubEntry : snapshotPubMap.entrySet()) { - // String registerId = pubEntry.getKey(); - // Publisher snapshotPub = pubEntry.getValue(); - // Map datumMap = getDatumMapByDataCenter(dataServerConfig.getLocalDataCenter()); - // String dataInfoId = snapshotPub.getDataInfoId(); - // Datum cacheDatum = datumMap.get(dataInfoId); - // if (cacheDatum == null) { - // cacheDatum = new Datum(dataInfoId, dataServerConfig.getLocalDataCenter()); - // Datum datum = datumMap.putIfAbsent(dataInfoId, cacheDatum); - // if (datum != null) { - // cacheDatum = datum; - // } - // } - // cacheDatum.getPubMap().put(registerId, snapshotPub); - // } - // - // } - - // /** - // * cover datum by connectId - // */ - // public void putSnapshot(String dataInfoId, Map toBeDeletedPubMap, - // Map snapshotPubMap) { - // // get cache datum - // Map datumMap = getDatumMapByDataCenter(dataServerConfig.getLocalDataCenter()); - // Datum cacheDatum = datumMap.get(dataInfoId); - // if (cacheDatum == null) { - // cacheDatum = new Datum(dataInfoId, dataServerConfig.getLocalDataCenter()); - // Datum datum = datumMap.putIfAbsent(dataInfoId, cacheDatum); - // if (datum != null) { - // cacheDatum = datum; - // } - // } - // //remove toBeDeletedPubMap from cacheDatum - // for (Entry toBeDeletedPubEntry : toBeDeletedPubMap.entrySet()) { - // String registerId = toBeDeletedPubEntry.getKey(); - // Publisher toBeDeletedPub = toBeDeletedPubEntry.getValue(); - // if (cacheDatum != null) { - // Map cachePubMap = cacheDatum.getPubMap(); - // cachePubMap.remove(registerId); - // removeFromIndex(toBeDeletedPub); - // } - // } - // // add snapshotPubMap to cacheDatum - // for (Entry pubEntry : snapshotPubMap.entrySet()) { - // String registerId = pubEntry.getKey(); - // Publisher snapshotPub = pubEntry.getValue(); - // cacheDatum.getPubMap().put(registerId, snapshotPub); - // addToIndex(snapshotPub); - // } - // - // } - /** * cover datum by snapshot */ diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index 026dd6464..e1c6df2e2 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -35,8 +35,10 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; +import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -73,6 +75,9 @@ public class DatumLeaseManager { @Autowired private DatumCache datumCache; + @Autowired + private DataNodeStatus dataNodeStatus; + private ScheduledThreadPoolExecutor executorForHeartbeatLess; private ScheduledFuture futureForHeartbeatLess; @@ -222,8 +227,14 @@ private class EvictTaskForHeartbeatLess implements Runnable { @Override public void run() { - LOGGER.info("EvictTaskForHeartbeatLess started."); - long startTime = System.currentTimeMillis(); + // If in a non-working state, cannot clean up because the renew request cannot be received at this time. + if (dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING) { + LOGGER + .info( + "EvictTaskForHeartbeatLess skipped cause DataNodeStatus is {}, will retry after {}s", + dataNodeStatus.getStatus(), dataServerConfig.getDatumTimeToLiveSec()); + return; + } Set allConnectIds = datumCache.getAllConnectIds(); for (String connectId : allConnectIds) { @@ -239,9 +250,6 @@ public void run() { } } } - - LOGGER.info("EvictTaskForHeartbeatLess end, elapsed time is {}ms.", - (System.currentTimeMillis() - startTime)); } } } \ No newline at end of file From 0aa6c35227eee369cc4cbae6f85140c102b946c3 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 16 Jul 2019 18:55:56 +0800 Subject: [PATCH 068/161] remove SessionSerialFilterResource --- .../bootstrap/SessionServerConfiguration.java | 26 ++++----- .../resource/SessionSerialFilterResource.java | 53 ------------------- 2 files changed, 10 insertions(+), 69 deletions(-) delete mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 0aa7d280c..24e555045 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -16,17 +16,6 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.util.ArrayList; -import java.util.Collection; - -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; @@ -102,7 +91,6 @@ import com.alipay.sofa.registry.server.session.resource.HealthResource; import com.alipay.sofa.registry.server.session.resource.SessionDigestResource; import com.alipay.sofa.registry.server.session.resource.SessionOpenResource; -import com.alipay.sofa.registry.server.session.resource.SessionSerialFilterResource; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.timertask.SyncClientsHeartbeatTask; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -142,6 +130,16 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import java.util.ArrayList; +import java.util.Collection; /** * @@ -331,10 +329,6 @@ public ClientsOpenResource clientsOpenResource() { return new ClientsOpenResource(); } - @Bean - public SessionSerialFilterResource sessionSerialFilterResource() { - return new SessionSerialFilterResource(); - } } @Configuration diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java deleted file mode 100644 index 684decc0a..000000000 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/resource/SessionSerialFilterResource.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.server.session.resource; - -import sun.misc.ObjectInputFilter; - -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import java.lang.reflect.Field; - -/** - * - * @author shangyu.wh - * @version 1.0: SessionSerialFilterResource.java, v 0.1 2019-07-09 15:24 shangyu.wh Exp $ - */ -@Path("serialFilter") -public class SessionSerialFilterResource { - - @POST - @Path("blacklist/jvm") - @Produces(MediaType.APPLICATION_JSON) - public void setJvmSerialFilter(String blacklist) { - try { - Field serialFilterField = ObjectInputFilter.Config.class - .getDeclaredField("serialFilter"); - serialFilterField.setAccessible(true); - serialFilterField.set(ObjectInputFilter.Config.class, - ObjectInputFilter.Config.createFilter(blacklist)); - serialFilterField.setAccessible(false); - } catch (Throwable e) { - System.err //NOPMD - .println("Current JDK do not support update black list, please update JDK if the feature is needed."); //NOPMD - e.printStackTrace(); //NOPMD - } - } - -} \ No newline at end of file From db73cb6ac21329cbf30a0e5ff0e4553cb40f174d Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 16 Jul 2019 19:41:16 +0800 Subject: [PATCH 069/161] WriteDataProcessor add TaskEvent log; Cache print task update --- .../server/data/cache/CacheDigestTask.java | 5 ++-- .../session/acceptor/WriteDataProcessor.java | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java index d301be6c6..42d12f15a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java @@ -89,9 +89,8 @@ private String logPublisher(Publisher publisher) { if (publisher != null) { URL url = publisher.getSourceAddress(); String urlStr = url != null ? url.getAddressString() : "null"; - return String.format("dataInfoId=%s, version=%s, host=%s, registerId=%s", - publisher.getDataInfoId(), publisher.getVersion(), urlStr, - publisher.getRegisterId()); + return String.format("registerId=%s, registerTimestamp=%s, host=%s, version=%s", publisher.getRegisterId(), + publisher.getRegisterTimestamp(),urlStr, publisher.getVersion()); } return ""; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 14bffdafd..b777f6268 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -23,9 +23,7 @@ import java.util.concurrent.atomic.AtomicLong; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; -import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; -import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.acceptor.WriteDataRequest.WriteDataRequestType; @@ -52,6 +50,11 @@ public class WriteDataProcessor { ValueConstants.LOGGER_NAME_RENEW, "[WriteDataProcessor]"); + private static final Logger taskLogger = LoggerFactory + .getLogger( + WriteDataProcessor.class, + "[Task]"); + private final TaskListenerManager taskListenerManager; private final SessionServerConfig sessionServerConfig; @@ -211,9 +214,7 @@ private void doRenewAsync(WriteDataRequest request) { connectId, request.getRequestType(), request.getRequestBody()); } - RenewDatumRequest renewDatumRequest = (RenewDatumRequest) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(renewDatumRequest, TaskType.RENEW_DATUM_TASK); - taskListenerManager.sendTaskEvent(taskEvent); + sendEvent(request.getRequestBody(), TaskType.RENEW_DATUM_TASK); } private void doClientOffAsync(WriteDataRequest request) { @@ -223,9 +224,7 @@ private void doClientOffAsync(WriteDataRequest request) { } String connectId = request.getConnectId(); - TaskEvent taskEvent = new TaskEvent(Lists.newArrayList(connectId), - TaskType.CANCEL_DATA_TASK); - taskListenerManager.sendTaskEvent(taskEvent); + sendEvent(Lists.newArrayList(connectId), TaskType.CANCEL_DATA_TASK); } private void doUnPublishAsync(WriteDataRequest request) { @@ -234,9 +233,7 @@ private void doUnPublishAsync(WriteDataRequest request) { connectId, request.getRequestType(), request.getRequestBody()); } - Publisher unPublisher = (Publisher) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(unPublisher, TaskType.UN_PUBLISH_DATA_TASK); - taskListenerManager.sendTaskEvent(taskEvent); + sendEvent(request.getRequestBody(), TaskType.UN_PUBLISH_DATA_TASK); } private void doPublishAsync(WriteDataRequest request) { @@ -245,8 +242,12 @@ private void doPublishAsync(WriteDataRequest request) { connectId, request.getRequestType(), request.getRequestBody()); } - Publisher publisher = (Publisher) request.getRequestBody(); - TaskEvent taskEvent = new TaskEvent(publisher, TaskType.PUBLISH_DATA_TASK); + sendEvent(request.getRequestBody(), TaskType.PUBLISH_DATA_TASK); + } + + private void sendEvent(Object eventObj, TaskType taskType) { + TaskEvent taskEvent = new TaskEvent(eventObj, taskType); + taskLogger.info("send " + taskType + " taskEvent:{}", taskEvent); taskListenerManager.sendTaskEvent(taskEvent); } From a022df39fefd7fc35eed4f12f5a582013a0d89aa Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 16 Jul 2019 22:56:46 +0800 Subject: [PATCH 070/161] data bugfix: snapshot must notify session --- .../server/data/change/notify/SessionServerNotifier.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index aa0764e96..451f89804 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -95,6 +95,7 @@ public Set getSuitableSource() { Set set = new HashSet<>(); set.add(DataSourceTypeEnum.PUB); set.add(DataSourceTypeEnum.SYNC); + set.add(DataSourceTypeEnum.SNAPSHOT); return set; } From 85b4e6a02c6577386475ead6915b27d1c5b15a06 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 17 Jul 2019 16:54:39 +0800 Subject: [PATCH 071/161] fix SubscriberPushEmptyTask default implement --- .../bootstrap/SessionServerConfiguration.java | 1 + .../scheduler/task/SubscriberPushEmptyTask.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 24e555045..88cce9827 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -560,6 +560,7 @@ public TaskListener unPublishDataTaskListener(TaskListenerManager taskListenerMa } @Bean + @ConditionalOnMissingBean(name = "subscriberPushEmptyTaskListener") public TaskListener subscriberPushEmptyTaskListener(TaskListenerManager taskListenerManager) { TaskListener taskListener = new SubscriberPushEmptyTaskListener(); taskListenerManager.addTaskListener(taskListener); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java index 4dff3c475..9158953d0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java @@ -87,7 +87,7 @@ public void execute() { executeTask(); } - private void executeTask() { + protected void executeTask() { if (subscriber == null) { throw new IllegalArgumentException("Subscriber can not be null!"); @@ -126,17 +126,18 @@ private void executeTask() { } - private void fireReceivedDataPushTask(List subscriberRegisterIdList, ScopeEnum scopeEnum) { + protected void fireReceivedDataPushTask(List subscriberRegisterIdList, + ScopeEnum scopeEnum) { ReceivedData receivedData = ReceivedDataConverter.getReceivedDataMulti( subscriber.getDataId(), subscriber.getGroup(), subscriber.getInstanceId(), - sessionServerConfig.getSessionServerDataCenter(), scopeEnum, subscriberRegisterIdList, - sessionServerConfig.getSessionServerRegion()); + ValueConstants.DEFAULT_DATA_CENTER, scopeEnum, subscriberRegisterIdList, + subscriber.getCell()); //no datum set version current timestamp receivedData.setVersion(System.currentTimeMillis()); firePush(receivedData); } - private void firePush(ReceivedData receivedData) { + protected void firePush(ReceivedData receivedData) { //trigger push to client node Map parameter = new HashMap<>(); parameter.put(receivedData, subscriber.getSourceAddress()); @@ -146,7 +147,7 @@ private void firePush(ReceivedData receivedData) { taskListenerManager.sendTaskEvent(taskEvent); } - private void fireUserDataElementPushTask() { + protected void fireUserDataElementPushTask() { //no datum Datum datum = new Datum(); @@ -172,7 +173,7 @@ private void fireUserDataElementPushTask() { taskListenerManager.sendTaskEvent(taskEvent); } - private void fireUserDataElementMultiPushTask() { + protected void fireUserDataElementMultiPushTask() { //no datum Datum datum = new Datum(); From 9188f5820790298642226eb1bf10ab7f797492fc Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 17 Jul 2019 16:59:34 +0800 Subject: [PATCH 072/161] merge new --- .../sofa/registry/server/data/cache/CacheDigestTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java index 42d12f15a..feec34a6f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java @@ -89,8 +89,9 @@ private String logPublisher(Publisher publisher) { if (publisher != null) { URL url = publisher.getSourceAddress(); String urlStr = url != null ? url.getAddressString() : "null"; - return String.format("registerId=%s, registerTimestamp=%s, host=%s, version=%s", publisher.getRegisterId(), - publisher.getRegisterTimestamp(),urlStr, publisher.getVersion()); + return String.format("registerId=%s, registerTimestamp=%s, host=%s, version=%s", + publisher.getRegisterId(), publisher.getRegisterTimestamp(), urlStr, + publisher.getVersion()); } return ""; } From 7e0d899c9b2b28c75dfa26b57a280e681a80fe76 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 19 Jul 2019 21:06:00 +0800 Subject: [PATCH 073/161] fix protect --- .../scheduler/task/SubscriberPushEmptyTask.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java index 9158953d0..247510270 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java @@ -45,15 +45,15 @@ */ public class SubscriberPushEmptyTask extends AbstractSessionTask { - private static final Logger taskLogger = LoggerFactory.getLogger( - SubscriberPushEmptyTask.class, "[Task]"); + private static final Logger taskLogger = LoggerFactory.getLogger( + SubscriberPushEmptyTask.class, "[Task]"); - private final SessionServerConfig sessionServerConfig; + protected final SessionServerConfig sessionServerConfig; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ - private final TaskListenerManager taskListenerManager; - private Subscriber subscriber; + protected final TaskListenerManager taskListenerManager; + protected Subscriber subscriber; public SubscriberPushEmptyTask(SessionServerConfig sessionServerConfig, TaskListenerManager taskListenerManager) { From aac48e2e4cd758eebd322bddfd3264467d8f923f Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 22 Jul 2019 11:38:09 +0800 Subject: [PATCH 074/161] 1. When the pub of connectId is 0, no clearance action is triggered. 2. Print map. size regularly 3. Delete the log: "ConnectId (% s) expired, lastRenewTime is% s, pub. size is 0" --- .../registry/server/data/cache/CacheDigestTask.java | 5 +++-- .../server/data/renew/DatumLeaseManager.java | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java index 42d12f15a..feec34a6f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/CacheDigestTask.java @@ -89,8 +89,9 @@ private String logPublisher(Publisher publisher) { if (publisher != null) { URL url = publisher.getSourceAddress(); String urlStr = url != null ? url.getAddressString() : "null"; - return String.format("registerId=%s, registerTimestamp=%s, host=%s, version=%s", publisher.getRegisterId(), - publisher.getRegisterTimestamp(),urlStr, publisher.getVersion()); + return String.format("registerId=%s, registerTimestamp=%s, host=%s, version=%s", + publisher.getRegisterId(), publisher.getRegisterTimestamp(), urlStr, + publisher.getVersion()); } return ""; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index e1c6df2e2..231e67c01 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -181,10 +181,12 @@ private void scheduleEvictTask(String connectId, long delaySec) { System.currentTimeMillis() - lastRenewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; if (isExpired) { int ownPubSize = getOwnPubSize(connectId); - LOGGER.info("ConnectId({}) expired, lastRenewTime is {}, pub.size is {}", connectId, - format(lastRenewTime), ownPubSize); + if (ownPubSize > 0) { + LOGGER.info("Evict connectId({}) cause it's expired, lastRenewTime is {}, pub.size is {}", + connectId, format(lastRenewTime), ownPubSize); + evict(connectId); + } connectIdRenewTimestampMap.remove(connectId, lastRenewTime); - evict(connectId); continued = false; } else { nextDelaySec = dataServerConfig.getDatumTimeToLiveSec() @@ -244,12 +246,14 @@ public void run() { int ownPubSize = getOwnPubSize(connectId); if (ownPubSize > 0) { LOGGER.info( - "ConnectId({}) expired cause it has no heartbeat, pub.size is {}", + "Evict connectId({}) cause it has no heartbeat, pub.size is {}", connectId, ownPubSize); evict(connectId); } } } + + LOGGER.info("connectIdRenewTimestampMap.size is {}", connectIdRenewTimestampMap.size()); } } } \ No newline at end of file From 15ef70c5dda9901bd28b12be5720c4988b540bb7 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 22 Jul 2019 11:58:57 +0800 Subject: [PATCH 075/161] =?UTF-8?q?DataNodeExchanger=EF=BC=9A=20print=20bu?= =?UTF-8?q?t=20ignore=20if=20from=20renew=20module,=20cause=20renew=20requ?= =?UTF-8?q?est=20is=20too=20much?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../session/remoting/DataNodeExchanger.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index fe1c2666a..9110b5636 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -86,18 +87,20 @@ public Response request(Request request) throws RequestException { if (channel == null) { channel = sessionClient.connect(url); } - EXCHANGE_LOGGER.info("DataNode Exchanger request={},url={}", request.getRequestBody(), url); - final Object result = sessionClient.sendSync(channel, request.getRequestBody(), - sessionServerConfig.getDataNodeExchangeTimeOut()); + // print but ignore if from renew module, cause renew request is too much + if (!(request.getRequestBody() instanceof RenewDatumRequest)) { + EXCHANGE_LOGGER.info("DataNode Exchanger request={},url={}", request.getRequestBody(), url); + } + + final Object result = sessionClient + .sendSync(channel, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); if (result == null) { - throw new RequestException("DataNode Exchanger request data get null result!", - request); + throw new RequestException("DataNode Exchanger request data get null result!", request); } response = () -> result; } catch (Exception e) { - throw new RequestException("DataNode Exchanger request data error!Request url:" + url, - request, e); + throw new RequestException("DataNode Exchanger request data error!Request url:" + url, request, e); } return response; From d808a35bacc095470b4f2e1132607873f34e7416 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 22 Jul 2019 15:26:23 +0800 Subject: [PATCH 076/161] reduce log of renew --- .../session/acceptor/WriteDataProcessor.java | 7 ++++++- .../processor/DataNodeSingleTaskProcessor.java | 15 +++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index b777f6268..8dfa48ca5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -247,7 +247,12 @@ private void doPublishAsync(WriteDataRequest request) { private void sendEvent(Object eventObj, TaskType taskType) { TaskEvent taskEvent = new TaskEvent(eventObj, taskType); - taskLogger.info("send " + taskType + " taskEvent:{}", taskEvent); + + //print but ignore if from renew module, cause renew request is too much + if (taskType != TaskType.RENEW_DATUM_TASK) { + taskLogger.info("send " + taskType + " taskEvent:{}", taskEvent); + } + taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/processor/DataNodeSingleTaskProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/processor/DataNodeSingleTaskProcessor.java index 74d6c9c43..f3e376b90 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/processor/DataNodeSingleTaskProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/processor/DataNodeSingleTaskProcessor.java @@ -16,14 +16,15 @@ */ package com.alipay.sofa.registry.server.session.node.processor; +import java.util.List; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.scheduler.task.RenewDatumTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.task.Retryable; import com.alipay.sofa.registry.task.batcher.TaskProcessor; -import java.util.List; - /** * * @author shangyu.wh @@ -37,9 +38,15 @@ public class DataNodeSingleTaskProcessor implements TaskProcessor { @Override public ProcessingResult process(SessionTask task) { try { - LOGGER.info("execute " + task); + if (!(task instanceof RenewDatumTask)) { + LOGGER.info("execute " + task); + } + task.execute(); - LOGGER.info("end " + task); + + if (!(task instanceof RenewDatumTask)) { + LOGGER.info("end " + task); + } return ProcessingResult.Success; } catch (Throwable throwable) { LOGGER.error("Data node SingleTask Process error! Task:" + task, throwable); From 2853738fd6bab24f4750f98d1e6c2a7052c9ba0b Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 22 Jul 2019 17:11:26 +0800 Subject: [PATCH 077/161] data bugfix: Data coverage is also allowed when versions are equal. Consistent with session design. --- .../registry/server/data/change/event/DataChangeEventQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java index daa33c7e0..f3b1f78cc 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/event/DataChangeEventQueue.java @@ -287,7 +287,7 @@ private void handleDatum(DataChangeTypeEnum changeType, DataSourceTypeEnum sourc // and version of cachePub is greater than version of pub, should be ignored if (!(pub instanceof UnPublisher) && !(cachePub instanceof UnPublisher) && pub.getSourceAddress().equals(cachePub.getSourceAddress()) - && cachePub.getVersion() >= pub.getVersion()) { + && cachePub.getVersion() > pub.getVersion()) { continue; } } From 88a9fd10d159869be072a71647214004512db89e Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 22 Jul 2019 20:08:05 +0800 Subject: [PATCH 078/161] DatumCache bugfix: Index coverage should be updated after pubMap update --- .../sofa/registry/server/data/cache/DatumCache.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 8487af26c..84e56d4f9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -320,19 +320,16 @@ private boolean mergePublisher(Publisher pub, Map cachePubMap isChanged = true; } } else { - String connectId = getConnectId(pub); long version = pub.getVersion(); long cacheVersion = cachePub == null ? 0L : cachePub.getVersion(); - String cacheConnectId = cachePub == null ? "" : getConnectId(cachePub); if (cacheVersion <= version) { cachePubMap.put(registerId, pub); - // if version of both pub and cachePub are not equal, or sourceAddress of both are not equal, update + // connectId and cacheConnectId may not be equal, so indexes need to be deleted and added, rather than overwritten directly. + // why connectId and cacheConnectId may not be equal? // eg: sessionserver crash, client(RegistryClient but not ConfregClient) reconnect to other sessionserver, sourceAddress changed, version not changed - if (!connectId.equals(cacheConnectId) || cacheVersion < version) { - removeFromIndex(cachePub); - addToIndex(pub); - isChanged = true; - } + removeFromIndex(cachePub); + addToIndex(pub); + isChanged = true; } } return isChanged; From e8331b1644c3c0e487f951865975045ad73c3b4e Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 23 Jul 2019 16:28:36 +0800 Subject: [PATCH 079/161] DatumSnapshotHandler: limit print; do not call dataChangeEventCenter.onChange if no diff --- .../handler/DatumSnapshotHandler.java | 59 ++++++++++++++----- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 679beddd2..e03ba6318 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -17,6 +17,8 @@ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -32,7 +34,6 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; @@ -50,12 +51,15 @@ public class DatumSnapshotHandler extends AbstractServerHandler { /** LOGGER */ - private static final Logger LOGGER = LoggerFactory - .getLogger(DatumSnapshotHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(DatumSnapshotHandler.class); - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[DatumSnapshotHandler]"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DatumSnapshotHandler]"); + + /** Limited List Printing */ + private static final int LIMITED_LIST_SIZE_FOR_PRINT = 100; @Autowired private ForwardService forwardService; @@ -63,9 +67,6 @@ public class DatumSnapshotHandler extends AbstractServerHandler p.getRegisterId(), p -> p)); // diff the cache and snapshot + boolean isDiff = true; Map cachePubMap = datumCache.getOwnByConnectId(request.getConnectId()); if (cachePubMap == null) { - RENEW_LOGGER.info(">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, the diff is: pubMap={}", - request.getConnectId(), pubMap.size(), pubMap); + RENEW_LOGGER + .info(">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, isDiff={}, the diff is: pubMap={}", + request.getConnectId(), pubMap.size(), isDiff, limitedToString(pubMap.values())); } else { List diffPub1 = subtract(pubMap, cachePubMap); List diffPub2 = subtract(cachePubMap, pubMap); + if (diffPub1.size() == 0 && diffPub2.size() == 0) { + isDiff = false; + } RENEW_LOGGER - .info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, the diff is: pubMap-cachePubMap={}, cachePubMap-pubMap={}", - request.getConnectId(), cachePubMap.size(), pubMap.size(), diffPub1, diffPub2); + .info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, isDiff={}, the diff is: pubMap-cachePubMap=(size:{}){}, cachePubMap-pubMap=(size:{}){}", + request.getConnectId(), cachePubMap.size(), pubMap.size(), isDiff, diffPub1.size(), + limitedToString(diffPub1), diffPub2.size(), limitedToString(diffPub2)); } - // build DatumSnapshotEvent and send to eventCenter - dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), cachePubMap, pubMap)); + if (isDiff) { + // build DatumSnapshotEvent and send to eventCenter + dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), cachePubMap, pubMap)); + } // record the renew timestamp datumLeaseManager.renew(request.getConnectId()); @@ -115,6 +124,26 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { return CommonResponse.buildSuccessResponse(); } + /** + * Limited List Printing + */ + private String limitedToString(Collection publishers) { + Iterator it = publishers.iterator(); + if (!it.hasNext()) + return "[]"; + + StringBuilder sb = new StringBuilder(); + sb.append('['); + int i = 1; + for (;;) { + Publisher e = it.next(); + sb.append(e); + if (!it.hasNext() || i++ >= LIMITED_LIST_SIZE_FOR_PRINT) + return sb.append(']').toString(); + sb.append(',').append(' '); + } + } + private List subtract(Map pubMap1, Map pubMap2) { List list = new ArrayList(); for (Map.Entry entry : pubMap1.entrySet()) { From 9f5137f40b043ed925b057abecb3bd760e05b3e3 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 24 Jul 2019 15:12:26 +0800 Subject: [PATCH 080/161] =?UTF-8?q?bugfix=20unpub=20npe=20(pub=20maybe=20a?= =?UTF-8?q?lready=20clean=20by=20DatumLeaseManager)=EF=BC=9BLIMITED=5FLIST?= =?UTF-8?q?=5FSIZE=5FFOR=5FPRINT=20change=20to=2030?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sessionserver/handler/DatumSnapshotHandler.java | 2 +- .../remoting/sessionserver/handler/PublishDataHandler.java | 3 ++- .../sessionserver/handler/UnPublishDataHandler.java | 6 ++++-- .../server/session/acceptor/WriteDataProcessor.java | 6 +++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index e03ba6318..719d0da33 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -59,7 +59,7 @@ public class DatumSnapshotHandler extends AbstractServerHandler pubMap = datum.getPubMap(); if (pubMap != null) { Publisher publisher = pubMap.get(request.getRegisterId()); - return publisher.getSourceAddress().getAddressString(); + if (publisher != null) { + return publisher.getSourceAddress().getAddressString(); + } } return null; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 8dfa48ca5..3b534546d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -145,7 +145,11 @@ private void addQueue(WriteDataRequest request) { * @return */ private boolean isWriteRequest(WriteDataRequest request) { - return request.getRequestType() != WriteDataRequestType.RENEW_DATUM; + // UN_PUBLISHER is not guaranteed to find the corresponding connectId on the data side (because of expired cleaning or bugs, etc. ), + // so don't block the renew, don't consider it as a write request + return request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT + || request.getRequestType() == WriteDataRequestType.PUBLISHER + || request.getRequestType() == WriteDataRequestType.CLIENT_OFF; } /** From fc2964f74141ac0446ec3a2ff5f4c4b527a2c0b7 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 24 Jul 2019 15:14:30 +0800 Subject: [PATCH 081/161] some code refactor --- .../common/model/dataserver/UnPublishDataRequest.java | 6 ------ .../session/node/service/DataNodeServiceImpl.java | 7 +++---- .../server/session/renew/DefaultRenewService.java | 11 ++--------- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/UnPublishDataRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/UnPublishDataRequest.java index cfa8554ac..33fbdbf0c 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/UnPublishDataRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/UnPublishDataRequest.java @@ -34,12 +34,6 @@ public class UnPublishDataRequest implements Serializable { private long registerTimestamp; - /** - * constructor - */ - public UnPublishDataRequest() { - } - /** * construtor * @param dataInfoId diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 5a71bbc82..348c25020 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -154,10 +154,9 @@ private Request buildUnPublishDataRequest(Publisher publis @Override public UnPublishDataRequest getRequestBody() { - UnPublishDataRequest unPublishDataRequest = new UnPublishDataRequest(); - unPublishDataRequest.setDataInfoId(publisher.getDataInfoId()); - unPublishDataRequest.setRegisterId(publisher.getRegisterId()); - unPublishDataRequest.setRegisterTimestamp(publisher.getRegisterTimestamp()); + UnPublishDataRequest unPublishDataRequest = new UnPublishDataRequest( + publisher.getDataInfoId(), publisher.getRegisterId(), + publisher.getRegisterTimestamp()); return unPublishDataRequest; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java index a971fd445..5270777af 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java @@ -28,10 +28,7 @@ import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.RenewDatumRequest; -import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.store.DataStore; @@ -42,17 +39,13 @@ */ public class DefaultRenewService implements RenewService { - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[WriteDataProcessor]"); - /*** store publishers */ @Autowired - private DataStore sessionDataStore; + private DataStore sessionDataStore; /*** calculate data node url */ @Autowired - private NodeManager dataNodeManager; + private NodeManager dataNodeManager; @Override public List getRenewDatumRequests(String connectId) { From bd8c0d1abb5f5f5395ce5453ccb84eb94d4b7f8c Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 25 Jul 2019 17:13:18 +0800 Subject: [PATCH 082/161] add code comment --- .../meta/resource/BlacklistDataResource.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java index 26bd30d30..a43fbff58 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.meta.resource; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.console.PersistenceData; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.DataOperator; @@ -29,12 +36,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; /** * @@ -58,6 +59,7 @@ public class BlacklistDataResource { /** * update blacklist + * e.g. curl -d '{"FORBIDDEN_PUB":{"IP_FULL":["1.1.1.1","10.15.233.150"]},"FORBIDDEN_SUB_BY_PREFIX":{"IP_FULL":["1.1.1.1"]}}' -H "Content-Type: application/json" -X POST http://localhost:9615/blacklist/update */ @POST @Path("update") From 79cd2ad725a856e00253e388599a30c09fc4e055 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 26 Jul 2019 10:51:12 +0800 Subject: [PATCH 083/161] fix data working to init,and fix empty push version --- .../server/data/cache/DataServerCache.java | 15 ++++++--- .../data/event/DataServerChangeEvent.java | 25 ++++++++++++-- .../handler/DataServerChangeEventHandler.java | 33 +++++++++---------- .../LocalDataServerChangeEventHandler.java | 33 +++++++++---------- .../handler/MetaServerChangeEventHandler.java | 18 +++++----- .../task/ConnectionRefreshTask.java | 4 ++- .../handler/ServerChangeHandler.java | 3 +- .../task/SubscriberPushEmptyTask.java | 7 ++-- 8 files changed, 84 insertions(+), 54 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java index a99565375..89e64f392 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java @@ -21,6 +21,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent.FromType; import com.alipay.sofa.registry.server.data.event.handler.AfterWorkingProcessHandler; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; @@ -77,7 +78,7 @@ public class DataServerCache { * @param newItem * @return changedMap(datacenter, serverIp) */ - public Map> compareAndSet(DataServerChangeItem newItem) { + public Map> compareAndSet(DataServerChangeItem newItem, FromType fromType) { synchronized (DataServerCache.class) { // versionMap: datacenter -> version Map newVersionMap = newItem.getVersionMap(); @@ -108,8 +109,8 @@ public Map> compareAndSet(DataServerChangeItem newItem) { if (isTheSame.get()) { LOGGER .info( - "current process map has a same version as change map,this change will be ignored!process version={},get version={}", - currentNewVersionMap, newVersionMap); + "current process map has a same version as change map,this change will be ignored!process version={},get version={},from={}", + currentNewVersionMap, newVersionMap, fromType); return new HashMap<>(); } } @@ -137,7 +138,8 @@ public Map> compareAndSet(DataServerChangeItem newItem) { init(newVersionMap.get(dataServerConfig.getLocalDataCenter())); } if (!changedMap.isEmpty()) { - LOGGER.info("old server map = {}", dataServerChangeItem.getServerMap()); + LOGGER.info("old server map = {},from={}", dataServerChangeItem.getServerMap(), + fromType); LOGGER.info("new server map = {}", newServerMap); LOGGER.info("new server version map = {}", newVersionMap); LOGGER.info("status map = {}", nodeStatusMap); @@ -268,6 +270,11 @@ private void updateDataServerStatus() { dataNodeStatus.setStatus(LocalServerStatusEnum.WORKING); + //after working update current dataCenter list to old DataServerChangeItem + updateItem( + newDataServerChangeItem.getServerMap().get(dataServerConfig.getLocalDataCenter()), + newVersion, dataServerConfig.getLocalDataCenter()); + //after working status,must clean this map,because calculate backupTriad need add not working node,see LocalDataServerChangeEventHandler getToBeSyncMap resetStatusMapToWorking(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/DataServerChangeEvent.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/DataServerChangeEvent.java index a41dfd113..447c3af8c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/DataServerChangeEvent.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/DataServerChangeEvent.java @@ -29,14 +29,24 @@ */ public class DataServerChangeEvent { + /** + * node type enum + */ + public enum FromType { + CONNECT_TASK, META_NOTIFY, REGISTER_META + } + private DataServerChangeItem dataServerChangeItem; + private FromType fromType; + /** * constructor * @param dataServerChangeItem */ - public DataServerChangeEvent(DataServerChangeItem dataServerChangeItem) { + public DataServerChangeEvent(DataServerChangeItem dataServerChangeItem, FromType fromType) { this.dataServerChangeItem = dataServerChangeItem; + this.fromType = fromType; } /** @@ -45,7 +55,7 @@ public DataServerChangeEvent(DataServerChangeItem dataServerChangeItem) { * @param versionMap */ public DataServerChangeEvent(Map> serverMap, - Map versionMap) { + Map versionMap, FromType fromType) { if (serverMap == null) { serverMap = new HashMap<>(); } @@ -53,6 +63,8 @@ public DataServerChangeEvent(Map> serverMap, versionMap = new HashMap<>(); } this.dataServerChangeItem = new DataServerChangeItem(serverMap, versionMap); + + this.fromType = fromType; } /** @@ -63,4 +75,13 @@ public DataServerChangeEvent(Map> serverMap, public DataServerChangeItem getDataServerChangeItem() { return dataServerChangeItem; } + + /** + * Getter method for property fromType. + * + * @return property value of fromType + */ + public FromType getFromType() { + return fromType; + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java index 84fa90dfe..d9a0a3d49 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java @@ -16,16 +16,6 @@ */ package com.alipay.sofa.registry.server.data.event.handler; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.common.model.store.URL; @@ -42,6 +32,15 @@ import com.alipay.sofa.registry.server.data.remoting.DataNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; import com.alipay.sofa.registry.server.data.util.TimeUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * @@ -83,7 +82,7 @@ public void doHandle(DataServerChangeEvent event) { dataServerConfig.getLocalDataCenter()).keySet(); //get changed dataservers Map> changedMap = dataServerCache - .compareAndSet(dataServerChangeItem); + .compareAndSet(dataServerChangeItem,event.getFromType()); if(!changedMap.isEmpty()) { for (Entry> changeEntry : changedMap.entrySet()) { String dataCenter = changeEntry.getKey(); @@ -105,8 +104,8 @@ public void doHandle(DataServerChangeEvent event) { if (!ips.contains(ip)) { DataServerNodeFactory.remove(dataCenter, ip, dataServerConfig); LOGGER.info( - "[DataServerChangeEventHandler] remove connection, datacenter:{}, ip:{}", - dataCenter, ip); + "[DataServerChangeEventHandler] remove connection, datacenter:{}, ip:{},from:{}", + dataCenter, ip,event.getFromType()); } } @@ -119,8 +118,8 @@ public void doHandle(DataServerChangeEvent event) { //avoid input map reference operation DataServerNodeFactory MAP Map map = new ConcurrentHashMap<>(newDataNodes); - LOGGER.info("Node list change fire LocalDataServerChangeEvent,current node list={},version={}", - map.keySet(), newVersion); + LOGGER.info("Node list change fire LocalDataServerChangeEvent,current node list={},version={},from:{}", + map.keySet(), newVersion,event.getFromType()); eventCenter.post(new LocalDataServerChangeEvent(map, newjoined, dataServerChangeItem.getVersionMap() .get(dataServerConfig.getLocalDataCenter()), @@ -149,8 +148,8 @@ public void doHandle(DataServerChangeEvent event) { if (!StringUtils.equals(ip, DataServerConfig.IP)) { Connection connection = dataServerNode.getConnection(); if (connection != null && !connection.isFine()) { - LOGGER.warn("[DataServerChangeEventHandler] dataServer connections is not fine,try to reconnect it,old connection={},dataCenter={}", - connection.getRemoteAddress(), dataCenter); + LOGGER.warn("[DataServerChangeEventHandler] dataServer connections is not fine,try to reconnect it,old connection={},dataCenter={},from:{}", + connection.getRemoteAddress(), dataCenter,event.getFromType()); connectDataServer(dataCenter, ip); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 55797a1aa..8bc114c76 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -16,19 +16,6 @@ */ package com.alipay.sofa.registry.server.data.event.handler; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.NotifyFetchDatumRequest; @@ -54,6 +41,18 @@ import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.google.common.collect.Lists; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicBoolean; /** * @@ -132,10 +131,10 @@ public void run() { LocalDataServerChangeEvent event = events.take(); //if the new joined servers contains self, set status as INITIAL Set newJoined = event.getNewJoined(); - if (newJoined.contains(DataServerConfig.IP) - && dataNodeStatus.getStatus() != LocalServerStatusEnum.INITIAL) { - dataNodeStatus.setStatus(LocalServerStatusEnum.INITIAL); - } + //if (newJoined.contains(DataServerConfig.IP) + // && dataNodeStatus.getStatus() != LocalServerStatusEnum.INITIAL) { + // dataNodeStatus.setStatus(LocalServerStatusEnum.INITIAL); + //} //if size of events is greater than 0, not handle and continue, only handle the last one in the queue if (events.size() > 0) { continue; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java index 056109e9e..1498d8947 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/MetaServerChangeEventHandler.java @@ -16,14 +16,6 @@ */ package com.alipay.sofa.registry.server.data.event.handler; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - import com.alipay.remoting.Connection; import com.alipay.sofa.jraft.entity.PeerId; import com.alipay.sofa.registry.common.model.metaserver.DataNode; @@ -44,6 +36,13 @@ import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; import com.alipay.sofa.registry.server.data.util.TimeUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; /** * @@ -160,7 +159,8 @@ public URL getRequestUrl() { set.add(StartTaskTypeEnum.RENEW); eventCenter.post(new StartTaskEvent(set)); - eventCenter.post(new DataServerChangeEvent(result.getNodes(), versionMap)); + eventCenter.post(new DataServerChangeEvent(result.getNodes(), versionMap, + DataServerChangeEvent.FromType.REGISTER_META)); break; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java index 041bb2bc4..9e1b96586 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/task/ConnectionRefreshTask.java @@ -18,6 +18,7 @@ import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent; +import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent.FromType; import com.alipay.sofa.registry.server.data.event.EventCenter; import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; @@ -42,7 +43,8 @@ public class ConnectionRefreshTask extends AbstractTask { public void handle() { DataServerChangeItem dataServerChangeItem = metaServerService.getDateServers(); if (dataServerChangeItem != null) { - eventCenter.post(new DataServerChangeEvent(dataServerChangeItem)); + eventCenter + .post(new DataServerChangeEvent(dataServerChangeItem, FromType.CONNECT_TASK)); } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/ServerChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/ServerChangeHandler.java index 0174f5776..0ace90cc8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/ServerChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/ServerChangeHandler.java @@ -24,6 +24,7 @@ import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent; +import com.alipay.sofa.registry.server.data.event.DataServerChangeEvent.FromType; import com.alipay.sofa.registry.server.data.event.EventCenter; import com.alipay.sofa.registry.server.data.event.MetaServerChangeEvent; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; @@ -57,7 +58,7 @@ public Object doHandle(Channel channel, NodeChangeResult request) { ExecutorFactory.getCommonExecutor().execute(() -> { if (request.getNodeType() == NodeType.DATA) { eventCenter.post(new DataServerChangeEvent(request.getNodes(), - request.getDataCenterListVersions())); + request.getDataCenterListVersions(), FromType.META_NOTIFY)); } else if (request.getNodeType() == NodeType.META) { Map> metaNodesMap = request.getNodes(); if (metaNodesMap != null && !metaNodesMap.isEmpty()) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java index 247510270..027b2d7b4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SubscriberPushEmptyTask.java @@ -30,6 +30,7 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import com.alipay.sofa.registry.util.DatumVersionUtil; import java.util.ArrayList; import java.util.Collection; @@ -133,7 +134,7 @@ protected void fireReceivedDataPushTask(List subscriberRegisterIdList, ValueConstants.DEFAULT_DATA_CENTER, scopeEnum, subscriberRegisterIdList, subscriber.getCell()); //no datum set version current timestamp - receivedData.setVersion(System.currentTimeMillis()); + receivedData.setVersion(DatumVersionUtil.nextId()); firePush(receivedData); } @@ -155,7 +156,7 @@ protected void fireUserDataElementPushTask() { datum.setInstanceId(subscriber.getInstanceId()); datum.setGroup(subscriber.getGroup()); //no datum set version current timestamp - datum.setVersion(System.currentTimeMillis()); + datum.setVersion(DatumVersionUtil.nextId()); datum.setPubMap(new HashMap<>()); datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); @@ -181,7 +182,7 @@ protected void fireUserDataElementMultiPushTask() { datum.setInstanceId(subscriber.getInstanceId()); datum.setGroup(subscriber.getGroup()); //no datum set version as mini as - datum.setVersion(System.currentTimeMillis()); + datum.setVersion(DatumVersionUtil.nextId()); datum.setPubMap(new HashMap<>()); datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); From 4bfcb1484e0b0fc537e00a0f6ea0573f1fcb6036 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 14:48:17 +0800 Subject: [PATCH 084/161] consider unpub is isWriteRequest, Reduce Snapshot frequency --- .../server/session/acceptor/WriteDataProcessor.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 3b534546d..8dfa48ca5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -145,11 +145,7 @@ private void addQueue(WriteDataRequest request) { * @return */ private boolean isWriteRequest(WriteDataRequest request) { - // UN_PUBLISHER is not guaranteed to find the corresponding connectId on the data side (because of expired cleaning or bugs, etc. ), - // so don't block the renew, don't consider it as a write request - return request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT - || request.getRequestType() == WriteDataRequestType.PUBLISHER - || request.getRequestType() == WriteDataRequestType.CLIENT_OFF; + return request.getRequestType() != WriteDataRequestType.RENEW_DATUM; } /** From 2218f2ce0af7ae83b629b9b6685e4f8c744fc06f Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 15:37:46 +0800 Subject: [PATCH 085/161] RefreshUpdateTime is at the top, otherwise multiple snapshot can be issued concurrently --- .../server/session/acceptor/WriteDataProcessor.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 8dfa48ca5..26ed57586 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -105,6 +105,13 @@ public void process(WriteDataRequest request) { RENEW_LOGGER.debug("process: connectId={}, requestType={}, requestBody={}", connectId, request.getRequestType(), request.getRequestBody()); } + + // record the last update time + // RefreshUpdateTime is at the top, otherwise multiple snapshot can be issued concurrently + if (isWriteRequest(request)) { + refreshUpdateTime(); + } + if (request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT) { // snapshot has high priority, so handle directly doHandle(request); @@ -119,11 +126,6 @@ public void process(WriteDataRequest request) { } } - // record the last update time - if (isWriteRequest(request)) { - refreshUpdateTime(); - } - } private void addQueue(WriteDataRequest request) { From 352c31d6198bea4fae426dfac32003f468028039 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 15:39:13 +0800 Subject: [PATCH 086/161] update config: reduce retryTimes, increase delayTime, the purpose is to reduce performance consumption --- .../bootstrap/SessionServerConfigBean.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 5925552e7..1c51912d0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -16,9 +16,6 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.util.Collections; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; @@ -84,31 +81,31 @@ public class SessionServerConfigBean implements SessionServerConfig { private int schedulerCleanInvalidClientBackOffBound = 5; - private int cancelDataTaskRetryTimes = 5; + private int cancelDataTaskRetryTimes = 2; private long cancelDataTaskRetryFirstDelay = 500; private long cancelDataTaskRetryIncrementDelay = 500; - private int publishDataTaskRetryTimes = 5; + private int publishDataTaskRetryTimes = 2; - private long publishDataTaskRetryFirstDelay = 500; + private long publishDataTaskRetryFirstDelay = 3000; - private long publishDataTaskRetryIncrementDelay = 500; + private long publishDataTaskRetryIncrementDelay = 5000; - private int unPublishDataTaskRetryTimes = 5; + private int unPublishDataTaskRetryTimes = 2; - private long unPublishDataTaskRetryFirstDelay = 500; + private long unPublishDataTaskRetryFirstDelay = 3000; - private long unPublishDataTaskRetryIncrementDelay = 500; + private long unPublishDataTaskRetryIncrementDelay = 5000; - private int datumSnapshotTaskRetryTimes = 5; + private int datumSnapshotTaskRetryTimes = 1; - private long datumSnapshotTaskRetryFirstDelay = 1000; + private long datumSnapshotTaskRetryFirstDelay = 5000; - private long datumSnapshotTaskRetryIncrementDelay = 1000; + private long datumSnapshotTaskRetryIncrementDelay = 5000; - private int renewDatumTaskRetryTimes = 3; + private int renewDatumTaskRetryTimes = 1; private int dataChangeFetchTaskRetryTimes = 3; From 5b119b2dc0cd2cf710f0c01266c203a1e9e1f59a Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 15:47:50 +0800 Subject: [PATCH 087/161] put resume() in finally code block, avoid lock leak --- .../server/session/acceptor/WriteDataProcessor.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 26ed57586..04585fed3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -199,8 +199,11 @@ private void doHandle(WriteDataRequest request) { return; } halt(); - doSnapshotAsync(request); - resume(); + try { + doSnapshotAsync(request); + } finally { + resume(); + } } break; default: From c30a58db3fe724bdb5636b2b3ca76937356cfb26 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 16:00:11 +0800 Subject: [PATCH 088/161] modify renewDatumWheelTaskDelay and datumTimeToLiveSec --- .../sofa/registry/server/data/bootstrap/DataServerConfig.java | 2 +- server/server/data/src/main/resources/application.properties | 1 + .../server/session/bootstrap/SessionServerConfigBean.java | 2 +- .../server/session/src/main/resources/application.properties | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 7b9430e61..475c40001 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -101,7 +101,7 @@ public class DataServerConfig { private int publishExecutorQueueSize = 10000; - private int datumTimeToLiveSec = 300; + private int datumTimeToLiveSec = 900; private int datumLeaseManagerExecutorThreadSize = 1; diff --git a/server/server/data/src/main/resources/application.properties b/server/server/data/src/main/resources/application.properties index 8cad72611..a65d7295f 100644 --- a/server/server/data/src/main/resources/application.properties +++ b/server/server/data/src/main/resources/application.properties @@ -16,4 +16,5 @@ data.server.rpcTimeout=3000 data.server.metaServerPort=9611 data.server.storeNodes=3 data.server.numberOfReplicas=1000 +data.server.datumTimeToLiveSec=900 diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 1c51912d0..edc612a61 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -175,7 +175,7 @@ public class SessionServerConfigBean implements SessionServerConfig { private int renewDatumWheelTicksDuration = 500; - private long renewDatumWheelTaskDelay = 30; + private long renewDatumWheelTaskDelay = 180; private int pushDataTaskRetryFirstDelay = 500; diff --git a/server/server/session/src/main/resources/application.properties b/server/server/session/src/main/resources/application.properties index 10fbd7925..f80ffbe27 100644 --- a/server/server/session/src/main/resources/application.properties +++ b/server/server/session/src/main/resources/application.properties @@ -27,4 +27,5 @@ session.server.schedulerFetchDataFirstDelay=3 session.server.schedulerFetchDataExpBackOffBound=10 #session.server.invalidForeverZones=; #session.server.invalidIgnoreDataidRegex= -#session.server.pushEmptyDataDataIdPrefixes= \ No newline at end of file +#session.server.pushEmptyDataDataIdPrefixes= +session.server.renewDatumWheelTaskDelay=180 \ No newline at end of file From 6cd814ff2ea0769827fdd06bc066220ecf134396 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 26 Jul 2019 16:29:02 +0800 Subject: [PATCH 089/161] When session receives a connection and generates renew tasks, it randomly delays different times to avoid everyone launching renew at the same time. --- .../bootstrap/SessionServerConfig.java | 4 +- .../bootstrap/SessionServerConfigBean.java | 38 ++++++++++++++----- .../handler/ClientNodeConnectionHandler.java | 8 +++- .../src/main/resources/application.properties | 3 +- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index d0c1ad57b..885db5f3f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -161,7 +161,9 @@ public interface SessionServerConfig { int getRenewDatumWheelTicksDuration(); - long getRenewDatumWheelTaskDelay(); + int getRenewDatumWheelTaskDelaySec(); + + int getRenewDatumWheelTaskRandomFirstDelaySec(); String getBlacklistPubDataIdRegex(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index edc612a61..2296c6d10 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -175,7 +175,9 @@ public class SessionServerConfigBean implements SessionServerConfig { private int renewDatumWheelTicksDuration = 500; - private long renewDatumWheelTaskDelay = 180; + private int renewDatumWheelTaskDelaySec = 180; + + private int renewDatumWheelTaskRandomFirstDelaySec = 60; private int pushDataTaskRetryFirstDelay = 500; @@ -1689,21 +1691,39 @@ public int getRenewDatumWheelTicksDuration() { } /** - * Getter method for property renewDatumWheelTaskDelay. + * Getter method for property renewDatumWheelTaskDelaySec. + * + * @return property value of renewDatumWheelTaskDelaySec + */ + public int getRenewDatumWheelTaskDelaySec() { + return renewDatumWheelTaskDelaySec; + } + + /** + * Setter method for property renewDatumWheelTaskDelaySec . + * + * @param renewDatumWheelTaskDelaySec value to be assigned to property renewDatumWheelTaskDelaySec + */ + public void setRenewDatumWheelTaskDelaySec(int renewDatumWheelTaskDelaySec) { + this.renewDatumWheelTaskDelaySec = renewDatumWheelTaskDelaySec; + } + + /** + * Getter method for property renewDatumWheelTaskRandomFirstDelaySec. * - * @return property value of renewDatumWheelTaskDelay + * @return property value of renewDatumWheelTaskRandomFirstDelaySec */ - public long getRenewDatumWheelTaskDelay() { - return renewDatumWheelTaskDelay; + public int getRenewDatumWheelTaskRandomFirstDelaySec() { + return renewDatumWheelTaskRandomFirstDelaySec; } /** - * Setter method for property renewDatumWheelTaskDelay. + * Setter method for property renewDatumWheelTaskRandomFirstDelaySec . * - * @param renewDatumWheelTaskDelay value to be assigned to property renewDatumWheelTaskDelay + * @param renewDatumWheelTaskRandomFirstDelaySec value to be assigned to property renewDatumWheelTaskRandomFirstDelaySec */ - public void setRenewDatumWheelTaskDelay(long renewDatumWheelTaskDelay) { - this.renewDatumWheelTaskDelay = renewDatumWheelTaskDelay; + public void setRenewDatumWheelTaskRandomFirstDelaySec(int renewDatumWheelTaskRandomFirstDelaySec) { + this.renewDatumWheelTaskRandomFirstDelaySec = renewDatumWheelTaskRandomFirstDelaySec; } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java index 4e1b3680a..88b3fe42e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +import org.apache.commons.lang.math.RandomUtils; import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.common.model.constants.ValueConstants; @@ -132,7 +133,7 @@ private void fireRenewDatum(Channel channel) { RENEW_LOGGER.info("Renew task is started: {}", connectId); executorManager.getAsyncHashedWheelTimerTask() .newTimeout(connectId, timerOut -> sessionRegistry.renewDatum(connectId), - sessionServerConfig.getRenewDatumWheelTaskDelay(), TimeUnit.SECONDS, () -> { + randomDelay() + sessionServerConfig.getRenewDatumWheelTaskDelaySec(), TimeUnit.SECONDS, () -> { Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); boolean shouldContinue = channelClient != null && channel.isConnected(); @@ -143,4 +144,9 @@ private void fireRenewDatum(Channel channel) { }); }); } + + private long randomDelay() { + return RandomUtils.nextInt(sessionServerConfig.getRenewDatumWheelTaskRandomFirstDelaySec()); + } + } \ No newline at end of file diff --git a/server/server/session/src/main/resources/application.properties b/server/server/session/src/main/resources/application.properties index f80ffbe27..f5062be72 100644 --- a/server/server/session/src/main/resources/application.properties +++ b/server/server/session/src/main/resources/application.properties @@ -28,4 +28,5 @@ session.server.schedulerFetchDataExpBackOffBound=10 #session.server.invalidForeverZones=; #session.server.invalidIgnoreDataidRegex= #session.server.pushEmptyDataDataIdPrefixes= -session.server.renewDatumWheelTaskDelay=180 \ No newline at end of file +session.server.renewDatumWheelTaskDelaySec=180 +session.server.renewDatumWheelTaskRandomFirstDelaySec=60 \ No newline at end of file From 31cd224b4f820b49e215d8622976bd3758417e41 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sat, 27 Jul 2019 12:37:39 +0800 Subject: [PATCH 090/161] data: add executor for handler session: bugfix snapshot session: refactor wheelTimer of renew to add executor --- .../scheduler/AsyncHashedWheelTimerTask.java | 114 ---------------- .../registry/timer/AsyncHashedWheelTimer.java | 4 +- .../timer/RecycleAsyncHashedWheelTimer.java | 125 ++++++++++++++++++ .../DataServerBeanConfiguration.java | 49 ++++++- .../data/bootstrap/DataServerConfig.java | 60 +++++++++ .../handler/DatumSnapshotHandler.java | 10 ++ .../sessionserver/handler/GetDataHandler.java | 26 +--- .../handler/GetDataVersionsHandler.java | 12 +- .../handler/PublishDataHandler.java | 19 +-- .../handler/RenewDatumHandler.java | 12 +- .../handler/UnPublishDataHandler.java | 10 ++ .../session/acceptor/WriteDataProcessor.java | 23 ++-- .../bootstrap/SessionServerConfig.java | 4 + .../bootstrap/SessionServerConfigBean.java | 42 +++++- .../handler/ClientNodeConnectionHandler.java | 78 +++++++---- .../session/scheduler/ExecutorManager.java | 14 -- .../scheduler/task/RenewDatumTask.java | 5 +- 17 files changed, 396 insertions(+), 211 deletions(-) delete mode 100644 server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java create mode 100644 server/common/util/src/main/java/com/alipay/sofa/registry/timer/RecycleAsyncHashedWheelTimer.java diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java deleted file mode 100644 index 3f2680893..000000000 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/scheduler/AsyncHashedWheelTimerTask.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.task.scheduler; - -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import io.netty.util.HashedWheelTimer; -import io.netty.util.Timeout; -import io.netty.util.TimerTask; - -import java.util.concurrent.TimeUnit; -import java.util.function.BooleanSupplier; - -/** - * - * @author shangyu.wh - * @version 123: AsyncHashedWheelTimerTask.java, v 0.1 2019-06-03 16:11 shangyu.wh Exp $ - */ -public class AsyncHashedWheelTimerTask extends HashedWheelTimer { - - private static final Logger LOGGER = LoggerFactory.getLogger(AsyncHashedWheelTimerTask.class); - - private final String name; - - private final long tickDuration; - - private final int ticksPerWheel; - - public AsyncHashedWheelTimerTask(String name, long tickDuration, TimeUnit tickUnit, - int ticksPerWheel) { - super((new ThreadFactoryBuilder()).setNameFormat(name).build(), tickDuration, tickUnit, - ticksPerWheel); - this.name = name; - this.tickDuration = tickDuration; - this.ticksPerWheel = ticksPerWheel; - } - - public Timeout newTimeout(String taskName, TimerTask task, long delay, TimeUnit unit, - BooleanSupplier checkCondition) { - - return super.newTimeout(new OngoingTimerTask(taskName, task, delay, unit, checkCondition), - delay, unit); - } - - public class OngoingTimerTask implements TimerTask { - - private final String taskName; - - private final TimerTask task; - - private final long delay; - - private final TimeUnit delayUnit; - - private final BooleanSupplier checkCondition; - - public OngoingTimerTask(String taskName, TimerTask task, long delay, TimeUnit unit, - BooleanSupplier checkCondition) { - this.taskName = taskName; - this.task = task; - this.delay = delay; - this.delayUnit = unit; - this.checkCondition = checkCondition; - } - - @Override - public void run(Timeout timeout) throws Exception { - - try { - task.run(timeout); - } catch (Exception e) { - LOGGER.error(taskName + "executionFailed: " + e.getMessage(), e); - } finally { - if (checkCondition.getAsBoolean()) { - AsyncHashedWheelTimerTask.this.newTimeout(taskName, task, delay, delayUnit, - checkCondition); - } - } - } - - /** - * Getter method for property delay. - * - * @return property value of delay - */ - public long getDelay() { - return delay; - } - - /** - * Getter method for property delayUnit. - * - * @return property value of delayUnit - */ - public TimeUnit getDelayUnit() { - return delayUnit; - } - } -} \ No newline at end of file diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java index b3f5949dd..7119a88a8 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/AsyncHashedWheelTimer.java @@ -35,10 +35,10 @@ */ public class AsyncHashedWheelTimer extends HashedWheelTimer { /** */ - private final Executor executor; + protected final Executor executor; /** */ - private final TaskFailedCallback taskFailedCallback; + protected final TaskFailedCallback taskFailedCallback; /** * @param threadFactory diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/timer/RecycleAsyncHashedWheelTimer.java b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/RecycleAsyncHashedWheelTimer.java new file mode 100644 index 000000000..fb3a0bd63 --- /dev/null +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/timer/RecycleAsyncHashedWheelTimer.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.timer; + +import java.util.concurrent.Executor; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.function.BooleanSupplier; + +import io.netty.util.Timeout; +import io.netty.util.TimerTask; + +/** + * + * @author kezhu.wukz + * @version $Id: RecycleAsyncHashedWheelTimer.java, v 0.1 2019-07-27 10:54 kezhu.wukz Exp $ + */ +public class RecycleAsyncHashedWheelTimer extends AsyncHashedWheelTimer { + + public RecycleAsyncHashedWheelTimer(ThreadFactory threadFactory, long tickDuration, + TimeUnit unit, int ticksPerWheel, int threadSize, + int queueSize, ThreadFactory asyncThreadFactory, + TaskFailedCallback taskFailedCallback) { + super(threadFactory, tickDuration, unit, ticksPerWheel, threadSize, queueSize, + asyncThreadFactory, taskFailedCallback); + } + + public RecycleAsyncHashedWheelTimer(ThreadFactory threadFactory, long tickDuration, + TimeUnit unit, int ticksPerWheel, Executor asyncExecutor, + TaskFailedCallback taskFailedCallback) { + super(threadFactory, tickDuration, unit, ticksPerWheel, asyncExecutor, taskFailedCallback); + } + + public Timeout newTimeout(TimerTask task, long firstDelay, long recycleDelay, TimeUnit unit, + BooleanSupplier checkCondition) { + + return super.newTimeout( + new RecycleAsyncTimerTask(task, recycleDelay, unit, checkCondition), firstDelay, unit); + } + + public Timeout newTimeout(TimerTask task, long recycleDelay, TimeUnit unit, + BooleanSupplier checkCondition) { + + return super + .newTimeout(new RecycleAsyncTimerTask(task, recycleDelay, unit, checkCondition), + recycleDelay, unit); + } + + /** + * + */ + class RecycleAsyncTimerTask implements TimerTask, Runnable { + /** */ + private final TimerTask timerTask; + + private final long recycleDelay; + + private final TimeUnit delayUnit; + + private final BooleanSupplier checkCondition; + + /** */ + private Timeout timeout; + + /** + * @param timerTask + */ + public RecycleAsyncTimerTask(TimerTask timerTask, long recycleDelay, TimeUnit unit, + BooleanSupplier checkCondition) { + super(); + this.timerTask = timerTask; + this.recycleDelay = recycleDelay; + this.delayUnit = unit; + this.checkCondition = checkCondition; + } + + /** + */ + @Override + public void run(Timeout timeout) { + this.timeout = timeout; + try { + RecycleAsyncHashedWheelTimer.super.executor.execute(this); + } catch (RejectedExecutionException e) { + taskFailedCallback.executionRejected(e); + } catch (Throwable e) { + taskFailedCallback.executionFailed(e); + } + } + + /** + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + this.timerTask.run(this.timeout); + } catch (Throwable e) { + taskFailedCallback.executionFailed(e); + } finally { + if (checkCondition.getAsBoolean()) { + RecycleAsyncHashedWheelTimer.this.newTimeout(timerTask, recycleDelay, + delayUnit, checkCondition); + } + } + } + + } + +} \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index ef9bd3223..841bad658 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -19,6 +19,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; @@ -94,6 +97,8 @@ import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.resource.DataDigestResource; import com.alipay.sofa.registry.server.data.resource.HealthResource; +import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; +import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.PropertySplitter; /** @@ -206,7 +211,7 @@ public Collection serverHandlers(DataServerConfig dataSer list.add(getDataHandler()); list.add(clientOffHandler()); list.add(getDataVersionsHandler()); - list.add(publishDataProcessor(dataServerConfig)); + list.add(publishDataProcessor()); list.add(sessionServerRegisterHandler()); list.add(unPublishDataHandler()); list.add(dataServerConnectionHandler()); @@ -219,7 +224,7 @@ public Collection serverHandlers(DataServerConfig dataSer public Collection serverSyncHandlers(DataServerConfig dataServerConfig) { Collection list = new ArrayList<>(); list.add(getDataHandler()); - list.add(publishDataProcessor(dataServerConfig)); + list.add(publishDataProcessor()); list.add(unPublishDataHandler()); list.add(notifyFetchDatumHandler()); list.add(notifyOnlineHandler()); @@ -280,8 +285,8 @@ public AbstractServerHandler renewDatumHandler() { } @Bean - public AbstractServerHandler publishDataProcessor(DataServerConfig dataServerConfig) { - return new PublishDataHandler(dataServerConfig); + public AbstractServerHandler publishDataProcessor() { + return new PublishDataHandler(); } @Bean @@ -523,4 +528,40 @@ public AfterWorkingProcessHandler afterWorkingProcessHandler() { } } + + @Configuration + public static class ExecutorConfiguration { + + @Autowired + DataServerConfig dataServerConfig; + + @Bean(name = "publishProcessorExecutor") + public ThreadPoolExecutor publishProcessorExecutor() { + return new ThreadPoolExecutorDataServer("PublishProcessorExecutor", + dataServerConfig.getPublishExecutorMinPoolSize(), + dataServerConfig.getPublishExecutorMaxPoolSize(), 300, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(dataServerConfig.getPublishExecutorQueueSize()), + new NamedThreadFactory("DataServer-PublishProcessor-executor", true)); + } + + @Bean(name = "renewDatumProcessorExecutor") + public ThreadPoolExecutor renewDatumProcessorExecutor() { + return new ThreadPoolExecutorDataServer("RenewDatumProcessorExecutor", + dataServerConfig.getRenewDatumExecutorMinPoolSize(), + dataServerConfig.getRenewDatumExecutorMaxPoolSize(), 300, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(dataServerConfig.getRenewDatumExecutorQueueSize()), + new NamedThreadFactory("DataServer-RenewDatumProcessor-executor", true)); + } + + @Bean(name = "getDataProcessorExecutor") + public ThreadPoolExecutor getDataProcessorExecutor() { + return new ThreadPoolExecutorDataServer("GetDataProcessorExecutor", + dataServerConfig.getGetDataExecutorMinPoolSize(), + dataServerConfig.getGetDataExecutorMaxPoolSize(), + dataServerConfig.getGetDataExecutorKeepAliveTime(), TimeUnit.SECONDS, + new ArrayBlockingQueue<>(dataServerConfig.getGetDataExecutorQueueSize()), + new NamedThreadFactory("DataServer-GetDataProcessor-executor", true)); + } + + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 475c40001..f6e3c8137 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -101,6 +101,12 @@ public class DataServerConfig { private int publishExecutorQueueSize = 10000; + private int renewDatumExecutorMinPoolSize = 50; + + private int renewDatumExecutorMaxPoolSize = 400; + + private int renewDatumExecutorQueueSize = 100000; + private int datumTimeToLiveSec = 900; private int datumLeaseManagerExecutorThreadSize = 1; @@ -123,6 +129,60 @@ public String getLocalDataCenter() { return commonConfig.getLocalDataCenter(); } + /** + * Getter method for property renewDatumExecutorMinPoolSize. + * + * @return property value of renewDatumExecutorMinPoolSize + */ + public int getRenewDatumExecutorMinPoolSize() { + return renewDatumExecutorMinPoolSize; + } + + /** + * Setter method for property renewDatumExecutorMinPoolSize . + * + * @param renewDatumExecutorMinPoolSize value to be assigned to property renewDatumExecutorMinPoolSize + */ + public void setRenewDatumExecutorMinPoolSize(int renewDatumExecutorMinPoolSize) { + this.renewDatumExecutorMinPoolSize = renewDatumExecutorMinPoolSize; + } + + /** + * Getter method for property renewDatumExecutorMaxPoolSize. + * + * @return property value of renewDatumExecutorMaxPoolSize + */ + public int getRenewDatumExecutorMaxPoolSize() { + return renewDatumExecutorMaxPoolSize; + } + + /** + * Setter method for property renewDatumExecutorMaxPoolSize . + * + * @param renewDatumExecutorMaxPoolSize value to be assigned to property renewDatumExecutorMaxPoolSize + */ + public void setRenewDatumExecutorMaxPoolSize(int renewDatumExecutorMaxPoolSize) { + this.renewDatumExecutorMaxPoolSize = renewDatumExecutorMaxPoolSize; + } + + /** + * Getter method for property renewDatumExecutorQueueSize. + * + * @return property value of renewDatumExecutorQueueSize + */ + public int getRenewDatumExecutorQueueSize() { + return renewDatumExecutorQueueSize; + } + + /** + * Setter method for property renewDatumExecutorQueueSize . + * + * @param renewDatumExecutorQueueSize value to be assigned to property renewDatumExecutorQueueSize + */ + public void setRenewDatumExecutorQueueSize(int renewDatumExecutorQueueSize) { + this.renewDatumExecutorQueueSize = renewDatumExecutorQueueSize; + } + /** * Getter method for property port. * diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 719d0da33..da98a6171 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -21,6 +21,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -73,6 +75,14 @@ public class DatumSnapshotHandler extends AbstractServerHandler { @Autowired private ForwardService forwardService; - @Autowired - private DataServerConfig dataServerConfig; - @Autowired private DatumCache datumCache; + @Autowired private ThreadPoolExecutor getDataProcessorExecutor; + @Override + public Executor getExecutor() { + return getDataProcessorExecutor; + } + @Override public void checkParam(GetDataRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getDataInfoId(), "GetDataRequest.dataInfoId"); @@ -106,16 +104,4 @@ protected Node.NodeType getConnectNodeType() { return Node.NodeType.DATA; } - @Override - public Executor getExecutor() { - if (getDataProcessorExecutor == null) { - getDataProcessorExecutor = new ThreadPoolExecutorDataServer("GetDataProcessorExecutor", - dataServerConfig.getGetDataExecutorMinPoolSize(), - dataServerConfig.getGetDataExecutorMaxPoolSize(), - dataServerConfig.getGetDataExecutorKeepAliveTime(), TimeUnit.SECONDS, - new ArrayBlockingQueue<>(dataServerConfig.getGetDataExecutorQueueSize()), - new NamedThreadFactory("DataServer-GetDataProcessor-executor", true)); - } - return getDataProcessorExecutor; - } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java index d894822aa..268425b14 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +44,15 @@ public class GetDataVersionsHandler extends AbstractServerHandler { @Autowired - private DatumCache datumCache; + private DatumCache datumCache; + + @Autowired + private ThreadPoolExecutor getDataProcessorExecutor; + + @Override + public Executor getExecutor() { + return getDataProcessorExecutor; + } @Override protected void logRequest(Channel channel, GetDataVersionRequest request) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java index 381695a71..ffbbaab46 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java @@ -16,10 +16,8 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; -import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; @@ -37,8 +35,6 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; -import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; -import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; /** @@ -68,17 +64,8 @@ public class PublishDataHandler extends AbstractServerHandler(dataServerConfig.getPublishExecutorQueueSize()), - new NamedThreadFactory("DataServer-PublishProcessorExecutor-executor", true)); - } + @Autowired + private ThreadPoolExecutor publishProcessorExecutor; @Override public void checkParam(PublishDataRequest request) throws RuntimeException { @@ -142,6 +129,6 @@ protected Node.NodeType getConnectNodeType() { @Override public Executor getExecutor() { - return publishExecutor; + return publishProcessorExecutor; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index 407423596..a83cd856c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -17,6 +17,8 @@ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +43,7 @@ * handling snapshot request * * @author kezhu.wukz - * @version $Id: ClientOffProcessor.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ + * @version $Id: RenewDatumHandler.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ */ public class RenewDatumHandler extends AbstractServerHandler { @@ -61,6 +63,14 @@ public class RenewDatumHandler extends AbstractServerHandler @Autowired private DatumCache datumCache; + @Autowired + private ThreadPoolExecutor renewDatumProcessorExecutor; + + @Override + public Executor getExecutor() { + return renewDatumProcessorExecutor; + } + @Override public void checkParam(RenewDatumRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getConnectId(), "RenewDatumRequest.connectId"); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 12931e2b5..d283fa13e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -17,6 +17,8 @@ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import org.springframework.beans.factory.annotation.Autowired; @@ -63,6 +65,14 @@ public class UnPublishDataHandler extends AbstractServerHandlerrenewDatumWheelThreadSize. + * + * @return property value of renewDatumWheelThreadSize + */ + public int getRenewDatumWheelThreadSize() { + return renewDatumWheelThreadSize; + } + + /** + * Setter method for property renewDatumWheelThreadSize . + * + * @param renewDatumWheelThreadSize value to be assigned to property renewDatumWheelThreadSize + */ + public void setRenewDatumWheelThreadSize(int renewDatumWheelThreadSize) { + this.renewDatumWheelThreadSize = renewDatumWheelThreadSize; + } + + /** + * Getter method for property renewDatumWheelQueueSize. + * + * @return property value of renewDatumWheelQueueSize + */ + public int getRenewDatumWheelQueueSize() { + return renewDatumWheelQueueSize; + } + + /** + * Setter method for property renewDatumWheelQueueSize . + * + * @param renewDatumWheelQueueSize value to be assigned to property renewDatumWheelQueueSize + */ + public void setRenewDatumWheelQueueSize(int renewDatumWheelQueueSize) { + this.renewDatumWheelQueueSize = renewDatumWheelQueueSize; + } + /** * Getter method for property userDataPushRetryExecutorQueueSize. * diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java index 88b3fe42e..8efc82e9e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/ClientNodeConnectionHandler.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +import javax.annotation.PostConstruct; + import org.apache.commons.lang.math.RandomUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +41,9 @@ import com.alipay.sofa.registry.server.session.store.DataStore; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; +import com.alipay.sofa.registry.timer.RecycleAsyncHashedWheelTimer; +import com.google.common.util.concurrent.ThreadFactoryBuilder; /** * @@ -47,31 +52,56 @@ */ public class ClientNodeConnectionHandler extends AbstractServerHandler { - private static final Logger LOGGER = LoggerFactory.getLogger("SESSION-CONNECT"); - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[ClientNodeConnectionHandler]"); + private static final Logger LOGGER = LoggerFactory.getLogger("SESSION-CONNECT"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[ClientNodeConnectionHandler]"); + + private RecycleAsyncHashedWheelTimer recycleAsyncHashedWheelTimer; @Autowired - private Registry sessionRegistry; + private Registry sessionRegistry; @Autowired - private DataStore sessionDataStore; + private DataStore sessionDataStore; @Autowired - private Interests sessionInterests; + private Interests sessionInterests; @Autowired - private Watchers sessionWatchers; + private Watchers sessionWatchers; @Autowired - private ExecutorManager executorManager; + private ExecutorManager executorManager; @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Exchange boltExchange; + private Exchange boltExchange; + + @PostConstruct + public void init() { + ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); + threadFactoryBuilder.setDaemon(true); + recycleAsyncHashedWheelTimer = new RecycleAsyncHashedWheelTimer(threadFactoryBuilder + .setNameFormat("Registry-RenewDatumTask-WheelTimer").build(), + sessionServerConfig.getRenewDatumWheelTicksDuration(), TimeUnit.MILLISECONDS, + sessionServerConfig.getRenewDatumWheelTicksSize(), + sessionServerConfig.getRenewDatumWheelThreadSize(), + sessionServerConfig.getRenewDatumWheelQueueSize(), threadFactoryBuilder.setNameFormat( + "Registry-RenewDatumTask-WheelExecutor-%d").build(), new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + RENEW_LOGGER.error("executionRejected: " + e.getMessage(), e); + } + + @Override + public void executionFailed(Throwable e) { + RENEW_LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); + } @Override public HandlerType getType() { @@ -131,22 +161,24 @@ private void fireRenewDatum(Channel channel) { executorManager.getConnectClientExecutor().execute(() -> { String connectId = NetUtil.toAddressString(channel.getRemoteAddress()); RENEW_LOGGER.info("Renew task is started: {}", connectId); - executorManager.getAsyncHashedWheelTimerTask() - .newTimeout(connectId, timerOut -> sessionRegistry.renewDatum(connectId), - randomDelay() + sessionServerConfig.getRenewDatumWheelTaskDelaySec(), TimeUnit.SECONDS, () -> { - Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); - Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); - boolean shouldContinue = channelClient != null && channel.isConnected(); - if (!shouldContinue) { - RENEW_LOGGER.info("Renew task is stop: {}", connectId); - } - return shouldContinue; - }); + recycleAsyncHashedWheelTimer.newTimeout(timerOut -> sessionRegistry.renewDatum(connectId), randomDelay(), + sessionServerConfig.getRenewDatumWheelTaskDelaySec(), TimeUnit.SECONDS, () -> { + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + Channel channelClient = sessionServer.getChannel(URL.valueOf(connectId)); + boolean shouldContinue = channelClient != null && channel.isConnected(); + if (!shouldContinue) { + RENEW_LOGGER.info("Renew task is stop: {}", connectId); + } + return shouldContinue; + }); }); } private long randomDelay() { - return RandomUtils.nextInt(sessionServerConfig.getRenewDatumWheelTaskRandomFirstDelaySec()); + return sessionServerConfig.getRenewDatumWheelTaskRandomFirstDelaySec() + / 2 + + RandomUtils.nextInt(sessionServerConfig + .getRenewDatumWheelTaskRandomFirstDelaySec() / 2); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index 52756a1cd..a5da49b80 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -34,9 +34,7 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.task.scheduler.AsyncHashedWheelTimerTask; import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; -import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.util.NamedThreadFactory; /** @@ -62,8 +60,6 @@ public class ExecutorManager { private final ThreadPoolExecutor pushTaskExecutor; private final ThreadPoolExecutor connectClientExecutor; - private AsyncHashedWheelTimer asyncHashedWheelTimer; - private SessionServerConfig sessionServerConfig; @Autowired @@ -84,8 +80,6 @@ public class ExecutorManager { @Autowired private NodeExchanger dataNodeExchanger; - private AsyncHashedWheelTimerTask asyncHashedWheelTimerTask; - private Map reportExecutors = new HashMap<>(); private static final String PUSH_TASK_EXECUTOR = "PushTaskExecutor"; @@ -173,10 +167,6 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), new NamedThreadFactory("DisconnectClientExecutor", true))); - - asyncHashedWheelTimerTask = new AsyncHashedWheelTimerTask("Registry-RenewDatumTask-WheelTimer", - sessionServerConfig.getRenewDatumWheelTicksDuration(),TimeUnit.MILLISECONDS, - sessionServerConfig.getRenewDatumWheelTicksSize()); } public void startScheduler() { @@ -301,8 +291,4 @@ public ThreadPoolExecutor getConnectClientExecutor() { return connectClientExecutor; } - public AsyncHashedWheelTimerTask getAsyncHashedWheelTimerTask() { - return asyncHashedWheelTimerTask; - } - } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index 9896aaeb8..e252027d6 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -66,8 +66,9 @@ public void execute() { } } catch (Exception e) { - RENEW_LOGGER.error("Renew datum request to dataNode error! renewDatumRequest={}", - renewDatumRequest, e); + RENEW_LOGGER.error(String.format( + "Renew datum request to dataNode error! renewDatumRequest=%s", renewDatumRequest), + e); } } From 5ff3c3f7dad45d44731aad3f9938067385107b9b Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 29 Jul 2019 16:06:22 +0800 Subject: [PATCH 091/161] add get data log --- .../node/service/DataNodeServiceImpl.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 348c25020..70b68ad59 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -16,17 +16,6 @@ */ package com.alipay.sofa.registry.server.session.node.service; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -53,6 +42,15 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * @@ -338,16 +336,15 @@ public URL getRequestUrl() { if (genericResponse.isSuccess()) { map = (Map) genericResponse.getData(); if (map == null || map.isEmpty()) { - LOGGER.warn("GetDataRequest get response contains no datum!"); + LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}",dataCenterId); } else { map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); } } else { - throw new RuntimeException( - "GetDataRequest has not get fail response! msg:" + genericResponse.getMessage()); + throw new RuntimeException(String.format("GetDataRequest has got fail response!dataInfoId:%s msg:%s",dataInfoId,genericResponse.getMessage())); } } catch (RequestException e) { - throw new RuntimeException("Get data request to data node error! " + e.getMessage(), e); + throw new RuntimeException(String.format("Get data request to data node error!dataInfoId:%s msg:%s ",dataInfoId ,e.getMessage()), e); } return map; From 7e8cf0d6bda22541c31dd5065a072c15b98fb1b8 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 30 Jul 2019 15:25:06 +0800 Subject: [PATCH 092/161] snapshot and lastUpdateTimestamp: Specific to dataServerIP --- .../common/model/RenewDatumRequest.java | 16 +- .../handler/RenewDatumHandler.java | 4 +- .../handler/UnPublishDataHandler.java | 12 +- .../session/acceptor/WriteDataProcessor.java | 63 +++--- .../session/acceptor/WriteDataRequest.java | 2 + .../node/service/DataNodeServiceImpl.java | 4 +- .../server/session/registry/Registry.java | 6 +- .../session/registry/SessionRegistry.java | 184 ++++++++++-------- .../scheduler/task/RenewDatumTask.java | 3 +- 9 files changed, 167 insertions(+), 127 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java index 9aa77601e..603c40fb3 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/RenewDatumRequest.java @@ -30,13 +30,13 @@ public class RenewDatumRequest implements Serializable { private final String connectId; - private final String dataServerIp; + private final String dataServerIP; private final String digestSum; - public RenewDatumRequest(String connectId, String dataServerIp, String digestSum) { + public RenewDatumRequest(String connectId, String dataServerIP, String digestSum) { this.connectId = connectId; - this.dataServerIp = dataServerIp; + this.dataServerIP = dataServerIP; this.digestSum = digestSum; } @@ -50,12 +50,12 @@ public String getConnectId() { } /** - * Getter method for property dataServerIp. + * Getter method for property dataServerIP. * - * @return property value of dataServerIp + * @return property value of dataServerIP */ - public String getDataServerIp() { - return dataServerIp; + public String getDataServerIP() { + return dataServerIP; } /** @@ -74,7 +74,7 @@ public String getDigestSum() { public String toString() { final StringBuilder sb = new StringBuilder("RenewDatumRequest{"); sb.append("connectId='").append(connectId).append('\''); - sb.append(", dataServerIp='").append(dataServerIp).append('\''); + sb.append(", dataServerIP='").append(dataServerIP).append('\''); sb.append(", digestSum='").append(digestSum).append('\''); sb.append('}'); return sb.toString(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index a83cd856c..adafca516 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -91,9 +91,9 @@ public Object doHandle(Channel channel, RenewDatumRequest request) { return response; } - boolean isDiff = renewDatum(request); + boolean theSame = renewDatum(request); - return new GenericResponse().fillSucceed(isDiff); + return new GenericResponse().fillSucceed(theSame); } @Override diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index d283fa13e..42e335664 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -109,11 +109,13 @@ private String getConnectId(UnPublishDataRequest request) { String dataInfoId = request.getDataInfoId(); String dataCenter = dataServerConfig.getLocalDataCenter(); Datum datum = datumCache.get(dataCenter, dataInfoId); - Map pubMap = datum.getPubMap(); - if (pubMap != null) { - Publisher publisher = pubMap.get(request.getRegisterId()); - if (publisher != null) { - return publisher.getSourceAddress().getAddressString(); + if (datum != null) { + Map pubMap = datum.getPubMap(); + if (pubMap != null) { + Publisher publisher = pubMap.get(request.getRegisterId()); + if (publisher != null) { + return publisher.getSourceAddress().getAddressString(); + } } } return null; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index a9f8c9b56..6210c298b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -17,6 +17,8 @@ package com.alipay.sofa.registry.server.session.acceptor; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -42,18 +44,18 @@ */ public class WriteDataProcessor { - private static final Logger LOGGER = LoggerFactory - .getLogger(WriteDataProcessor.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(WriteDataProcessor.class); - private static final Logger RENEW_LOGGER = LoggerFactory - .getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[WriteDataProcessor]"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[WriteDataProcessor]"); - private static final Logger taskLogger = LoggerFactory - .getLogger( - WriteDataProcessor.class, - "[Task]"); + private static final Logger taskLogger = LoggerFactory + .getLogger( + WriteDataProcessor.class, + "[Task]"); private final TaskListenerManager taskListenerManager; @@ -63,15 +65,14 @@ public class WriteDataProcessor { private final String connectId; - private long beginTimestamp; + private Map lastUpdateTimestampMap = new ConcurrentHashMap<>(); - private AtomicLong lastUpdateTimestamp = new AtomicLong(0); + private AtomicBoolean writeDataLock = new AtomicBoolean( + false); - private AtomicBoolean writeDataLock = new AtomicBoolean(false); + private ConcurrentLinkedQueue acceptorQueue = new ConcurrentLinkedQueue(); - private ConcurrentLinkedQueue acceptorQueue = new ConcurrentLinkedQueue(); - - private AtomicInteger acceptorQueueSize = new AtomicInteger(0); + private AtomicInteger acceptorQueueSize = new AtomicInteger(0); public WriteDataProcessor(String connectId, TaskListenerManager taskListenerManager, SessionServerConfig sessionServerConfig, RenewService renewService) { @@ -79,9 +80,6 @@ public WriteDataProcessor(String connectId, TaskListenerManager taskListenerMana this.taskListenerManager = taskListenerManager; this.sessionServerConfig = sessionServerConfig; this.renewService = renewService; - - this.beginTimestamp = System.currentTimeMillis(); - this.lastUpdateTimestamp.set(beginTimestamp); } private boolean halt() { @@ -106,9 +104,9 @@ public void process(WriteDataRequest request) { request.getRequestType(), request.getRequestBody()); } - // record the last update time by pub/unpub/clientoff + // record the last update time by pub/unpub if (isWriteRequest(request)) { - refreshUpdateTime(); + refreshUpdateTime(request.getDataServerIP()); } if (request.getRequestType() == WriteDataRequestType.DATUM_SNAPSHOT) { @@ -147,8 +145,7 @@ private void addQueue(WriteDataRequest request) { */ private boolean isWriteRequest(WriteDataRequest request) { return request.getRequestType() == WriteDataRequestType.PUBLISHER - || request.getRequestType() == WriteDataRequestType.UN_PUBLISHER - || request.getRequestType() == WriteDataRequestType.CLIENT_OFF; + || request.getRequestType() == WriteDataRequestType.UN_PUBLISHER; } /** @@ -189,14 +186,14 @@ private void doHandle(WriteDataRequest request) { } break; case RENEW_DATUM: { - if (renewAndSnapshotInSilenceAndRefreshUpdateTime()) { + if (renewAndSnapshotInSilenceAndRefreshUpdateTime(request.getDataServerIP())) { return; } doRenewAsync(request); } break; case DATUM_SNAPSHOT: { - if (renewAndSnapshotInSilenceAndRefreshUpdateTime()) { + if (renewAndSnapshotInSilenceAndRefreshUpdateTime(request.getDataServerIP())) { return; } halt(); @@ -282,8 +279,9 @@ private void doSnapshotAsync(WriteDataRequest request) { /** * In silence, do not renew and snapshot */ - private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime() { - boolean renewAndSnapshotInSilence = System.currentTimeMillis() - refreshUpdateTime() < this.sessionServerConfig + private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime(String dataServerIP) { + boolean renewAndSnapshotInSilence = System.currentTimeMillis() + - refreshUpdateTime(dataServerIP) < this.sessionServerConfig .getRenewAndSnapshotSilentPeriodSec() * 1000L; if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug( @@ -293,7 +291,16 @@ private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime() { return renewAndSnapshotInSilence; } - private long refreshUpdateTime() { + private long refreshUpdateTime(String dataServerIP) { + AtomicLong lastUpdateTimestamp = lastUpdateTimestampMap.get(dataServerIP); + if (lastUpdateTimestamp == null) { + lastUpdateTimestamp = new AtomicLong(0); + AtomicLong _lastUpdateTimestamp = lastUpdateTimestampMap.putIfAbsent(dataServerIP, + lastUpdateTimestamp); + if (_lastUpdateTimestamp != null) { + lastUpdateTimestamp = _lastUpdateTimestamp; + } + } return lastUpdateTimestamp.getAndSet(System.currentTimeMillis()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java index a15c90025..0e71f8ab1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataRequest.java @@ -41,4 +41,6 @@ enum WriteDataRequestType { WriteDataRequestType getRequestType(); String getConnectId(); + + String getDataServerIP(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 348c25020..c21471f95 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -368,7 +368,7 @@ public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { } } catch (RequestException e) { throw new RuntimeException(String.format(msgFormat, request.getRequestUrl(), - e.getMessage())); + e.getMessage()), e); } } @@ -383,7 +383,7 @@ public RenewDatumRequest getRequestBody() { @Override public URL getRequestUrl() { - return new URL(renewDatumRequest.getDataServerIp(), + return new URL(renewDatumRequest.getDataServerIP(), sessionServerConfig.getDataServerPort()); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index cd2cb1273..280ce0056 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -16,10 +16,10 @@ */ package com.alipay.sofa.registry.server.session.registry; -import com.alipay.sofa.registry.common.model.store.StoreData; - import java.util.List; +import com.alipay.sofa.registry.common.model.store.StoreData; + /** * * @author shangyu.wh @@ -76,7 +76,7 @@ public interface Registry { */ void renewDatum(String connectId); - void sendDatumSnapshot(String connectId); + void sendDatumSnapshot(String connectId, String dataServerIp); /** * for scheduler clean no connect client diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index b0c6fa733..100e9405a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.session.registry; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; @@ -47,15 +57,6 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; /** * @@ -133,69 +134,75 @@ public class SessionRegistry implements Registry { @Override public void register(StoreData storeData) { + WrapperInvocation wrapperInvocation = new WrapperInvocation( + new Wrapper() { + @Override + public Boolean call() { + + switch (storeData.getDataType()) { + case PUBLISHER: + Publisher publisher = (Publisher) storeData; + + sessionDataStore.add(publisher); + + // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) + // are handed over to WriteDataAcceptor + writeDataAcceptor.accept(new WriteDataRequest() { + @Override + public Object getRequestBody() { + return publisher; + } + + @Override + public WriteDataRequestType getRequestType() { + return WriteDataRequestType.PUBLISHER; + } + + @Override + public String getConnectId() { + return publisher.getSourceAddress().getAddressString(); + } + + @Override + public String getDataServerIP() { + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + return dataNode.getNodeUrl().getIpAddress(); + } + }); + + sessionRegistryStrategy.afterPublisherRegister(publisher); + break; + case SUBSCRIBER: + Subscriber subscriber = (Subscriber) storeData; + + sessionInterests.add(subscriber); + + sessionRegistryStrategy.afterSubscriberRegister(subscriber); + break; + case WATCHER: + Watcher watcher = (Watcher) storeData; + + sessionWatchers.add(watcher); + + sessionRegistryStrategy.afterWatcherRegister(watcher); + break; + default: + break; + } + return null; + } - WrapperInvocation wrapperInvocation = new WrapperInvocation(new Wrapper() { - @Override - public Boolean call() { - - switch (storeData.getDataType()) { - case PUBLISHER: - Publisher publisher = (Publisher) storeData; - - sessionDataStore.add(publisher); - - // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) - // are handed over to WriteDataAcceptor - writeDataAcceptor.accept(new WriteDataRequest() { - @Override - public Object getRequestBody() { - return publisher; - } - - @Override - public WriteDataRequestType getRequestType() { - return WriteDataRequestType.PUBLISHER; - } - - @Override - public String getConnectId() { - return publisher.getSourceAddress().getAddressString(); - } - }); - - sessionRegistryStrategy.afterPublisherRegister(publisher); - break; - case SUBSCRIBER: - Subscriber subscriber = (Subscriber) storeData; - - sessionInterests.add(subscriber); - - sessionRegistryStrategy.afterSubscriberRegister(subscriber); - break; - case WATCHER: - Watcher watcher = (Watcher) storeData; - - sessionWatchers.add(watcher); - - sessionRegistryStrategy.afterWatcherRegister(watcher); - break; - default: - break; - } - return null; - } - - @Override - public Supplier getParameterSupplier() { - return ()->storeData; - } + @Override + public Supplier getParameterSupplier() { + return () -> storeData; + } - }, wrapperInterceptorManager); + }, wrapperInterceptorManager); try { wrapperInvocation.proceed(); } catch (Exception e) { - throw new RuntimeException("Proceed register error!",e); + throw new RuntimeException("Proceed register error!", e); } } @@ -226,6 +233,12 @@ public WriteDataRequestType getRequestType() { public String getConnectId() { return publisher.getSourceAddress().getAddressString(); } + + @Override + public String getDataServerIP() { + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + return dataNode.getNodeUrl().getIpAddress(); + } }); sessionRegistryStrategy.afterPublisherUnRegister(publisher); @@ -290,6 +303,11 @@ public WriteDataRequestType getRequestType() { public String getConnectId() { return connectId; } + + @Override + public String getDataServerIP() { + return null; + } }); writeDataAcceptor.remove(connectId); } @@ -343,10 +361,8 @@ private Map> calculateDataNode(Collection dat if (dataInfoIds != null) { dataInfoIds.forEach(dataInfoId -> { Node dataNode = dataNodeManager.getNode(dataInfoId); - URL url = new URL(dataNode.getNodeUrl().getIpAddress(), - sessionServerConfig.getDataServerPort()); - Collection list = map.computeIfAbsent(url.getAddressString(), - k -> new ArrayList<>()); + URL url = new URL(dataNode.getNodeUrl().getIpAddress(), sessionServerConfig.getDataServerPort()); + Collection list = map.computeIfAbsent(url.getAddressString(), k -> new ArrayList<>()); list.add(dataInfoId); }); } @@ -359,25 +375,26 @@ public void remove(List connectIds) { List connectIdsAll = new ArrayList<>(); connectIds.forEach(connectId -> { Map pubMap = getSessionDataStore().queryByConnectId(connectId); - boolean pubExisted = pubMap != null && !pubMap.isEmpty(); + boolean pubExisted = pubMap != null && !pubMap.isEmpty(); Map subMap = getSessionInterests().queryByConnectId(connectId); boolean subExisted = false; - if(subMap != null && !subMap.isEmpty()){ + if (subMap != null && !subMap.isEmpty()) { subExisted = true; - subMap.forEach((registerId,sub)->{ - if(dataIdMatchStrategy.match(sub.getDataId(),()->sessionServerConfig.getBlacklistSubDataIdRegex())) { + subMap.forEach((registerId, sub) -> { + if (dataIdMatchStrategy + .match(sub.getDataId(), () -> sessionServerConfig.getBlacklistSubDataIdRegex())) { fireSubscriberPushEmptyTask(sub); } }); } - if(pubExisted || subExisted){ + if (pubExisted || subExisted) { connectIdsAll.add(connectId); } }); - if(!connectIds.isEmpty()) { + if (!connectIds.isEmpty()) { TaskEvent taskEvent = new TaskEvent(connectIds, TaskEvent.TaskType.CANCEL_DATA_TASK); TASK_LOGGER.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); getTaskListenerManager().sendTaskEvent(taskEvent); @@ -439,15 +456,21 @@ public WriteDataRequestType getRequestType() { public String getConnectId() { return connectId; } + + @Override + public String getDataServerIP() { + return renewDatumRequest.getDataServerIP(); + } }); } } } @Override - public void sendDatumSnapshot(String connectId) { + public void sendDatumSnapshot(String connectId, String dataServerIP) { if (RENEW_LOGGER.isDebugEnabled()) { - RENEW_LOGGER.debug("sendDatumSnapshot: connectId={}", connectId); + RENEW_LOGGER.debug("sendDatumSnapshot: connectId={}, dataServerIP={}", connectId, + dataServerIP); } // All write operations to DataServer (pub/unPub/clientoff/renew/snapshot) @@ -467,6 +490,11 @@ public WriteDataRequestType getRequestType() { public String getConnectId() { return connectId; } + + @Override + public String getDataServerIP() { + return dataServerIP; + } }); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index e252027d6..8fbbd74f4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -62,7 +62,8 @@ public void execute() { renewDatumRequest); // send snapshot datum for the corresponding connId - sessionRegistry.sendDatumSnapshot(renewDatumRequest.getConnectId()); + sessionRegistry.sendDatumSnapshot(renewDatumRequest.getConnectId(), + renewDatumRequest.getDataServerIP()); } } catch (Exception e) { From 8c57240f1bfee67f18b4485973ca5469c5400447 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 1 Aug 2019 14:01:52 +0800 Subject: [PATCH 093/161] =?UTF-8?q?1.=20DataServer=EF=BC=9A=20RenewDatumHa?= =?UTF-8?q?ndler=20must=20return=20GenericResponse=20but=20not=20CommonRes?= =?UTF-8?q?ponse,=20or=20else=20session=20will=20class=20cast=20exception?= =?UTF-8?q?=202.=20No=20need=20to=20update=20timestamp=20after=20renew=203?= =?UTF-8?q?.=20snapshot:=20Need=20to=20specify=20DataServerIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/RenewDatumHandler.java | 2 +- .../session/acceptor/WriteDataProcessor.java | 54 +++++++++++++------ .../session/renew/DefaultRenewService.java | 22 +++++++- .../server/session/renew/RenewService.java | 4 +- 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index adafca516..43ba37c64 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -85,7 +85,7 @@ public Object doHandle(Channel channel, RenewDatumRequest request) { if (forwardService.needForward()) { LOGGER.warn("[forward] Renew request refused, request: {}", request); - CommonResponse response = new CommonResponse(); + GenericResponse response = new GenericResponse(); response.setSuccess(false); response.setMessage("Renew request refused, Server status is not working"); return response; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java index 6210c298b..3e9e497b5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/acceptor/WriteDataProcessor.java @@ -16,7 +16,6 @@ */ package com.alipay.sofa.registry.server.session.acceptor; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -186,7 +185,7 @@ private void doHandle(WriteDataRequest request) { } break; case RENEW_DATUM: { - if (renewAndSnapshotInSilenceAndRefreshUpdateTime(request.getDataServerIP())) { + if (renewAndSnapshotInSilence(request.getDataServerIP())) { return; } doRenewAsync(request); @@ -260,18 +259,22 @@ private void sendEvent(Object eventObj, TaskType taskType) { } private void doSnapshotAsync(WriteDataRequest request) { - RENEW_LOGGER.info("doSnapshotAsync: connectId={}, requestType={}, requestBody={}", - connectId, request.getRequestType(), request.getRequestBody()); + RENEW_LOGGER.info( + "doSnapshotAsync: connectId={}, dataServerIP={}, requestType={}, requestBody={}", + connectId, request.getDataServerIP(), request.getRequestType(), + request.getRequestBody()); String connectId = (String) request.getRequestBody(); - List datumSnapshotRequests = renewService - .getDatumSnapshotRequests(connectId); - if (datumSnapshotRequests != null) { - for (DatumSnapshotRequest datumSnapshotRequest : datumSnapshotRequests) { - TaskEvent taskEvent = new TaskEvent(datumSnapshotRequest, - TaskType.DATUM_SNAPSHOT_TASK); - taskListenerManager.sendTaskEvent(taskEvent); - } + DatumSnapshotRequest datumSnapshotRequest = renewService.getDatumSnapshotRequest(connectId, + request.getDataServerIP()); + if (datumSnapshotRequest != null) { + TaskEvent taskEvent = new TaskEvent(datumSnapshotRequest, TaskType.DATUM_SNAPSHOT_TASK); + taskListenerManager.sendTaskEvent(taskEvent); + } else { + RENEW_LOGGER + .info( + "datumSnapshotRequest is null when doSnapshotAsync: connectId={}, dataServerIP={}, requestType={}", + connectId, request.getDataServerIP(), request.getRequestType()); } } @@ -279,9 +282,9 @@ private void doSnapshotAsync(WriteDataRequest request) { /** * In silence, do not renew and snapshot */ - private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime(String dataServerIP) { + private boolean renewAndSnapshotInSilence(String dataServerIP) { boolean renewAndSnapshotInSilence = System.currentTimeMillis() - - refreshUpdateTime(dataServerIP) < this.sessionServerConfig + - getLastUpdateTime(dataServerIP).get() < this.sessionServerConfig .getRenewAndSnapshotSilentPeriodSec() * 1000L; if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug( @@ -291,7 +294,28 @@ private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime(String dataServerI return renewAndSnapshotInSilence; } + /** + * In silence, do not renew and snapshot + */ + private boolean renewAndSnapshotInSilenceAndRefreshUpdateTime(String dataServerIP) { + boolean renewAndSnapshotInSilence = System.currentTimeMillis() + - refreshUpdateTime(dataServerIP) < this.sessionServerConfig + .getRenewAndSnapshotSilentPeriodSec() * 1000L; + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER + .debug( + "renewAndSnapshotInSilenceAndRefreshUpdateTime: connectId={}, renewAndSnapshotInSilence={}", + connectId, renewAndSnapshotInSilence); + } + return renewAndSnapshotInSilence; + } + private long refreshUpdateTime(String dataServerIP) { + AtomicLong lastUpdateTimestamp = getLastUpdateTime(dataServerIP); + return lastUpdateTimestamp.getAndSet(System.currentTimeMillis()); + } + + private AtomicLong getLastUpdateTime(String dataServerIP) { AtomicLong lastUpdateTimestamp = lastUpdateTimestampMap.get(dataServerIP); if (lastUpdateTimestamp == null) { lastUpdateTimestamp = new AtomicLong(0); @@ -301,6 +325,6 @@ private long refreshUpdateTime(String dataServerIP) { lastUpdateTimestamp = _lastUpdateTimestamp; } } - return lastUpdateTimestamp.getAndSet(System.currentTimeMillis()); + return lastUpdateTimestamp; } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java index 5270777af..c630212e9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/DefaultRenewService.java @@ -49,7 +49,7 @@ public class DefaultRenewService implements RenewService { @Override public List getRenewDatumRequests(String connectId) { - List datumSnapshotRequests = getDatumSnapshotRequests(connectId); + List datumSnapshotRequests = getDatumSnapshotRequest(connectId); if (datumSnapshotRequests != null && !datumSnapshotRequests.isEmpty()) { return datumSnapshotRequests.stream() .map(datumSnapshotRequest -> new RenewDatumRequest(datumSnapshotRequest.getConnectId(), @@ -61,7 +61,7 @@ public List getRenewDatumRequests(String connectId) { } @Override - public List getDatumSnapshotRequests(String connectId) { + public List getDatumSnapshotRequest(String connectId) { Map pubMap = sessionDataStore.queryByConnectId(connectId); if (pubMap != null && !pubMap.isEmpty()) { Map> dataServerIpToPubs = new ConcurrentHashMap<>(); @@ -84,4 +84,22 @@ public List getDatumSnapshotRequests(String connectId) { } return null; } + + @Override + public DatumSnapshotRequest getDatumSnapshotRequest(String connectId, String dataServerIP) { + List publishers = new ArrayList<>(); + Map pubMap = sessionDataStore.queryByConnectId(connectId); + if (pubMap != null && !pubMap.isEmpty()) { + pubMap.values().forEach(publisher -> { + Node dataNode = dataNodeManager.getNode(publisher.getDataInfoId()); + if (dataServerIP.equalsIgnoreCase(dataNode.getNodeUrl().getIpAddress())) { + publishers.add(publisher); + } + }); + } + if (!publishers.isEmpty()) { + return new DatumSnapshotRequest(connectId, dataServerIP, publishers); + } + return null; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java index 9d3b7f5b9..ad760951f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/renew/RenewService.java @@ -42,5 +42,7 @@ public interface RenewService { * @param connectId * @return */ - List getDatumSnapshotRequests(String connectId); + List getDatumSnapshotRequest(String connectId); + + DatumSnapshotRequest getDatumSnapshotRequest(String connectId, String dataServerIP); } \ No newline at end of file From 8e9324363e9aa5c348a4832d08af19075742edb8 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 1 Aug 2019 18:11:35 +0800 Subject: [PATCH 094/161] add logs --- .../node/service/DataNodeServiceImpl.java | 24 ++++++++++--------- .../session/remoting/DataNodeExchanger.java | 4 +++- .../scheduler/task/RenewDatumTask.java | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index cf419a7eb..e5f7f33bc 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -42,15 +53,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * @@ -433,8 +435,8 @@ private void sendRequest(Request request) throws RequestException { CommonResponse commonResponse = (CommonResponse) result; if (!commonResponse.isSuccess()) { throw new RuntimeException(String.format( - "response not success, failed! target url: %s, message: %s", - request.getRequestUrl(), commonResponse.getMessage())); + "response not success, failed! target url: %s, request: %s, message: %s", + request.getRequestUrl(), request.getRequestBody(), commonResponse.getMessage())); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index 9110b5636..402ad3c6a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -100,7 +100,9 @@ public Response request(Request request) throws RequestException { } response = () -> result; } catch (Exception e) { - throw new RequestException("DataNode Exchanger request data error!Request url:" + url, request, e); + LOGGER.error(String.format("DataNode Exchanger request data error! Request url=%s, request=%s, msg=%s", url, + request, e.getMessage())); + throw new RequestException("DataNode Exchanger request data error! Request url:" + url, request, e); } return response; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java index 8fbbd74f4..04ee1814a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/RenewDatumTask.java @@ -68,8 +68,8 @@ public void execute() { } } catch (Exception e) { RENEW_LOGGER.error(String.format( - "Renew datum request to dataNode error! renewDatumRequest=%s", renewDatumRequest), - e); + "Renew datum request to dataNode error! renewDatumRequest=%s, errorMsg=%s", + renewDatumRequest, e.getMessage()), e); } } From 49d462b2d4c4635b8a90a9f602321cd2078693f5 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 1 Aug 2019 21:09:01 +0800 Subject: [PATCH 095/161] 1. dataServer: reduce log of snapshotHandler 2. update logs --- .../handler/DatumSnapshotHandler.java | 11 ++++++-- .../node/service/DataNodeServiceImpl.java | 27 +++++++++---------- .../session/remoting/DataNodeExchanger.java | 4 +-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index da98a6171..ecf189031 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -61,7 +61,7 @@ public class DatumSnapshotHandler extends AbstractServerHandler publishers) { int i = 1; for (;;) { Publisher e = it.next(); - sb.append(e); + sb.append("Publisher{dataInfoId='").append(e.getDataInfoId()).append('\''); + sb.append(", cell='").append(e.getCell()).append('\''); + sb.append(", registerId='").append(e.getRegisterId()).append('\''); + sb.append(", version=").append(e.getVersion()); + sb.append(", sourceAddress=").append(e.getSourceAddress()); + sb.append(", registerTimestamp=").append(e.getRegisterTimestamp()); + sb.append(", clientRegisterTimestamp=").append(e.getClientRegisterTimestamp()); + sb.append('}'); if (!it.hasNext() || i++ >= LIMITED_LIST_SIZE_FOR_PRINT) return sb.append(']').toString(); sb.append(',').append(' '); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index e5f7f33bc..0c44953c7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -338,15 +338,19 @@ public URL getRequestUrl() { if (genericResponse.isSuccess()) { map = (Map) genericResponse.getData(); if (map == null || map.isEmpty()) { - LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}",dataCenterId); + LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}", dataCenterId); } else { map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); } } else { - throw new RuntimeException(String.format("GetDataRequest has got fail response!dataInfoId:%s msg:%s",dataInfoId,genericResponse.getMessage())); + throw new RuntimeException( + String.format("GetDataRequest has got fail response!dataInfoId:%s msg:%s", dataInfoId, + genericResponse.getMessage())); } } catch (RequestException e) { - throw new RuntimeException(String.format("Get data request to data node error!dataInfoId:%s msg:%s ",dataInfoId ,e.getMessage()), e); + throw new RuntimeException( + String.format("Get data request to data node error!dataInfoId:%s msg:%s ", dataInfoId, + e.getMessage()), e); } return map; @@ -355,19 +359,11 @@ public URL getRequestUrl() { @Override public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { Request request = buildRenewDatumRequest(renewDatumRequest); - String msgFormat = "RenewDatum get response not success, target url: %s, message: %s"; try { - Response response = dataNodeExchanger.request(request); - GenericResponse genericResponse = (GenericResponse) response.getResult(); - if (genericResponse.isSuccess()) { - return (Boolean) genericResponse.getData(); - } else { - throw new RuntimeException(String.format(msgFormat, request.getRequestUrl(), - genericResponse.getMessage())); - } + GenericResponse genericResponse = (GenericResponse) sendRequest(request); + return (Boolean) genericResponse.getData(); } catch (RequestException e) { - throw new RuntimeException(String.format(msgFormat, request.getRequestUrl(), - e.getMessage()), e); + throw new RuntimeException(e.getMessage(), e); } } @@ -429,7 +425,7 @@ public AtomicInteger getRetryTimes() { }; } - private void sendRequest(Request request) throws RequestException { + private CommonResponse sendRequest(Request request) throws RequestException { Response response = dataNodeExchanger.request(request); Object result = response.getResult(); CommonResponse commonResponse = (CommonResponse) result; @@ -438,6 +434,7 @@ private void sendRequest(Request request) throws RequestException { "response not success, failed! target url: %s, request: %s, message: %s", request.getRequestUrl(), request.getRequestBody(), commonResponse.getMessage())); } + return commonResponse; } private void doRetryAsync(String bizName, Request request, Exception e, int maxRetryTimes, long firstDelay, diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index 402ad3c6a..c3b2e2aef 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -100,8 +100,8 @@ public Response request(Request request) throws RequestException { } response = () -> result; } catch (Exception e) { - LOGGER.error(String.format("DataNode Exchanger request data error! Request url=%s, request=%s, msg=%s", url, - request, e.getMessage())); + LOGGER.error(String.format("Error when request DataNode! Request url=%s, request=%s, msg=%s", url, + request.getRequestBody(), e.getMessage())); throw new RequestException("DataNode Exchanger request data error! Request url:" + url, request, e); } From 8e76d7996e3fff1c63e6dae4658a1aebf0cf83b1 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 1 Aug 2019 21:49:09 +0800 Subject: [PATCH 096/161] dataServer: renew logic should delay for some time after status is WORKING, cause Data is processed asynchronously after synchronization from other DataServer --- .../DataServerBeanConfiguration.java | 6 ++- .../data/bootstrap/DataServerConfig.java | 20 +++++++++ .../handler/DatumSnapshotHandler.java | 16 -------- .../handler/RenewDatumHandler.java | 41 +++++++++++++++---- .../server/data/renew/DatumLeaseManager.java | 33 ++++++++++++--- 5 files changed, 87 insertions(+), 29 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 841bad658..154dad442 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -280,7 +280,7 @@ public AbstractServerHandler datumSnapshotHandler() { } @Bean - public AbstractServerHandler renewDatumHandler() { + public RenewDatumHandler renewDatumHandler() { return new RenewDatumHandler(); } @@ -514,9 +514,13 @@ public static class AfterWorkingProcessConfiguration { @Autowired AbstractClientHandler notifyDataSyncHandler; + @Autowired + RenewDatumHandler renewDatumHandler; + @Bean(name = "afterWorkProcessors") public List afterWorkingProcessors() { List list = new ArrayList<>(); + list.add(renewDatumHandler); list.add(disconnectEventHandler); list.add((NotifyDataSyncHandler) notifyDataSyncHandler); return list; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index f6e3c8137..48578eb8f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -117,6 +117,8 @@ public class DataServerConfig { private int sessionServerNotifierRetryExecutorQueueSize = 1000000; + private int renewEnableDelaySec = 30; + /** * constructor * @param commonConfig @@ -125,6 +127,24 @@ public DataServerConfig(CommonConfig commonConfig) { this.commonConfig = commonConfig; } + /** + * Getter method for property renewEnableDelaySec. + * + * @return property value of renewEnableDelaySec + */ + public int getRenewEnableDelaySec() { + return renewEnableDelaySec; + } + + /** + * Setter method for property renewEnableDelaySec . + * + * @param renewEnableDelaySec value to be assigned to property renewEnableDelaySec + */ + public void setRenewEnableDelaySec(int renewEnableDelaySec) { + this.renewEnableDelaySec = renewEnableDelaySec; + } + public String getLocalDataCenter() { return commonConfig.getLocalDataCenter(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index ecf189031..3c43fc486 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -40,7 +40,6 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.change.event.DatumSnapshotEvent; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -52,10 +51,6 @@ */ public class DatumSnapshotHandler extends AbstractServerHandler { - /** LOGGER */ - private static final Logger LOGGER = LoggerFactory - .getLogger(DatumSnapshotHandler.class); - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( ValueConstants.LOGGER_NAME_RENEW, "[DatumSnapshotHandler]"); @@ -63,9 +58,6 @@ public class DatumSnapshotHandler extends AbstractServerHandler pubMap = request.getPublishers().stream() .collect(Collectors.toMap(p -> p.getRegisterId(), p -> p)); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index 43ba37c64..712e47fff 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -19,6 +19,8 @@ import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -33,9 +35,10 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.forward.ForwardService; import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.util.ParaCheckUtil; @@ -45,7 +48,8 @@ * @author kezhu.wukz * @version $Id: RenewDatumHandler.java, v 0.1 2019-05-30 15:48 kezhu.wukz Exp $ */ -public class RenewDatumHandler extends AbstractServerHandler { +public class RenewDatumHandler extends AbstractServerHandler implements + AfterWorkingProcess { /** LOGGER */ private static final Logger LOGGER = LoggerFactory.getLogger(RenewDatumHandler.class); @@ -54,8 +58,7 @@ public class RenewDatumHandler extends AbstractServerHandler ValueConstants.LOGGER_NAME_RENEW, "[RenewDatumHandler]"); - @Autowired - private ForwardService forwardService; + private final AtomicBoolean renewEnabled = new AtomicBoolean(false); @Autowired private DatumLeaseManager datumLeaseManager; @@ -66,6 +69,9 @@ public class RenewDatumHandler extends AbstractServerHandler @Autowired private ThreadPoolExecutor renewDatumProcessorExecutor; + @Autowired + private DataServerConfig dataServerConfig; + @Override public Executor getExecutor() { return renewDatumProcessorExecutor; @@ -83,11 +89,12 @@ public Object doHandle(Channel channel, RenewDatumRequest request) { RENEW_LOGGER.debug("doHandle: request={}", request); } - if (forwardService.needForward()) { - LOGGER.warn("[forward] Renew request refused, request: {}", request); + if (!renewEnabled.get()) { + LOGGER.warn("[forward] Renew request refused, renewEnabled is false, request: {}", + request); GenericResponse response = new GenericResponse(); response.setSuccess(false); - response.setMessage("Renew request refused, Server status is not working"); + response.setMessage("Renew request refused, renewEnabled is false yet"); return response; } @@ -142,4 +149,24 @@ private boolean renewDatum(RenewDatumRequest request) { } return result; } + + @Override + public void afterWorkingProcess() { + /* + * After the snapshot data is synchronized during startup, it is queued and then placed asynchronously into + * DatumCache. When the notification becomes WORKING, there may be data in the queue that is not executed + * to DatumCache. So it need to sleep for a while. + */ + try { + TimeUnit.MILLISECONDS.sleep(dataServerConfig.getRenewEnableDelaySec()); + } catch (InterruptedException e) { + LOGGER.error(e.getMessage(), e); + } + renewEnabled.set(true); + } + + @Override + public int getOrder() { + return 0; + } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index 231e67c01..6fd11a238 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -23,6 +23,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.PostConstruct; @@ -35,10 +36,10 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.server.data.event.AfterWorkingProcess; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; -import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -48,7 +49,7 @@ * @author kezhu.wukz * @version $Id: DatumExpiredCleaner.java, v 0.1 2019-06-03 21:08 kezhu.wukz Exp $ */ -public class DatumLeaseManager { +public class DatumLeaseManager implements AfterWorkingProcess { private static final Logger LOGGER = LoggerFactory .getLogger(DatumLeaseManager.class); private static final TimeZone TIME_ZONE = TimeZone @@ -64,6 +65,8 @@ public class DatumLeaseManager { /** lock for connectId , format: connectId -> true */ private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); + private final AtomicBoolean renewEnabled = new AtomicBoolean(false); + private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; @Autowired @@ -179,7 +182,7 @@ private void scheduleEvictTask(String connectId, long delaySec) { */ boolean isExpired = System.currentTimeMillis() - lastRenewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; - if (isExpired) { + if (isExpired && renewEnabled.get()) { int ownPubSize = getOwnPubSize(connectId); if (ownPubSize > 0) { LOGGER.info("Evict connectId({}) cause it's expired, lastRenewTime is {}, pub.size is {}", @@ -222,6 +225,26 @@ private String format(long lastRenewTime) { return DateFormatUtils.format(lastRenewTime, "yyyy-MM-dd HH:mm:ss", TIME_ZONE); } + @Override + public void afterWorkingProcess() { + /* + * After the snapshot data is synchronized during startup, it is queued and then placed asynchronously into + * DatumCache. When the notification becomes WORKING, there may be data in the queue that is not executed + * to DatumCache. So it need to sleep for a while. + */ + try { + TimeUnit.MILLISECONDS.sleep(dataServerConfig.getRenewEnableDelaySec()); + } catch (InterruptedException e) { + LOGGER.error(e.getMessage(), e); + } + renewEnabled.set(true); + } + + @Override + public int getOrder() { + return 0; + } + /** * evict own connectIds with heartbeat less */ @@ -230,10 +253,10 @@ private class EvictTaskForHeartbeatLess implements Runnable { @Override public void run() { // If in a non-working state, cannot clean up because the renew request cannot be received at this time. - if (dataNodeStatus.getStatus() != LocalServerStatusEnum.WORKING) { + if (!renewEnabled.get()) { LOGGER .info( - "EvictTaskForHeartbeatLess skipped cause DataNodeStatus is {}, will retry after {}s", + "EvictTaskForHeartbeatLess skipped cause renewEnabled is false, DataNodeStatus is {}, will retry after {}s", dataNodeStatus.getStatus(), dataServerConfig.getDatumTimeToLiveSec()); return; } From 289d6f23690ccf7eaa9fa7c382f9346057e3a97b Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 1 Aug 2019 23:24:26 +0800 Subject: [PATCH 097/161] bugfix bean; update log --- .../DataServerBeanConfiguration.java | 4 +++ .../node/service/DataNodeServiceImpl.java | 34 ++++++++++--------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 154dad442..96694c971 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -517,10 +517,14 @@ public static class AfterWorkingProcessConfiguration { @Autowired RenewDatumHandler renewDatumHandler; + @Autowired + DatumLeaseManager datumLeaseManager; + @Bean(name = "afterWorkProcessors") public List afterWorkingProcessors() { List list = new ArrayList<>(); list.add(renewDatumHandler); + list.add(datumLeaseManager); list.add(disconnectEventHandler); list.add((NotifyDataSyncHandler) notifyDataSyncHandler); return list; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index 0c44953c7..afd2bf2ff 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -98,12 +98,12 @@ public void executionFailed(Throwable e) { @Override public void register(final Publisher publisher) { + String bizName = "PublishData"; Request request = buildPublishDataRequest(publisher); try { - sendRequest(request); + sendRequest(bizName, request); } catch (RequestException e) { - doRetryAsync("PublishData", request, e, - sessionServerConfig.getPublishDataTaskRetryTimes(), + doRetryAsync(bizName, request, e, sessionServerConfig.getPublishDataTaskRetryTimes(), sessionServerConfig.getPublishDataTaskRetryFirstDelay(), sessionServerConfig.getPublishDataTaskRetryIncrementDelay()); } @@ -136,12 +136,12 @@ public AtomicInteger getRetryTimes() { @Override public void unregister(final Publisher publisher) { + String bizName = "UnPublishData"; Request request = buildUnPublishDataRequest(publisher); try { - sendRequest(request); + sendRequest(bizName, request); } catch (RequestException e) { - doRetryAsync("UnPublishData", request, e, - sessionServerConfig.getUnPublishDataTaskRetryTimes(), + doRetryAsync(bizName, request, e, sessionServerConfig.getUnPublishDataTaskRetryTimes(), sessionServerConfig.getUnPublishDataTaskRetryFirstDelay(), sessionServerConfig.getUnPublishDataTaskRetryIncrementDelay()); } @@ -178,14 +178,15 @@ public void clientOff(List connectIds) { return; } //get all local dataCenter data node + String bizName = "ClientOff"; Collection nodes = dataNodeManager.getDataCenterNodes(); if (nodes != null && nodes.size() > 0) { for (Node node : nodes) { Request request = buildClientOffRequest(connectIds, node); try { - sendRequest(request); + sendRequest(bizName, request); } catch (RequestException e) { - doRetryAsync("ClientOff", request, e, + doRetryAsync(bizName, request, e, sessionServerConfig.getCancelDataTaskRetryTimes(), sessionServerConfig.getCancelDataTaskRetryFirstDelay(), sessionServerConfig.getCancelDataTaskRetryIncrementDelay()); @@ -360,7 +361,7 @@ public URL getRequestUrl() { public Boolean renewDatum(RenewDatumRequest renewDatumRequest) { Request request = buildRenewDatumRequest(renewDatumRequest); try { - GenericResponse genericResponse = (GenericResponse) sendRequest(request); + GenericResponse genericResponse = (GenericResponse) sendRequest("RenewDatum", request); return (Boolean) genericResponse.getData(); } catch (RequestException e) { throw new RuntimeException(e.getMessage(), e); @@ -391,12 +392,12 @@ public AtomicInteger getRetryTimes() { @Override public void sendDatumSnapshot(DatumSnapshotRequest datumSnapshotRequest) { + String bizName = "DatumSnapshot"; Request request = buildDatumSnapshotRequest(datumSnapshotRequest); try { - sendRequest(request); + sendRequest(bizName, request); } catch (RequestException e) { - doRetryAsync("DatumSnapshot", request, e, - sessionServerConfig.getDatumSnapshotTaskRetryTimes(), + doRetryAsync(bizName, request, e, sessionServerConfig.getDatumSnapshotTaskRetryTimes(), sessionServerConfig.getDatumSnapshotTaskRetryFirstDelay(), sessionServerConfig.getDatumSnapshotTaskRetryIncrementDelay()); } @@ -425,14 +426,15 @@ public AtomicInteger getRetryTimes() { }; } - private CommonResponse sendRequest(Request request) throws RequestException { + private CommonResponse sendRequest(String bizName, Request request) throws RequestException { Response response = dataNodeExchanger.request(request); Object result = response.getResult(); CommonResponse commonResponse = (CommonResponse) result; if (!commonResponse.isSuccess()) { throw new RuntimeException(String.format( - "response not success, failed! target url: %s, request: %s, message: %s", - request.getRequestUrl(), request.getRequestBody(), commonResponse.getMessage())); + "[%s] response not success, failed! target url: %s, request: %s, message: %s", + bizName, request.getRequestUrl(), request.getRequestBody(), + commonResponse.getMessage())); } return commonResponse; } @@ -444,7 +446,7 @@ private void doRetryAsync(String bizName, Request request, Exception e, int maxR LOGGER.warn("{} failed, will retry again, retryTimes: {}, msg: {}", bizName, retryTimes, e.getMessage()); asyncHashedWheelTimer.newTimeout(timeout -> { try { - sendRequest(request); + sendRequest(bizName, request); } catch (RequestException ex) { doRetryAsync(bizName, request, ex, maxRetryTimes, firstDelay, incrementDelay); } From fea0a2e33908ce49c47e2ce850629ab50289a5a4 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 2 Aug 2019 18:15:16 +0800 Subject: [PATCH 098/161] ignore renew request log --- .../remoting/sessionserver/handler/RenewDatumHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index 712e47fff..3004b3bdd 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -77,6 +77,10 @@ public Executor getExecutor() { return renewDatumProcessorExecutor; } + @Override + protected void logRequest(Channel channel, RenewDatumRequest request) { + } + @Override public void checkParam(RenewDatumRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getConnectId(), "RenewDatumRequest.connectId"); From 184fd77477da9fcd87d2b0701c5af1e7c4c4073d Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 2 Aug 2019 19:30:39 +0800 Subject: [PATCH 099/161] fix UT --- .../remoting/exchange/RequestException.java | 2 +- .../remoting/RequestExceptionTest.java | 12 +++--- .../registry/server/data/BackupTriadTest.java | 38 ++++++++----------- .../registry/server/data/TestSyncData.java | 8 ++-- 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java index 429684188..6f00d8edb 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/RequestException.java @@ -84,7 +84,7 @@ public String getMessage() { sb.append("request url: ").append(request.getRequestUrl()).append(", body: ") .append(request.getRequestBody()).append(", "); } - sb.append("message: ").append(super.getMessage()); + sb.append(super.getMessage()); return sb.toString(); } } \ No newline at end of file diff --git a/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java b/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java index a0b546141..03c7f8526 100644 --- a/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java +++ b/server/remoting/api/src/test/java/com/alipay/sofa/registry/remoting/RequestExceptionTest.java @@ -32,18 +32,16 @@ public class RequestExceptionTest { public void doTest() { RequestException exception = new RequestException("error message"); Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request data can not be null!", exception.getMessage()); RuntimeException runtimeException = new RuntimeException("error message"); exception = new RequestException(runtimeException); Assert.assertEquals("java.lang.RuntimeException: error message", exception.getMessage()); Assert.assertEquals(runtimeException, exception.getCause()); - Assert.assertEquals("Request data can not be null!", exception.getMessage()); + Assert.assertEquals("java.lang.RuntimeException: error message", exception.getMessage()); exception = new RequestException("error message", runtimeException); Assert.assertEquals("error message", exception.getMessage()); Assert.assertEquals(runtimeException, exception.getCause()); - Assert.assertEquals("Request data can not be null!", exception.getMessage()); Request request = new Request() { @Override @@ -57,11 +55,11 @@ public URL getRequestUrl() { } }; exception = new RequestException("error message", request); - Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request url:null body:request body", exception.getMessage()); + Assert.assertEquals("request url: null, body: request body, error message", + exception.getMessage()); exception = new RequestException("error message", request, runtimeException); - Assert.assertEquals("error message", exception.getMessage()); - Assert.assertEquals("Request url:null body:request body", exception.getMessage()); + Assert.assertEquals("request url: null, body: request body, error message", + exception.getMessage()); } } diff --git a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/BackupTriadTest.java b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/BackupTriadTest.java index ba4bba93a..f601b07f0 100644 --- a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/BackupTriadTest.java +++ b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/BackupTriadTest.java @@ -16,20 +16,21 @@ */ package com.alipay.sofa.registry.server.data; -import com.alipay.sofa.registry.common.model.metaserver.DataNode; -import com.alipay.sofa.registry.common.model.store.URL; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; -import com.alipay.sofa.registry.server.data.cache.BackupTriad; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import com.alipay.sofa.registry.common.model.metaserver.DataNode; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.cache.BackupTriad; /** * @author xuanbei @@ -51,12 +52,10 @@ public void doTest() { Set notWorking = new HashSet<>(); notWorking.add("192.168.0.2"); assertEquals(2, backupTriad.getNewJoined(newTriad, notWorking).size()); - assertEquals( - "DataNode{ip=192.168.0.2, dataCenter='DefaultDataCenter', regionId='null', nodeStatus=INIT, registrationTimestamp=0}", - backupTriad.getNewJoined(newTriad, notWorking).get(0).toString()); - assertEquals( - "DataNode{ip=192.168.0.4, dataCenter='DefaultDataCenter', regionId='null', nodeStatus=INIT, registrationTimestamp=0}", - backupTriad.getNewJoined(newTriad, notWorking).get(1).toString()); + assertEquals("DataNode{ip=192.168.0.2}", backupTriad.getNewJoined(newTriad, notWorking) + .get(0).toString()); + assertEquals("DataNode{ip=192.168.0.4}", backupTriad.getNewJoined(newTriad, notWorking) + .get(1).toString()); assertEquals("TestDataInfoId", backupTriad.getDataInfoId()); backupTriad.setDataInfoId("AnotherTestDataInfoId"); @@ -68,14 +67,9 @@ public void doTest() { backupTriad.setTriad(nodeList); assertTrue(backupTriad.containsSelf()); assertEquals(2, backupTriad.getTriad().size()); - assertEquals( - "DataNode{ip=192.168.0.1, dataCenter='DefaultDataCenter', regionId='null', nodeStatus=INIT, registrationTimestamp=0}", - backupTriad.getTriad().get(0).toString()); - assertEquals( - "DataNode{ip=" - + DataServerConfig.IP - + ", dataCenter='DefaultDataCenter', regionId='null', nodeStatus=INIT, registrationTimestamp=0}", - backupTriad.getTriad().get(1).toString()); + assertEquals("DataNode{ip=192.168.0.1}", backupTriad.getTriad().get(0).toString()); + assertEquals("DataNode{ip=" + DataServerConfig.IP + "}", backupTriad.getTriad().get(1) + .toString()); assertTrue(backupTriad.toString().contains( "BackupTriad{dataInfoId='AnotherTestDataInfoId', ipSetOfNode=") && backupTriad.toString().contains("192.168.0.1") diff --git a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java index d9e2a6afd..26044eeed 100644 --- a/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java +++ b/server/server/data/src/test/java/com/alipay/sofa/registry/server/data/TestSyncData.java @@ -27,6 +27,7 @@ import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; import com.alipay.sofa.registry.server.data.datasync.Operator; import com.alipay.sofa.registry.server.data.datasync.sync.Acceptor; +import com.alipay.sofa.registry.util.DatumVersionUtil; /** * @@ -79,13 +80,13 @@ public void setup() { public void testAcceptExpired() throws InterruptedException { Acceptor acceptor = new Acceptor(30, "11", "DefaultDataCenter", new DatumCache()); - Operator operator1 = new Operator(System.currentTimeMillis(), 0L, datum1, + Operator operator1 = new Operator(DatumVersionUtil.nextId(), 0L, datum1, DataSourceTypeEnum.SYNC); Thread.sleep(1000); - Operator operator2 = new Operator(System.currentTimeMillis(), operator1.getVersion(), + Operator operator2 = new Operator(DatumVersionUtil.nextId(), operator1.getVersion(), datum2, DataSourceTypeEnum.SYNC); Thread.sleep(2000); - Operator operator5 = new Operator(System.currentTimeMillis(), operator2.getVersion(), + Operator operator5 = new Operator(DatumVersionUtil.nextId(), operator2.getVersion(), datum5, DataSourceTypeEnum.SYNC); acceptor.appendOperator(operator1); @@ -102,4 +103,5 @@ public void testAcceptExpired() throws InterruptedException { Assert.assertTrue(ops[0].getVersion().equals(operator2.getVersion())); Assert.assertTrue(ops[1].getVersion().equals(operator5.getVersion())); } + } \ No newline at end of file From cd66da83941ff9def922ff874c3ac8f98d325410 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 2 Aug 2019 19:55:46 +0800 Subject: [PATCH 100/161] fix .travis.yml --- .travis.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index cb53cacfe..153f3dbd3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,17 @@ language: java sudo: false +dist: trusty + jdk: -- oraclejdk8 + - oraclejdk8 install: -- mvn clean install -DskipTests -B -V -- mvn test + - mvn clean install -DskipTests -B -V + - mvn test script: -- sh ./tools/check_format.sh + - sh ./tools/check_format.sh after_success: -- bash <(curl -s https://codecov.io/bash) \ No newline at end of file + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From b12cb9494fe7b510b8a20180462e6aa69750427e Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 5 Aug 2019 15:53:05 +0800 Subject: [PATCH 101/161] fix version 5.3.0-SNAPSHOT --- client/all/pom.xml | 2 +- client/api/pom.xml | 2 +- client/impl/pom.xml | 2 +- client/log/pom.xml | 2 +- client/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 2 +- server/common/model/pom.xml | 2 +- server/common/pom.xml | 2 +- server/common/util/pom.xml | 2 +- server/consistency/pom.xml | 2 +- server/distribution/data/pom.xml | 2 +- server/distribution/integration/pom.xml | 2 +- server/distribution/meta/pom.xml | 2 +- server/distribution/pom.xml | 2 +- server/distribution/session/pom.xml | 2 +- server/pom.xml | 2 +- server/remoting/api/pom.xml | 2 +- server/remoting/bolt/pom.xml | 2 +- server/remoting/http/pom.xml | 2 +- server/remoting/pom.xml | 2 +- server/server/data/pom.xml | 2 +- server/server/integration/pom.xml | 2 +- server/server/meta/pom.xml | 2 +- server/server/pom.xml | 2 +- server/server/session/pom.xml | 2 +- server/store/api/pom.xml | 2 +- server/store/jraft/pom.xml | 2 +- server/store/pom.xml | 2 +- test/pom.xml | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/client/all/pom.xml b/client/all/pom.xml index a4f06ded3..efd3d7917 100644 --- a/client/all/pom.xml +++ b/client/all/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-client-all - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ${project.groupId}:${project.artifactId} http://github.com/alipay/sofa-registry diff --git a/client/api/pom.xml b/client/api/pom.xml index 04292d197..a546a370c 100644 --- a/client/api/pom.xml +++ b/client/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/impl/pom.xml b/client/impl/pom.xml index b4179ca3d..8631db0d6 100644 --- a/client/impl/pom.xml +++ b/client/impl/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/log/pom.xml b/client/log/pom.xml index 9059c5354..04d11fb22 100644 --- a/client/log/pom.xml +++ b/client/log/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index a717d1f38..06f6a72a6 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml diff --git a/core/pom.xml b/core/pom.xml index 53b8c83d2..8b9bf5306 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index cbcc7cc05..92e6aa326 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT pom ${project.groupId}:${project.artifactId} diff --git a/server/common/model/pom.xml b/server/common/model/pom.xml index 534a888df..48974de3d 100644 --- a/server/common/model/pom.xml +++ b/server/common/model/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/pom.xml b/server/common/pom.xml index 23e48515d..0c4e482e3 100644 --- a/server/common/pom.xml +++ b/server/common/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/util/pom.xml b/server/common/util/pom.xml index bc5bae85f..a41fc6708 100644 --- a/server/common/util/pom.xml +++ b/server/common/util/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/consistency/pom.xml b/server/consistency/pom.xml index 74f34ed4f..9c52b6b98 100644 --- a/server/consistency/pom.xml +++ b/server/consistency/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/data/pom.xml b/server/distribution/data/pom.xml index 7a0bcf99f..444cabe65 100644 --- a/server/distribution/data/pom.xml +++ b/server/distribution/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/integration/pom.xml b/server/distribution/integration/pom.xml index acc7bd614..8118951ca 100644 --- a/server/distribution/integration/pom.xml +++ b/server/distribution/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/meta/pom.xml b/server/distribution/meta/pom.xml index 7eb2cb232..512053820 100644 --- a/server/distribution/meta/pom.xml +++ b/server/distribution/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/pom.xml b/server/distribution/pom.xml index d86e17598..ec4b3de52 100644 --- a/server/distribution/pom.xml +++ b/server/distribution/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/session/pom.xml b/server/distribution/session/pom.xml index afb87cdd1..ca9f732ec 100644 --- a/server/distribution/session/pom.xml +++ b/server/distribution/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/pom.xml b/server/pom.xml index b82e3c0dd..d2f9f1782 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml diff --git a/server/remoting/api/pom.xml b/server/remoting/api/pom.xml index bc3fef23a..620b1f1e2 100644 --- a/server/remoting/api/pom.xml +++ b/server/remoting/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/bolt/pom.xml b/server/remoting/bolt/pom.xml index 0298c7669..2f7d8a849 100644 --- a/server/remoting/bolt/pom.xml +++ b/server/remoting/bolt/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/http/pom.xml b/server/remoting/http/pom.xml index e58a1ed56..bff60eaf9 100644 --- a/server/remoting/http/pom.xml +++ b/server/remoting/http/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/pom.xml b/server/remoting/pom.xml index ad33907d6..29e168179 100644 --- a/server/remoting/pom.xml +++ b/server/remoting/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/data/pom.xml b/server/server/data/pom.xml index 6efabfd19..cefa28648 100644 --- a/server/server/data/pom.xml +++ b/server/server/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/integration/pom.xml b/server/server/integration/pom.xml index 1a6b754ab..fbe1f0316 100644 --- a/server/server/integration/pom.xml +++ b/server/server/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/meta/pom.xml b/server/server/meta/pom.xml index aa668a070..8bedc1a01 100644 --- a/server/server/meta/pom.xml +++ b/server/server/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/pom.xml b/server/server/pom.xml index 315e167ae..742c1fa75 100644 --- a/server/server/pom.xml +++ b/server/server/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/session/pom.xml b/server/server/session/pom.xml index 4762a1c9c..ff54e7abc 100644 --- a/server/server/session/pom.xml +++ b/server/server/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/api/pom.xml b/server/store/api/pom.xml index df0b06621..b2f226779 100644 --- a/server/store/api/pom.xml +++ b/server/store/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-store - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/jraft/pom.xml b/server/store/jraft/pom.xml index eb7356bbd..c2c5022bf 100644 --- a/server/store/jraft/pom.xml +++ b/server/store/jraft/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-store - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml diff --git a/server/store/pom.xml b/server/store/pom.xml index 0381e92a1..a9e371a24 100644 --- a/server/store/pom.xml +++ b/server/store/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index c81b32c84..11c4eca5d 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 From 788de7f825afce122e0ceeb82d47f30ed5d303a1 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 9 Aug 2019 15:47:36 +0800 Subject: [PATCH 102/161] fix online notify connect error --- .../server/data/cache/DataServerCache.java | 17 +++-- .../handler/DataServerChangeEventHandler.java | 3 + .../LocalDataServerChangeEventHandler.java | 73 +++++++++++++++++-- .../dataserver/DataServerNodeFactory.java | 23 +++--- 4 files changed, 95 insertions(+), 21 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java index 89e64f392..df481af15 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DataServerCache.java @@ -25,6 +25,7 @@ import com.alipay.sofa.registry.server.data.event.handler.AfterWorkingProcessHandler; import com.alipay.sofa.registry.server.data.node.DataNodeStatus; import com.alipay.sofa.registry.server.data.util.LocalServerStatusEnum; +import com.google.common.collect.Sets; import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; @@ -249,13 +250,15 @@ private void updateDataServerStatus() { Map map = nodeStatusMap.get(curVersion.get()); if (map != null) { Set ips = map.keySet(); - if (!ips.containsAll(newDataServerChangeItem.getServerMap() - .get(dataServerConfig.getLocalDataCenter()).keySet())) { - LOGGER.info( - "nodeStatusMap not contains all push list,nodeStatusMap {} push {}", - nodeStatusMap, - newDataServerChangeItem.getServerMap() - .get(dataServerConfig.getLocalDataCenter()).keySet()); + Set itemIps = newDataServerChangeItem.getServerMap() + .get(dataServerConfig.getLocalDataCenter()).keySet(); + if (!ips.containsAll(itemIps)) { + + LOGGER + .info( + "nodeStatusMap not contains all push list,nodeStatusMap {},push {},diff1{},diff2{}", + nodeStatusMap, itemIps, Sets.difference(ips, itemIps), + Sets.difference(itemIps, ips)); return; } } else { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java index d9a0a3d49..a2d6a5ae5 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/DataServerChangeEventHandler.java @@ -189,6 +189,9 @@ private void connectDataServer(String dataCenter, String ip) { "[DataServerChangeEventHandler] connect dataserver %s in %s failed five times,dataServer will not work,please check connect!", ip, dataCenter)); } + LOGGER.info( + "[DataServerChangeEventHandler] connect dataserver in {} success,remote={},local={}", + dataCenter, conn.getRemoteAddress(), conn.getLocalAddress()); //maybe get dataNode from metaServer,current has not start! register dataNode info to factory,wait for connect task next execute DataServerNodeFactory.register(new DataServerNode(ip, dataCenter, conn), dataServerConfig); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index 8bc114c76..e7b1061be 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -16,6 +16,7 @@ */ package com.alipay.sofa.registry.server.data.event.handler; +import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.NotifyFetchDatumRequest; @@ -25,6 +26,7 @@ import com.alipay.sofa.registry.consistency.hash.ConsistentHash; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.bolt.BoltChannel; import com.alipay.sofa.registry.remoting.exchange.message.Request; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.BackupTriad; @@ -91,6 +93,8 @@ public class LocalDataServerChangeEventHandler extends private AtomicBoolean isChanged = new AtomicBoolean(false); + private static final int TRY_COUNT = 5; + @Override public Class interest() { return LocalDataServerChangeEvent.class; @@ -358,13 +362,33 @@ private void notifyOnline(long changeVersion) { for (Entry serverEntry : dataServerNodeMap.entrySet()) { while (true) { String ip = serverEntry.getKey(); - DataServerNode dataServerNode = serverEntry.getValue(); + DataServerNode dataServerNode = DataServerNodeFactory.getDataServerNode( + dataServerConfig.getLocalDataCenter(), ip); + if (dataServerNode == null) { + LOGGER + .warn( + "notify Online dataserver {} has not existed in DataServerNodeFactory!version={}", + ip, changeVersion); break; } try { - if (dataServerNode.getConnection() == null - || !dataServerNode.getConnection().isFine()) { + final Connection connection = dataServerNode.getConnection(); + if (connection == null || !connection.isFine()) { + if (connection == null) { + LOGGER + .warn( + "notify Online dataserver connect not existed,ip={},version={}", + ip, changeVersion); + } else { + LOGGER + .warn( + "notify Online dataserver connect not fine!remote={},local={},version={}", + connection.getRemoteAddress(), + connection.getLocalAddress(), changeVersion); + } + //connect now and registry connect + connectDataServer(dataServerConfig.getLocalDataCenter(), ip); //maybe get dataNode from metaServer,current has not connected!wait for connect task execute TimeUtil.randomDelay(1000); continue; @@ -380,8 +404,8 @@ public Object getRequestBody() { @Override public URL getRequestUrl() { - return new URL(dataServerNode.getConnection().getRemoteIP(), - dataServerNode.getConnection().getRemotePort()); + return new URL(connection.getRemoteIP(), connection + .getRemotePort()); } }).getResult(); if (response.isSuccess()) { @@ -400,5 +424,44 @@ public URL getRequestUrl() { } } + /** + * connect specific dataserver + * + * @param dataCenter + * @param ip + */ + private void connectDataServer(String dataCenter, String ip) { + Connection conn = null; + for (int tryCount = 0; tryCount < TRY_COUNT; tryCount++) { + try { + conn = ((BoltChannel) dataNodeExchanger.connect(new URL(ip, dataServerConfig + .getSyncDataPort()))).getConnection(); + break; + } catch (Exception e) { + LOGGER.error( + "[LocalDataServerChangeEventHandler] connect dataServer {} in {} error", + ip, dataCenter, e); + TimeUtil.randomDelay(3000); + } + } + if (conn == null || !conn.isFine()) { + LOGGER + .error( + "[LocalDataServerChangeEventHandler] connect dataserver {} in {} failed five times", + ip, dataCenter); + throw new RuntimeException( + String + .format( + "[LocalDataServerChangeEventHandler] connect dataserver %s in %s failed five times,dataServer will not work,please check connect!", + ip, dataCenter)); + } + LOGGER + .info( + "[LocalDataServerChangeEventHandler] connect dataserver in {} success,remote={},local={}", + dataCenter, conn.getRemoteAddress(), conn.getLocalAddress()); + //maybe get dataNode from metaServer,current has not start! register dataNode info to factory,wait for connect task next execute + DataServerNodeFactory.register(new DataServerNode(ip, dataCenter, conn), + dataServerConfig); + } } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java index 62f0f3472..f13e88355 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver; +import com.alipay.remoting.Connection; +import com.alipay.sofa.registry.consistency.hash.ConsistentHash; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.node.DataServerNode; +import com.google.common.collect.Lists; + import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -24,12 +30,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; -import com.alipay.remoting.Connection; -import com.alipay.sofa.registry.consistency.hash.ConsistentHash; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; -import com.alipay.sofa.registry.server.data.node.DataServerNode; -import com.google.common.collect.Lists; - /** * the factory to hold other dataservers and connection connected to them * @@ -61,10 +61,15 @@ public class DataServerNodeFactory { */ public static void register(DataServerNode dataServerNode, DataServerConfig dataServerConfig) { String dataCenter = dataServerNode.getDataCenter(); - if (!MAP.containsKey(dataCenter)) { - MAP.put(dataCenter, new ConcurrentHashMap<>()); + Map dataMap = MAP.get(dataCenter); + if (dataMap == null) { + Map newMap = new ConcurrentHashMap<>(); + dataMap = MAP.putIfAbsent(dataCenter, newMap); + if (dataMap == null) { + dataMap = newMap; + } } - MAP.get(dataCenter).put(dataServerNode.getIp(), dataServerNode); + dataMap.put(dataServerNode.getIp(), dataServerNode); refreshConsistent(dataCenter, dataServerConfig); } From 406067fbbd178d62092f06c9f58143ad2f3c6b52 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 29 Aug 2019 13:14:57 +0800 Subject: [PATCH 103/161] fix push confirm error,and fix datum update version,pub threadpool config,add accesslimit service --- .../server/data/change/DataChangeHandler.java | 36 ++- .../LocalDataServerChangeEventHandler.java | 3 +- .../handler/NotifyDataSyncHandler.java | 19 +- .../server/meta/store/MetaStoreService.java | 35 ++- .../bootstrap/SessionServerConfig.java | 20 ++ .../bootstrap/SessionServerConfigBean.java | 208 +++++++++++++++++- .../bootstrap/SessionServerConfiguration.java | 19 ++ .../session/limit/AccessLimitService.java | 26 +++ .../session/limit/AccessLimitServiceImpl.java | 42 ++++ .../listener/PublishDataTaskListener.java | 27 +-- .../session/scheduler/ExecutorManager.java | 84 ++++--- .../task/DataChangeFetchCloudTask.java | 2 +- .../scheduler/task/DataChangeFetchTask.java | 34 +-- .../scheduler/task/PushTaskClosure.java | 65 +++--- .../task/ReceivedDataMultiPushTask.java | 102 +++++---- .../AccessLimitWrapperInterceptor.java | 53 +++++ .../wrapper/BlacklistWrapperInterceptor.java | 2 +- .../ClientCheckWrapperInterceptor.java | 2 +- 18 files changed, 587 insertions(+), 192 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index a4fac3ca8..665095b0d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.data.change; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executor; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -36,6 +27,13 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventQueue; import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; /** * notify sessionserver when data changed @@ -112,16 +110,34 @@ public void run() { String dataInfoId = snapshotData.getDataInfoId(); Map toBeDeletedPubMap = snapshotData.getToBeDeletedPubMap(); Map snapshotPubMap = snapshotData.getSnapshotPubMap(); + Datum oldDatum = datumCache.get(dataServerConfig.getLocalDataCenter(), dataInfoId); + long lastVersion = oldDatum != null ? oldDatum.getVersion() : 0l; Datum datum = datumCache.putSnapshot(dataInfoId, toBeDeletedPubMap, snapshotPubMap); + long version = datum != null ? datum.getVersion() : 0l; + LOGGER + .info( + "[DataChangeHandler][{}] snapshot handle,dataInfoId={}, version={}, lastVersion={}", + name, dataInfoId, version, lastVersion); notify(datum, changeData.getSourceType(), null); } else { Datum datum = changeData.getDatum(); + String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); - long version = datum.getVersion(); DataSourceTypeEnum sourceType = changeData.getSourceType(); DataChangeTypeEnum changeType = changeData.getChangeType(); + + if (changeType == DataChangeTypeEnum.MERGE + && sourceType != DataSourceTypeEnum.BACKUP + && sourceType != DataSourceTypeEnum.SYNC) { + //update version for pub or unPub merge to cache + //if the version product before merge to cache,it may be cause small version override big one + datum.updateVersion(); + } + + long version = datum.getVersion(); + try { if (sourceType == DataSourceTypeEnum.CLEAN) { if (datumCache.cleanDatum(dataCenter, dataInfoId)) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index e7b1061be..d303d192e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -49,7 +49,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -134,7 +133,7 @@ public void run() { try { LocalDataServerChangeEvent event = events.take(); //if the new joined servers contains self, set status as INITIAL - Set newJoined = event.getNewJoined(); + //Set newJoined = event.getNewJoined(); //if (newJoined.contains(DataServerConfig.IP) // && dataNodeStatus.getStatus() != LocalServerStatusEnum.INITIAL) { // dataNodeStatus.setStatus(LocalServerStatusEnum.INITIAL); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java index c1dd0cead..afdf1f191 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; @@ -48,6 +39,14 @@ import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @@ -116,7 +115,7 @@ private void executorRequest(Connection connection, NotifyDataSyncRequest reques new SyncDataRequest(dataInfoId, dataCenter, version, request.getDataSourceType()), dataChangeEventCenter)); } else { - LOGGER.info("[NotifyDataSyncHandler] not need to sync data, version={}", version); + LOGGER.info("[NotifyDataSyncHandler] not need to sync data, currentVersion={},request={}", version,request); } }); } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java index 69a60bd76..a57b53b31 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java @@ -16,20 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.store; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import javax.ws.rs.NotSupportedException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.GetChangeListRequest; @@ -45,6 +31,18 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.ws.rs.NotSupportedException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -337,9 +335,8 @@ private void firePushDataListTask(NodeChangeResult nodeChangeResult, String node taskEvent.setAttribute(Constant.PUSH_TARGET_TYPE, NodeType.DATA); taskEvent.setAttribute(Constant.PUSH_TARGET_OPERATOR_TYPE, nodeOperate); - LOGGER.info("send " + taskEvent.getTaskType() + " NodeType:" + NodeType.DATA + " Operator:" - + nodeOperate); - + LOGGER.info("send {} NodeType:{} Operator:{}", taskEvent.getTaskType(), NodeType.DATA, + nodeOperate); taskListenerManager.sendTaskEvent(taskEvent); } @@ -349,8 +346,8 @@ private void firePushSessionListTask(NodeChangeResult nodeChangeResult, String n TaskEvent taskEvent = new TaskEvent(nodeChangeResult, TaskType.DATA_NODE_CHANGE_PUSH_TASK); taskEvent.setAttribute(Constant.PUSH_TARGET_TYPE, NodeType.SESSION); taskEvent.setAttribute(Constant.PUSH_TARGET_OPERATOR_TYPE, nodeOperate); - LOGGER.info("send " + taskEvent.getTaskType() + " NodeType:" + NodeType.SESSION - + " Operator:" + nodeOperate); + LOGGER.info("send {} NodeType:{} Operator:{}", taskEvent.getTaskType(), NodeType.SESSION, + nodeOperate); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 10fc1be54..d0c5277a4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -194,4 +194,24 @@ public interface SessionServerConfig { int getRenewDatumWheelThreadSize(); int getRenewDatumWheelQueueSize(); + + long getPushTaskConfirmWaitTimeout(); + + int getPushTaskConfirmCheckWheelTicksSize(); + + int getPushTaskConfirmCheckWheelTicksDuration(); + + int getPushTaskConfirmCheckExecutorQueueSize(); + + int getPushTaskConfirmCheckExecutorThreadSize(); + + int getPublishDataExecutorMinPoolSize(); + + int getPublishDataExecutorMaxPoolSize(); + + int getPublishDataExecutorQueueSize(); + + long getPublishDataExecutorKeepAliveTime(); + + double getAccessLimitRate(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index aa51716e8..aba075070 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -16,14 +16,14 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Pattern; - import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + /** * The type Session server config bean. * @author shangyu.wh @@ -187,6 +187,26 @@ public class SessionServerConfigBean implements SessionServerConfig { private long pushDataTaskRetryIncrementDelay = 500; + private long pushTaskConfirmWaitTimeout = 10000; + + private int pushTaskConfirmCheckWheelTicksSize = 1024; + + private int pushTaskConfirmCheckWheelTicksDuration = 100; + + private int pushTaskConfirmCheckExecutorQueueSize = 10000; + + private int pushTaskConfirmCheckExecutorThreadSize = 10; + + private int publishDataExecutorMinPoolSize = 100; + + private int publishDataExecutorMaxPoolSize = 400; + + private int publishDataExecutorQueueSize = 10000; + + private long publishDataExecutorKeepAliveTime = 60; + + private double accessLimitRate = 100000.0; + private String sessionServerRegion; private String sessionServerDataCenter; @@ -1829,6 +1849,186 @@ public void setBlacklistSubDataIdRegex(String blacklistSubDataIdRegex) { this.blacklistSubDataIdRegex = blacklistSubDataIdRegex; } + /** + * Getter method for property pushTaskConfirmWaitTimeout. + * + * @return property value of pushTaskConfirmWaitTimeout + */ + public long getPushTaskConfirmWaitTimeout() { + return pushTaskConfirmWaitTimeout; + } + + /** + * Setter method for property pushTaskConfirmWaitTimeout. + * + * @param pushTaskConfirmWaitTimeout value to be assigned to property pushTaskConfirmWaitTimeout + */ + public void setPushTaskConfirmWaitTimeout(long pushTaskConfirmWaitTimeout) { + this.pushTaskConfirmWaitTimeout = pushTaskConfirmWaitTimeout; + } + + /** + * Getter method for property pushTaskConfirmCheckWheelTicksSize. + * + * @return property value of pushTaskConfirmCheckWheelTicksSize + */ + public int getPushTaskConfirmCheckWheelTicksSize() { + return pushTaskConfirmCheckWheelTicksSize; + } + + /** + * Getter method for property pushTaskConfirmCheckWheelTicksDuration. + * + * @return property value of pushTaskConfirmCheckWheelTicksDuration + */ + public int getPushTaskConfirmCheckWheelTicksDuration() { + return pushTaskConfirmCheckWheelTicksDuration; + } + + /** + * Getter method for property pushTaskConfirmCheckExecutorQueueSize. + * + * @return property value of pushTaskConfirmCheckExecutorQueueSize + */ + public int getPushTaskConfirmCheckExecutorQueueSize() { + return pushTaskConfirmCheckExecutorQueueSize; + } + + /** + * Getter method for property pushTaskConfirmCheckExecutorThreadSize. + * + * @return property value of pushTaskConfirmCheckExecutorThreadSize + */ + public int getPushTaskConfirmCheckExecutorThreadSize() { + return pushTaskConfirmCheckExecutorThreadSize; + } + + /** + * Setter method for property pushTaskConfirmCheckWheelTicksSize. + * + * @param pushTaskConfirmCheckWheelTicksSize value to be assigned to property pushTaskConfirmCheckWheelTicksSize + */ + public void setPushTaskConfirmCheckWheelTicksSize(int pushTaskConfirmCheckWheelTicksSize) { + this.pushTaskConfirmCheckWheelTicksSize = pushTaskConfirmCheckWheelTicksSize; + } + + /** + * Setter method for property pushTaskConfirmCheckWheelTicksDuration. + * + * @param pushTaskConfirmCheckWheelTicksDuration value to be assigned to property pushTaskConfirmCheckWheelTicksDuration + */ + public void setPushTaskConfirmCheckWheelTicksDuration(int pushTaskConfirmCheckWheelTicksDuration) { + this.pushTaskConfirmCheckWheelTicksDuration = pushTaskConfirmCheckWheelTicksDuration; + } + + /** + * Setter method for property pushTaskConfirmCheckExecutorQueueSize. + * + * @param pushTaskConfirmCheckExecutorQueueSize value to be assigned to property pushTaskConfirmCheckExecutorQueueSize + */ + public void setPushTaskConfirmCheckExecutorQueueSize(int pushTaskConfirmCheckExecutorQueueSize) { + this.pushTaskConfirmCheckExecutorQueueSize = pushTaskConfirmCheckExecutorQueueSize; + } + + /** + * Setter method for property pushTaskConfirmCheckExecutorThreadSize. + * + * @param pushTaskConfirmCheckExecutorThreadSize value to be assigned to property pushTaskConfirmCheckExecutorThreadSize + */ + public void setPushTaskConfirmCheckExecutorThreadSize(int pushTaskConfirmCheckExecutorThreadSize) { + this.pushTaskConfirmCheckExecutorThreadSize = pushTaskConfirmCheckExecutorThreadSize; + } + + /** + * Getter method for property publishDataExecutorMinPoolSize. + * + * @return property value of publishDataExecutorMinPoolSize + */ + public int getPublishDataExecutorMinPoolSize() { + return publishDataExecutorMinPoolSize; + } + + /** + * Getter method for property publishDataExecutorMaxPoolSize. + * + * @return property value of publishDataExecutorMaxPoolSize + */ + public int getPublishDataExecutorMaxPoolSize() { + return publishDataExecutorMaxPoolSize; + } + + /** + * Getter method for property publishDataExecutorQueueSize. + * + * @return property value of publishDataExecutorQueueSize + */ + public int getPublishDataExecutorQueueSize() { + return publishDataExecutorQueueSize; + } + + /** + * Getter method for property publishDataExecutorKeepAliveTime. + * + * @return property value of publishDataExecutorKeepAliveTime + */ + public long getPublishDataExecutorKeepAliveTime() { + return publishDataExecutorKeepAliveTime; + } + + /** + * Setter method for property publishDataExecutorMinPoolSize. + * + * @param publishDataExecutorMinPoolSize value to be assigned to property publishDataExecutorMinPoolSize + */ + public void setPublishDataExecutorMinPoolSize(int publishDataExecutorMinPoolSize) { + this.publishDataExecutorMinPoolSize = publishDataExecutorMinPoolSize; + } + + /** + * Setter method for property publishDataExecutorMaxPoolSize. + * + * @param publishDataExecutorMaxPoolSize value to be assigned to property publishDataExecutorMaxPoolSize + */ + public void setPublishDataExecutorMaxPoolSize(int publishDataExecutorMaxPoolSize) { + this.publishDataExecutorMaxPoolSize = publishDataExecutorMaxPoolSize; + } + + /** + * Setter method for property publishDataExecutorQueueSize. + * + * @param publishDataExecutorQueueSize value to be assigned to property publishDataExecutorQueueSize + */ + public void setPublishDataExecutorQueueSize(int publishDataExecutorQueueSize) { + this.publishDataExecutorQueueSize = publishDataExecutorQueueSize; + } + + /** + * Setter method for property publishDataExecutorKeepAliveTime. + * + * @param publishDataExecutorKeepAliveTime value to be assigned to property publishDataExecutorKeepAliveTime + */ + public void setPublishDataExecutorKeepAliveTime(long publishDataExecutorKeepAliveTime) { + this.publishDataExecutorKeepAliveTime = publishDataExecutorKeepAliveTime; + } + + /** + * Getter method for property accessLimitRate. + * + * @return property value of accessLimitRate + */ + public double getAccessLimitRate() { + return accessLimitRate; + } + + /** + * Setter method for property accessLimitRate. + * + * @param accessLimitRate value to be assigned to property accessLimitRate + */ + public void setAccessLimitRate(double accessLimitRate) { + this.accessLimitRate = accessLimitRate; + } + @Override public boolean isInvalidForeverZone(String zoneId) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 88cce9827..1faa2628c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -34,6 +34,8 @@ import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistMatchProcessFilter; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultDataIdMatchStrategy; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultIPMatchStrategy; +import com.alipay.sofa.registry.server.session.limit.AccessLimitService; +import com.alipay.sofa.registry.server.session.limit.AccessLimitServiceImpl; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchCloudTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchTaskListener; @@ -121,6 +123,7 @@ import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSubscriberRegisterFetchTaskStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSyncConfigHandlerStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultWatcherHandlerStrategy; +import com.alipay.sofa.registry.server.session.wrapper.AccessLimitWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.BlacklistWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.ClientCheckWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptor; @@ -662,6 +665,14 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { } } + @Configuration + public static class AccessLimitServiceConfiguration { + @Bean + public AccessLimitService accessLimitService(SessionServerConfig sessionServerConfig) { + return new AccessLimitServiceImpl(sessionServerConfig); + } + } + @Configuration public static class SessionFilterConfiguration { @@ -704,6 +715,14 @@ public WrapperInterceptor blacklistWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager.addInterceptor(blacklistWrapperInterceptor); return blacklistWrapperInterceptor; } + + @Bean + public WrapperInterceptor accessLimitWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager) { + AccessLimitWrapperInterceptor accessLimitWrapperInterceptor = new AccessLimitWrapperInterceptor(); + wrapperInterceptorManager.addInterceptor(accessLimitWrapperInterceptor); + return accessLimitWrapperInterceptor; + } + } @Configuration diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java new file mode 100644 index 000000000..7ac67b0f2 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.limit; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitService.java, v 0.1 2019-08-26 20:35 shangyu.wh Exp $ + */ +public interface AccessLimitService { + boolean tryAcquire(); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java new file mode 100644 index 000000000..fef1c6a8f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.limit; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.google.common.util.concurrent.RateLimiter; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitServiceImpl.java, v 0.1 2019-08-26 20:37 shangyu.wh Exp $ + */ +public class AccessLimitServiceImpl implements AccessLimitService { + + private SessionServerConfig sessionServerConfig; + + private RateLimiter rateLimiter; + + public AccessLimitServiceImpl(SessionServerConfig sessionServerConfig) { + this.sessionServerConfig = sessionServerConfig; + rateLimiter = RateLimiter.create(sessionServerConfig.getAccessLimitRate()); + } + + @Override + public boolean tryAcquire() { + return rateLimiter.tryAcquire(); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java index a8f57e491..e2d0f7ef8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java @@ -16,19 +16,15 @@ */ package com.alipay.sofa.registry.server.session.listener; -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; -import com.alipay.sofa.registry.task.batcher.TaskDispatcher; -import com.alipay.sofa.registry.task.batcher.TaskDispatchers; import com.alipay.sofa.registry.task.batcher.TaskProcessor; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -38,19 +34,13 @@ public class PublishDataTaskListener implements TaskListener { @Autowired - private DataNodeService dataNodeService; - - private TaskDispatcher singleTaskDispatcher; + private DataNodeService dataNodeService; @Autowired - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; - @PostConstruct - public void init() { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.PUBLISH_DATA_TASK.getName()), 100000, 32, - 1000, 1000, dataNodeSingleTaskProcessor); - } + @Autowired + private ExecutorManager executorManager; @Override public boolean support(TaskEvent event) { @@ -59,12 +49,11 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { + SessionTask publishDataTask = new PublishDataTask(dataNodeService); publishDataTask.setTaskEvent(event); - singleTaskDispatcher.dispatch(publishDataTask.getTaskId(), publishDataTask, - publishDataTask.getExpiryTime()); + executorManager.getPublishDataExecutor().execute(()-> dataNodeSingleTaskProcessor.process(publishDataTask)); } - } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index a5da49b80..13ab127a1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -16,6 +16,20 @@ */ package com.alipay.sofa.registry.server.session.scheduler; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.metrics.TaskMetrics; +import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; +import com.alipay.sofa.registry.util.NamedThreadFactory; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + import java.util.HashMap; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; @@ -27,16 +41,6 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import org.springframework.beans.factory.annotation.Autowired; - -import com.alipay.sofa.registry.metrics.TaskMetrics; -import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.node.NodeManager; -import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; -import com.alipay.sofa.registry.util.NamedThreadFactory; - /** * * @author shangyu.wh @@ -44,6 +48,9 @@ */ public class ExecutorManager { + private static final Logger LOGGER = LoggerFactory + .getLogger(ExecutorManager.class); + private final ScheduledExecutorService scheduler; private final ThreadPoolExecutor fetchDataExecutor; @@ -54,11 +61,13 @@ public class ExecutorManager { private final ThreadPoolExecutor connectDataExecutor; private final ExecutorService checkPushExecutor; - private final ExecutorService pushTaskClosureExecutor; private final ThreadPoolExecutor accessDataExecutor; private final ThreadPoolExecutor dataChangeRequestExecutor; private final ThreadPoolExecutor pushTaskExecutor; private final ThreadPoolExecutor connectClientExecutor; + private final ThreadPoolExecutor publishDataExecutor; + + private final AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer; private SessionServerConfig sessionServerConfig; @@ -94,6 +103,8 @@ public class ExecutorManager { private static final String CONNECT_CLIENT_EXECUTOR = "ConnectClientExecutor"; + private static final String PUBLISH_DATA_EXECUTOR = "PublishDataExecutor"; + public ExecutorManager(SessionServerConfig sessionServerConfig) { this.sessionServerConfig = sessionServerConfig; @@ -153,13 +164,6 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(100000), new NamedThreadFactory("UserDataElementPushCheck-executor", true))); - pushTaskClosureExecutor = reportExecutors - .computeIfAbsent(PUSH_TASK_CLOSURE_CHECK_EXECUTOR, k -> new SessionThreadPoolExecutor( - PUSH_TASK_CLOSURE_CHECK_EXECUTOR, 80, 400, 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(10000), - new NamedThreadFactory("PushTaskClosureCheck", true))); - connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( CONNECT_CLIENT_EXECUTOR, sessionServerConfig.getConnectClientExecutorMinPoolSize(), sessionServerConfig.getConnectClientExecutorMaxPoolSize(), 60L, @@ -167,6 +171,31 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), new NamedThreadFactory("DisconnectClientExecutor", true))); + pushTaskCheckAsyncHashedWheelTimer = new AsyncHashedWheelTimer(new NamedThreadFactory("PushTaskConfirmCheck-executor", true), + sessionServerConfig.getPushTaskConfirmCheckWheelTicksDuration(), TimeUnit.MILLISECONDS, + sessionServerConfig.getPushTaskConfirmCheckWheelTicksSize(), + sessionServerConfig.getPushTaskConfirmCheckExecutorThreadSize(), + sessionServerConfig.getPushTaskConfirmCheckExecutorQueueSize(), new ThreadFactoryBuilder() + .setNameFormat("PushTaskConfirmCheck-executor-%d").build(), + new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + LOGGER.error("executionRejected: " + e.getMessage(), e); + } + + @Override + public void executionFailed(Throwable e) { + LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); + publishDataExecutor = reportExecutors + .computeIfAbsent(PUBLISH_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(PUBLISH_DATA_EXECUTOR, + sessionServerConfig.getPublishDataExecutorMinPoolSize(), + sessionServerConfig.getPublishDataExecutorMaxPoolSize(), + sessionServerConfig.getPublishDataExecutorKeepAliveTime(), + TimeUnit.SECONDS, + new ArrayBlockingQueue<>(sessionServerConfig.getPublishDataExecutorQueueSize()), + new NamedThreadFactory("PublishData-executor", true))); } public void startScheduler() { @@ -254,13 +283,13 @@ public void stopScheduler() { dataChangeRequestExecutor.shutdown(); } - if (pushTaskClosureExecutor != null && !pushTaskClosureExecutor.isShutdown()) { - pushTaskClosureExecutor.shutdown(); - } - if (connectClientExecutor != null && !connectClientExecutor.isShutdown()) { connectClientExecutor.shutdown(); } + + if (publishDataExecutor != null && !publishDataExecutor.isShutdown()) { + publishDataExecutor.shutdown(); + } } public Map getReportExecutors() { @@ -283,12 +312,15 @@ public ThreadPoolExecutor getDataChangeRequestExecutor() { return dataChangeRequestExecutor; } - public ExecutorService getPushTaskClosureExecutor() { - return pushTaskClosureExecutor; - } - public ThreadPoolExecutor getConnectClientExecutor() { return connectClientExecutor; } + public AsyncHashedWheelTimer getPushTaskCheckAsyncHashedWheelTimer() { + return pushTaskCheckAsyncHashedWheelTimer; + } + + public ThreadPoolExecutor getPublishDataExecutor() { + return publishDataExecutor; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index 0a31df7ce..6052833b0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -151,7 +151,7 @@ public void execute() { } public PushTaskClosure getTaskClosure(Map datumMap) { - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskClosureExecutor()); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,fetchDataInfoId); pushTaskClosure.setTaskClosure((status, task) -> { if (status == ProcessingResult.Success) { if (sessionServerConfig.isStopPushSwitch()) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index a38068bf7..566ebb841 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -50,6 +41,15 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.DatumVersionUtil; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + /** * * @author shangyu.wh @@ -117,12 +117,14 @@ public void execute() { Collection subscribersSend = subscribersVersionCheck(subscriberMap .values()); if (subscribersSend.isEmpty()) { - LOGGER - .warn( - "Subscribers to send empty,which dataInfoId:{} on dataCenter:{},scope:{},address:{},size:{}", - dataChangeRequest.getDataInfoId(), - dataChangeRequest.getDataCenter(), scopeEnum, - entry.getKey(), subscriberMap.size()); + if (LOGGER.isDebugEnabled()) { + LOGGER + .debug( + "Subscribers to send empty,which dataInfoId:{} on dataCenter:{},scope:{},address:{},size:{}", + dataChangeRequest.getDataInfoId(), + dataChangeRequest.getDataCenter(), scopeEnum, + entry.getKey(), subscriberMap.size()); + } continue; } @@ -195,7 +197,7 @@ private Collection subscribersVersionCheck(Collection su public PushTaskClosure getTaskClosure() { //this for all this dataInfoId push result get and call back to change version - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskClosureExecutor()); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,dataChangeRequest.getDataInfoId()); pushTaskClosure.setTaskClosure((status, task) -> { String dataCenter = dataChangeRequest.getDataCenter(); String dataInfoId = dataChangeRequest.getDataInfoId(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java index 68a7a4b45..a2683dcda 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java @@ -18,16 +18,15 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import java.util.Set; -import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** @@ -37,31 +36,37 @@ */ public class PushTaskClosure implements TaskClosure { - private final static Logger LOGGER = LoggerFactory - .getLogger(PushTaskClosure.class); + private final static Logger LOGGER = LoggerFactory + .getLogger(PushTaskClosure.class); - private Set tasks = ConcurrentHashMap - .newKeySet(); + private Set tasks = ConcurrentHashMap + .newKeySet(); - private ConcurrentHashMap taskResultMap = new ConcurrentHashMap<>(); + private ConcurrentHashMap taskResultMap = new ConcurrentHashMap<>(); private TaskClosure taskClosure; - private final BlockingQueue completionQueue = new LinkedBlockingQueue<>(); + private final AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer; - private final ExecutorService pushTaskClosureExecutor; + private final SessionServerConfig sessionServerConfig; - public PushTaskClosure(ExecutorService pushTaskClosureExecutor) { - this.pushTaskClosureExecutor = pushTaskClosureExecutor; + private final String dataInfoId; + + public PushTaskClosure(AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer, + SessionServerConfig sessionServerConfig, String dataInfoId) { + this.pushTaskCheckAsyncHashedWheelTimer = pushTaskCheckAsyncHashedWheelTimer; + this.sessionServerConfig = sessionServerConfig; + this.dataInfoId = dataInfoId; } @Override public void run(ProcessingResult processingResult, Task task) { if (task != null) { - ProcessingResult existed = taskResultMap - .putIfAbsent(task.getTaskId(), processingResult); - if (existed == null) { - completionQueue.add(task.getTaskId()); + ProcessingResult result = taskResultMap.putIfAbsent(task.getTaskId(), processingResult); + if (result == null) { + if (processingResult == ProcessingResult.Success) { + tasks.remove(task.getTaskId()); + } } } } @@ -71,36 +76,24 @@ public void addTask(TaskEvent taskEvent) { } public void start() { - pushTaskClosureExecutor.execute(() -> { - try { - int size = tasks.size(); - LOGGER.info("Push task queue size {},all task size {}", completionQueue.size(), size); - for (int i = 0; i < size; i++) { - String taskId = completionQueue.poll(6000, TimeUnit.MILLISECONDS); - if(taskId != null) { - ProcessingResult result = taskResultMap.get(taskId); - if (result == ProcessingResult.Success) { - tasks.remove(taskId); - } - } - } - } catch (InterruptedException e) { - LOGGER.error("Push task check InterruptedException!", e); - } + int size = tasks.size(); + LOGGER.info("Push task confirm,dataInfoId={},all task size={}", dataInfoId, size); + + pushTaskCheckAsyncHashedWheelTimer.newTimeout(timeout -> { if (tasks.isEmpty()) { - LOGGER.info("Push all tasks success"); + LOGGER.info("Push all tasks success,dataInfoId={}",dataInfoId); if (taskClosure != null) { taskClosure.run(ProcessingResult.Success, null); } - } else { - LOGGER.warn("Push tasks found error tasks {} !", tasks.size()); + LOGGER.warn("Push tasks found error tasks {},dataInfoId={}!", tasks.size(),dataInfoId); if (taskClosure != null) { taskClosure.run(ProcessingResult.PermanentError, null); } } - }); + + },sessionServerConfig.getPushTaskConfirmWaitTimeout(),TimeUnit.MILLISECONDS); } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index e7eb16b09..4539fed32 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -16,15 +16,9 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - import com.alipay.sofa.registry.common.model.PushDataRetryRequest; -import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.core.model.DataBox; import com.alipay.sofa.registry.core.model.ReceivedData; @@ -37,13 +31,19 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.ClientNodeService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; +import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; -import com.alipay.sofa.registry.server.session.store.Interests; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; /** * @@ -87,54 +87,62 @@ public ReceivedDataMultiPushTask(SessionServerConfig sessionServerConfig, @Override public void execute() { - - if (sessionServerConfig.isStopPushSwitch()) { - LOGGER - .info( - "Stop Push ReceivedData with switch on! dataId: {},group: {},Instance: {}, url: {}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), url); - return; - } - - Object receivedDataPush = receivedDataMultiPushTaskStrategy.convert2PushData(receivedData, - url); - - CallbackHandler callbackHandler = new CallbackHandler() { - @Override - public void onCallback(Channel channel, Object message) { + Object receivedDataPush = null; + try { + if (sessionServerConfig.isStopPushSwitch()) { LOGGER .info( - "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + "Stop Push ReceivedData with switch on! dataId: {},group: {},Instance: {}, url: {}", receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush); - - if (taskClosure != null) { - confirmCallBack(true); - } + receivedData.getInstanceId(), url); + return; } - @Override - public void onException(Channel channel, Throwable exception) { - LOGGER - .error( - "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush, - exception); + receivedDataPush = receivedDataMultiPushTaskStrategy + .convert2PushData(receivedData, url); + + final Object finalReceivedDataPush = receivedDataPush; + CallbackHandler callbackHandler = new CallbackHandler() { + @Override + public void onCallback(Channel channel, Object message) { + + if (taskClosure != null) { + confirmCallBack(true); + } + LOGGER + .info( + "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush); + } - if (taskClosure != null) { - confirmCallBack(false); - throw new RuntimeException("Push ReceivedData got exception from callback!"); - } else { - retrySendReceiveData(new PushDataRetryRequest(receivedDataPush, url)); + @Override + public void onException(Channel channel, Throwable exception) { + try { + LOGGER + .error( + "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, + dataPush, exception); + + if (taskClosure != null) { + throw new RuntimeException( + "Push ReceivedData got exception from callback!"); + } else { + retrySendReceiveData(new PushDataRetryRequest(finalReceivedDataPush, + url)); + } + } finally { + if (taskClosure != null) { + confirmCallBack(false); + } + } } - } - }; + }; - try { clientNodeService.pushWithCallback(receivedDataPush, url, callbackHandler); - } catch (Exception e) { + } catch (Throwable e) { if (taskClosure != null) { confirmCallBack(false); throw e; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java new file mode 100644 index 000000000..4c6c136a4 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import com.alipay.sofa.registry.common.model.store.BaseInfo; +import com.alipay.sofa.registry.common.model.store.StoreData; +import com.alipay.sofa.registry.server.session.limit.AccessLimitService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitWrapperInterceptor.java, v 0.1 2019-08-26 20:29 shangyu.wh Exp $ + */ +public class AccessLimitWrapperInterceptor implements WrapperInterceptor { + + @Autowired + private AccessLimitService accessLimitService; + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) + throws Exception { + + BaseInfo baseInfo = (BaseInfo) invocation.getParameterSupplier().get(); + + if (!accessLimitService.tryAcquire()) { + throw new RuntimeException(String.format( + "Register access limit for session server!dataInfoId=%s,connectId=%s", + baseInfo.getDataInfoId(), baseInfo.getSourceAddress())); + } + + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 0; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java index fd334641f..20e076fd2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java @@ -70,7 +70,7 @@ public Boolean invokeCodeWrapper(WrapperInvocation invocatio @Override public int getOrder() { - return 100; + return 200; } private void fireSubscriberPushEmptyTask(Subscriber subscriber) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java index ee0c007c6..d3d80ec8c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java @@ -58,6 +58,6 @@ public Boolean invokeCodeWrapper(WrapperInvocation invocatio @Override public int getOrder() { - return 0; + return 100; } } \ No newline at end of file From 7309bd7691c24ab21331776ef113b14e591ce4cb Mon Sep 17 00:00:00 2001 From: Synex-wh <241809311@qq.com> Date: Thu, 29 Aug 2019 15:52:18 +0800 Subject: [PATCH 104/161] fix push confirm error,and fix datum update version,pub threadpool config,add accesslimit service (#45) --- .../server/data/change/DataChangeHandler.java | 36 ++- .../LocalDataServerChangeEventHandler.java | 3 +- .../handler/NotifyDataSyncHandler.java | 19 +- .../server/meta/store/MetaStoreService.java | 35 ++- .../bootstrap/SessionServerConfig.java | 20 ++ .../bootstrap/SessionServerConfigBean.java | 208 +++++++++++++++++- .../bootstrap/SessionServerConfiguration.java | 19 ++ .../session/limit/AccessLimitService.java | 26 +++ .../session/limit/AccessLimitServiceImpl.java | 42 ++++ .../listener/PublishDataTaskListener.java | 27 +-- .../session/scheduler/ExecutorManager.java | 84 ++++--- .../task/DataChangeFetchCloudTask.java | 2 +- .../scheduler/task/DataChangeFetchTask.java | 34 +-- .../scheduler/task/PushTaskClosure.java | 65 +++--- .../task/ReceivedDataMultiPushTask.java | 102 +++++---- .../AccessLimitWrapperInterceptor.java | 53 +++++ .../wrapper/BlacklistWrapperInterceptor.java | 2 +- .../ClientCheckWrapperInterceptor.java | 2 +- 18 files changed, 587 insertions(+), 192 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java index a4fac3ca8..665095b0d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/DataChangeHandler.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.data.change; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executor; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; @@ -36,6 +27,13 @@ import com.alipay.sofa.registry.server.data.change.event.DataChangeEventQueue; import com.alipay.sofa.registry.server.data.change.notify.IDataChangeNotifier; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executor; /** * notify sessionserver when data changed @@ -112,16 +110,34 @@ public void run() { String dataInfoId = snapshotData.getDataInfoId(); Map toBeDeletedPubMap = snapshotData.getToBeDeletedPubMap(); Map snapshotPubMap = snapshotData.getSnapshotPubMap(); + Datum oldDatum = datumCache.get(dataServerConfig.getLocalDataCenter(), dataInfoId); + long lastVersion = oldDatum != null ? oldDatum.getVersion() : 0l; Datum datum = datumCache.putSnapshot(dataInfoId, toBeDeletedPubMap, snapshotPubMap); + long version = datum != null ? datum.getVersion() : 0l; + LOGGER + .info( + "[DataChangeHandler][{}] snapshot handle,dataInfoId={}, version={}, lastVersion={}", + name, dataInfoId, version, lastVersion); notify(datum, changeData.getSourceType(), null); } else { Datum datum = changeData.getDatum(); + String dataCenter = datum.getDataCenter(); String dataInfoId = datum.getDataInfoId(); - long version = datum.getVersion(); DataSourceTypeEnum sourceType = changeData.getSourceType(); DataChangeTypeEnum changeType = changeData.getChangeType(); + + if (changeType == DataChangeTypeEnum.MERGE + && sourceType != DataSourceTypeEnum.BACKUP + && sourceType != DataSourceTypeEnum.SYNC) { + //update version for pub or unPub merge to cache + //if the version product before merge to cache,it may be cause small version override big one + datum.updateVersion(); + } + + long version = datum.getVersion(); + try { if (sourceType == DataSourceTypeEnum.CLEAN) { if (datumCache.cleanDatum(dataCenter, dataInfoId)) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java index e7b1061be..d303d192e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/event/handler/LocalDataServerChangeEventHandler.java @@ -49,7 +49,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -134,7 +133,7 @@ public void run() { try { LocalDataServerChangeEvent event = events.take(); //if the new joined servers contains self, set status as INITIAL - Set newJoined = event.getNewJoined(); + //Set newJoined = event.getNewJoined(); //if (newJoined.contains(DataServerConfig.IP) // && dataNodeStatus.getStatus() != LocalServerStatusEnum.INITIAL) { // dataNodeStatus.setStatus(LocalServerStatusEnum.INITIAL); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java index c1dd0cead..afdf1f191 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyDataSyncHandler.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node; @@ -48,6 +39,14 @@ import com.alipay.sofa.registry.server.data.util.ThreadPoolExecutorDataServer; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @@ -116,7 +115,7 @@ private void executorRequest(Connection connection, NotifyDataSyncRequest reques new SyncDataRequest(dataInfoId, dataCenter, version, request.getDataSourceType()), dataChangeEventCenter)); } else { - LOGGER.info("[NotifyDataSyncHandler] not need to sync data, version={}", version); + LOGGER.info("[NotifyDataSyncHandler] not need to sync data, currentVersion={},request={}", version,request); } }); } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java index 69a60bd76..a57b53b31 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/MetaStoreService.java @@ -16,20 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.store; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import javax.ws.rs.NotSupportedException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.GetChangeListRequest; @@ -45,6 +31,18 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.ws.rs.NotSupportedException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -337,9 +335,8 @@ private void firePushDataListTask(NodeChangeResult nodeChangeResult, String node taskEvent.setAttribute(Constant.PUSH_TARGET_TYPE, NodeType.DATA); taskEvent.setAttribute(Constant.PUSH_TARGET_OPERATOR_TYPE, nodeOperate); - LOGGER.info("send " + taskEvent.getTaskType() + " NodeType:" + NodeType.DATA + " Operator:" - + nodeOperate); - + LOGGER.info("send {} NodeType:{} Operator:{}", taskEvent.getTaskType(), NodeType.DATA, + nodeOperate); taskListenerManager.sendTaskEvent(taskEvent); } @@ -349,8 +346,8 @@ private void firePushSessionListTask(NodeChangeResult nodeChangeResult, String n TaskEvent taskEvent = new TaskEvent(nodeChangeResult, TaskType.DATA_NODE_CHANGE_PUSH_TASK); taskEvent.setAttribute(Constant.PUSH_TARGET_TYPE, NodeType.SESSION); taskEvent.setAttribute(Constant.PUSH_TARGET_OPERATOR_TYPE, nodeOperate); - LOGGER.info("send " + taskEvent.getTaskType() + " NodeType:" + NodeType.SESSION - + " Operator:" + nodeOperate); + LOGGER.info("send {} NodeType:{} Operator:{}", taskEvent.getTaskType(), NodeType.SESSION, + nodeOperate); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index 10fc1be54..d0c5277a4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -194,4 +194,24 @@ public interface SessionServerConfig { int getRenewDatumWheelThreadSize(); int getRenewDatumWheelQueueSize(); + + long getPushTaskConfirmWaitTimeout(); + + int getPushTaskConfirmCheckWheelTicksSize(); + + int getPushTaskConfirmCheckWheelTicksDuration(); + + int getPushTaskConfirmCheckExecutorQueueSize(); + + int getPushTaskConfirmCheckExecutorThreadSize(); + + int getPublishDataExecutorMinPoolSize(); + + int getPublishDataExecutorMaxPoolSize(); + + int getPublishDataExecutorQueueSize(); + + long getPublishDataExecutorKeepAliveTime(); + + double getAccessLimitRate(); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index aa51716e8..aba075070 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -16,14 +16,14 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Pattern; - import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + /** * The type Session server config bean. * @author shangyu.wh @@ -187,6 +187,26 @@ public class SessionServerConfigBean implements SessionServerConfig { private long pushDataTaskRetryIncrementDelay = 500; + private long pushTaskConfirmWaitTimeout = 10000; + + private int pushTaskConfirmCheckWheelTicksSize = 1024; + + private int pushTaskConfirmCheckWheelTicksDuration = 100; + + private int pushTaskConfirmCheckExecutorQueueSize = 10000; + + private int pushTaskConfirmCheckExecutorThreadSize = 10; + + private int publishDataExecutorMinPoolSize = 100; + + private int publishDataExecutorMaxPoolSize = 400; + + private int publishDataExecutorQueueSize = 10000; + + private long publishDataExecutorKeepAliveTime = 60; + + private double accessLimitRate = 100000.0; + private String sessionServerRegion; private String sessionServerDataCenter; @@ -1829,6 +1849,186 @@ public void setBlacklistSubDataIdRegex(String blacklistSubDataIdRegex) { this.blacklistSubDataIdRegex = blacklistSubDataIdRegex; } + /** + * Getter method for property pushTaskConfirmWaitTimeout. + * + * @return property value of pushTaskConfirmWaitTimeout + */ + public long getPushTaskConfirmWaitTimeout() { + return pushTaskConfirmWaitTimeout; + } + + /** + * Setter method for property pushTaskConfirmWaitTimeout. + * + * @param pushTaskConfirmWaitTimeout value to be assigned to property pushTaskConfirmWaitTimeout + */ + public void setPushTaskConfirmWaitTimeout(long pushTaskConfirmWaitTimeout) { + this.pushTaskConfirmWaitTimeout = pushTaskConfirmWaitTimeout; + } + + /** + * Getter method for property pushTaskConfirmCheckWheelTicksSize. + * + * @return property value of pushTaskConfirmCheckWheelTicksSize + */ + public int getPushTaskConfirmCheckWheelTicksSize() { + return pushTaskConfirmCheckWheelTicksSize; + } + + /** + * Getter method for property pushTaskConfirmCheckWheelTicksDuration. + * + * @return property value of pushTaskConfirmCheckWheelTicksDuration + */ + public int getPushTaskConfirmCheckWheelTicksDuration() { + return pushTaskConfirmCheckWheelTicksDuration; + } + + /** + * Getter method for property pushTaskConfirmCheckExecutorQueueSize. + * + * @return property value of pushTaskConfirmCheckExecutorQueueSize + */ + public int getPushTaskConfirmCheckExecutorQueueSize() { + return pushTaskConfirmCheckExecutorQueueSize; + } + + /** + * Getter method for property pushTaskConfirmCheckExecutorThreadSize. + * + * @return property value of pushTaskConfirmCheckExecutorThreadSize + */ + public int getPushTaskConfirmCheckExecutorThreadSize() { + return pushTaskConfirmCheckExecutorThreadSize; + } + + /** + * Setter method for property pushTaskConfirmCheckWheelTicksSize. + * + * @param pushTaskConfirmCheckWheelTicksSize value to be assigned to property pushTaskConfirmCheckWheelTicksSize + */ + public void setPushTaskConfirmCheckWheelTicksSize(int pushTaskConfirmCheckWheelTicksSize) { + this.pushTaskConfirmCheckWheelTicksSize = pushTaskConfirmCheckWheelTicksSize; + } + + /** + * Setter method for property pushTaskConfirmCheckWheelTicksDuration. + * + * @param pushTaskConfirmCheckWheelTicksDuration value to be assigned to property pushTaskConfirmCheckWheelTicksDuration + */ + public void setPushTaskConfirmCheckWheelTicksDuration(int pushTaskConfirmCheckWheelTicksDuration) { + this.pushTaskConfirmCheckWheelTicksDuration = pushTaskConfirmCheckWheelTicksDuration; + } + + /** + * Setter method for property pushTaskConfirmCheckExecutorQueueSize. + * + * @param pushTaskConfirmCheckExecutorQueueSize value to be assigned to property pushTaskConfirmCheckExecutorQueueSize + */ + public void setPushTaskConfirmCheckExecutorQueueSize(int pushTaskConfirmCheckExecutorQueueSize) { + this.pushTaskConfirmCheckExecutorQueueSize = pushTaskConfirmCheckExecutorQueueSize; + } + + /** + * Setter method for property pushTaskConfirmCheckExecutorThreadSize. + * + * @param pushTaskConfirmCheckExecutorThreadSize value to be assigned to property pushTaskConfirmCheckExecutorThreadSize + */ + public void setPushTaskConfirmCheckExecutorThreadSize(int pushTaskConfirmCheckExecutorThreadSize) { + this.pushTaskConfirmCheckExecutorThreadSize = pushTaskConfirmCheckExecutorThreadSize; + } + + /** + * Getter method for property publishDataExecutorMinPoolSize. + * + * @return property value of publishDataExecutorMinPoolSize + */ + public int getPublishDataExecutorMinPoolSize() { + return publishDataExecutorMinPoolSize; + } + + /** + * Getter method for property publishDataExecutorMaxPoolSize. + * + * @return property value of publishDataExecutorMaxPoolSize + */ + public int getPublishDataExecutorMaxPoolSize() { + return publishDataExecutorMaxPoolSize; + } + + /** + * Getter method for property publishDataExecutorQueueSize. + * + * @return property value of publishDataExecutorQueueSize + */ + public int getPublishDataExecutorQueueSize() { + return publishDataExecutorQueueSize; + } + + /** + * Getter method for property publishDataExecutorKeepAliveTime. + * + * @return property value of publishDataExecutorKeepAliveTime + */ + public long getPublishDataExecutorKeepAliveTime() { + return publishDataExecutorKeepAliveTime; + } + + /** + * Setter method for property publishDataExecutorMinPoolSize. + * + * @param publishDataExecutorMinPoolSize value to be assigned to property publishDataExecutorMinPoolSize + */ + public void setPublishDataExecutorMinPoolSize(int publishDataExecutorMinPoolSize) { + this.publishDataExecutorMinPoolSize = publishDataExecutorMinPoolSize; + } + + /** + * Setter method for property publishDataExecutorMaxPoolSize. + * + * @param publishDataExecutorMaxPoolSize value to be assigned to property publishDataExecutorMaxPoolSize + */ + public void setPublishDataExecutorMaxPoolSize(int publishDataExecutorMaxPoolSize) { + this.publishDataExecutorMaxPoolSize = publishDataExecutorMaxPoolSize; + } + + /** + * Setter method for property publishDataExecutorQueueSize. + * + * @param publishDataExecutorQueueSize value to be assigned to property publishDataExecutorQueueSize + */ + public void setPublishDataExecutorQueueSize(int publishDataExecutorQueueSize) { + this.publishDataExecutorQueueSize = publishDataExecutorQueueSize; + } + + /** + * Setter method for property publishDataExecutorKeepAliveTime. + * + * @param publishDataExecutorKeepAliveTime value to be assigned to property publishDataExecutorKeepAliveTime + */ + public void setPublishDataExecutorKeepAliveTime(long publishDataExecutorKeepAliveTime) { + this.publishDataExecutorKeepAliveTime = publishDataExecutorKeepAliveTime; + } + + /** + * Getter method for property accessLimitRate. + * + * @return property value of accessLimitRate + */ + public double getAccessLimitRate() { + return accessLimitRate; + } + + /** + * Setter method for property accessLimitRate. + * + * @param accessLimitRate value to be assigned to property accessLimitRate + */ + public void setAccessLimitRate(double accessLimitRate) { + this.accessLimitRate = accessLimitRate; + } + @Override public boolean isInvalidForeverZone(String zoneId) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 88cce9827..1faa2628c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -34,6 +34,8 @@ import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistMatchProcessFilter; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultDataIdMatchStrategy; import com.alipay.sofa.registry.server.session.filter.blacklist.DefaultIPMatchStrategy; +import com.alipay.sofa.registry.server.session.limit.AccessLimitService; +import com.alipay.sofa.registry.server.session.limit.AccessLimitServiceImpl; import com.alipay.sofa.registry.server.session.listener.CancelDataTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchCloudTaskListener; import com.alipay.sofa.registry.server.session.listener.DataChangeFetchTaskListener; @@ -121,6 +123,7 @@ import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSubscriberRegisterFetchTaskStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultSyncConfigHandlerStrategy; import com.alipay.sofa.registry.server.session.strategy.impl.DefaultWatcherHandlerStrategy; +import com.alipay.sofa.registry.server.session.wrapper.AccessLimitWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.BlacklistWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.ClientCheckWrapperInterceptor; import com.alipay.sofa.registry.server.session.wrapper.WrapperInterceptor; @@ -662,6 +665,14 @@ public ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy() { } } + @Configuration + public static class AccessLimitServiceConfiguration { + @Bean + public AccessLimitService accessLimitService(SessionServerConfig sessionServerConfig) { + return new AccessLimitServiceImpl(sessionServerConfig); + } + } + @Configuration public static class SessionFilterConfiguration { @@ -704,6 +715,14 @@ public WrapperInterceptor blacklistWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager.addInterceptor(blacklistWrapperInterceptor); return blacklistWrapperInterceptor; } + + @Bean + public WrapperInterceptor accessLimitWrapperInterceptor(WrapperInterceptorManager wrapperInterceptorManager) { + AccessLimitWrapperInterceptor accessLimitWrapperInterceptor = new AccessLimitWrapperInterceptor(); + wrapperInterceptorManager.addInterceptor(accessLimitWrapperInterceptor); + return accessLimitWrapperInterceptor; + } + } @Configuration diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java new file mode 100644 index 000000000..7ac67b0f2 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitService.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.limit; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitService.java, v 0.1 2019-08-26 20:35 shangyu.wh Exp $ + */ +public interface AccessLimitService { + boolean tryAcquire(); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java new file mode 100644 index 000000000..fef1c6a8f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/limit/AccessLimitServiceImpl.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.limit; + +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.google.common.util.concurrent.RateLimiter; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitServiceImpl.java, v 0.1 2019-08-26 20:37 shangyu.wh Exp $ + */ +public class AccessLimitServiceImpl implements AccessLimitService { + + private SessionServerConfig sessionServerConfig; + + private RateLimiter rateLimiter; + + public AccessLimitServiceImpl(SessionServerConfig sessionServerConfig) { + this.sessionServerConfig = sessionServerConfig; + rateLimiter = RateLimiter.create(sessionServerConfig.getAccessLimitRate()); + } + + @Override + public boolean tryAcquire() { + return rateLimiter.tryAcquire(); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java index a8f57e491..e2d0f7ef8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java @@ -16,19 +16,15 @@ */ package com.alipay.sofa.registry.server.session.listener; -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.server.session.node.service.DataNodeService; +import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; -import com.alipay.sofa.registry.task.batcher.TaskDispatcher; -import com.alipay.sofa.registry.task.batcher.TaskDispatchers; import com.alipay.sofa.registry.task.batcher.TaskProcessor; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -38,19 +34,13 @@ public class PublishDataTaskListener implements TaskListener { @Autowired - private DataNodeService dataNodeService; - - private TaskDispatcher singleTaskDispatcher; + private DataNodeService dataNodeService; @Autowired - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; - @PostConstruct - public void init() { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.PUBLISH_DATA_TASK.getName()), 100000, 32, - 1000, 1000, dataNodeSingleTaskProcessor); - } + @Autowired + private ExecutorManager executorManager; @Override public boolean support(TaskEvent event) { @@ -59,12 +49,11 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { + SessionTask publishDataTask = new PublishDataTask(dataNodeService); publishDataTask.setTaskEvent(event); - singleTaskDispatcher.dispatch(publishDataTask.getTaskId(), publishDataTask, - publishDataTask.getExpiryTime()); + executorManager.getPublishDataExecutor().execute(()-> dataNodeSingleTaskProcessor.process(publishDataTask)); } - } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index a5da49b80..13ab127a1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -16,6 +16,20 @@ */ package com.alipay.sofa.registry.server.session.scheduler; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.metrics.TaskMetrics; +import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.node.NodeManager; +import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; +import com.alipay.sofa.registry.util.NamedThreadFactory; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + import java.util.HashMap; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; @@ -27,16 +41,6 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import org.springframework.beans.factory.annotation.Autowired; - -import com.alipay.sofa.registry.metrics.TaskMetrics; -import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.node.NodeManager; -import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.task.scheduler.TimedSupervisorTask; -import com.alipay.sofa.registry.util.NamedThreadFactory; - /** * * @author shangyu.wh @@ -44,6 +48,9 @@ */ public class ExecutorManager { + private static final Logger LOGGER = LoggerFactory + .getLogger(ExecutorManager.class); + private final ScheduledExecutorService scheduler; private final ThreadPoolExecutor fetchDataExecutor; @@ -54,11 +61,13 @@ public class ExecutorManager { private final ThreadPoolExecutor connectDataExecutor; private final ExecutorService checkPushExecutor; - private final ExecutorService pushTaskClosureExecutor; private final ThreadPoolExecutor accessDataExecutor; private final ThreadPoolExecutor dataChangeRequestExecutor; private final ThreadPoolExecutor pushTaskExecutor; private final ThreadPoolExecutor connectClientExecutor; + private final ThreadPoolExecutor publishDataExecutor; + + private final AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer; private SessionServerConfig sessionServerConfig; @@ -94,6 +103,8 @@ public class ExecutorManager { private static final String CONNECT_CLIENT_EXECUTOR = "ConnectClientExecutor"; + private static final String PUBLISH_DATA_EXECUTOR = "PublishDataExecutor"; + public ExecutorManager(SessionServerConfig sessionServerConfig) { this.sessionServerConfig = sessionServerConfig; @@ -153,13 +164,6 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(100000), new NamedThreadFactory("UserDataElementPushCheck-executor", true))); - pushTaskClosureExecutor = reportExecutors - .computeIfAbsent(PUSH_TASK_CLOSURE_CHECK_EXECUTOR, k -> new SessionThreadPoolExecutor( - PUSH_TASK_CLOSURE_CHECK_EXECUTOR, 80, 400, 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(10000), - new NamedThreadFactory("PushTaskClosureCheck", true))); - connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( CONNECT_CLIENT_EXECUTOR, sessionServerConfig.getConnectClientExecutorMinPoolSize(), sessionServerConfig.getConnectClientExecutorMaxPoolSize(), 60L, @@ -167,6 +171,31 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), new NamedThreadFactory("DisconnectClientExecutor", true))); + pushTaskCheckAsyncHashedWheelTimer = new AsyncHashedWheelTimer(new NamedThreadFactory("PushTaskConfirmCheck-executor", true), + sessionServerConfig.getPushTaskConfirmCheckWheelTicksDuration(), TimeUnit.MILLISECONDS, + sessionServerConfig.getPushTaskConfirmCheckWheelTicksSize(), + sessionServerConfig.getPushTaskConfirmCheckExecutorThreadSize(), + sessionServerConfig.getPushTaskConfirmCheckExecutorQueueSize(), new ThreadFactoryBuilder() + .setNameFormat("PushTaskConfirmCheck-executor-%d").build(), + new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + LOGGER.error("executionRejected: " + e.getMessage(), e); + } + + @Override + public void executionFailed(Throwable e) { + LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); + publishDataExecutor = reportExecutors + .computeIfAbsent(PUBLISH_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(PUBLISH_DATA_EXECUTOR, + sessionServerConfig.getPublishDataExecutorMinPoolSize(), + sessionServerConfig.getPublishDataExecutorMaxPoolSize(), + sessionServerConfig.getPublishDataExecutorKeepAliveTime(), + TimeUnit.SECONDS, + new ArrayBlockingQueue<>(sessionServerConfig.getPublishDataExecutorQueueSize()), + new NamedThreadFactory("PublishData-executor", true))); } public void startScheduler() { @@ -254,13 +283,13 @@ public void stopScheduler() { dataChangeRequestExecutor.shutdown(); } - if (pushTaskClosureExecutor != null && !pushTaskClosureExecutor.isShutdown()) { - pushTaskClosureExecutor.shutdown(); - } - if (connectClientExecutor != null && !connectClientExecutor.isShutdown()) { connectClientExecutor.shutdown(); } + + if (publishDataExecutor != null && !publishDataExecutor.isShutdown()) { + publishDataExecutor.shutdown(); + } } public Map getReportExecutors() { @@ -283,12 +312,15 @@ public ThreadPoolExecutor getDataChangeRequestExecutor() { return dataChangeRequestExecutor; } - public ExecutorService getPushTaskClosureExecutor() { - return pushTaskClosureExecutor; - } - public ThreadPoolExecutor getConnectClientExecutor() { return connectClientExecutor; } + public AsyncHashedWheelTimer getPushTaskCheckAsyncHashedWheelTimer() { + return pushTaskCheckAsyncHashedWheelTimer; + } + + public ThreadPoolExecutor getPublishDataExecutor() { + return publishDataExecutor; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index 0a31df7ce..6052833b0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -151,7 +151,7 @@ public void execute() { } public PushTaskClosure getTaskClosure(Map datumMap) { - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskClosureExecutor()); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,fetchDataInfoId); pushTaskClosure.setTaskClosure((status, task) -> { if (status == ProcessingResult.Success) { if (sessionServerConfig.isStopPushSwitch()) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index a38068bf7..566ebb841 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -50,6 +41,15 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.DatumVersionUtil; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + /** * * @author shangyu.wh @@ -117,12 +117,14 @@ public void execute() { Collection subscribersSend = subscribersVersionCheck(subscriberMap .values()); if (subscribersSend.isEmpty()) { - LOGGER - .warn( - "Subscribers to send empty,which dataInfoId:{} on dataCenter:{},scope:{},address:{},size:{}", - dataChangeRequest.getDataInfoId(), - dataChangeRequest.getDataCenter(), scopeEnum, - entry.getKey(), subscriberMap.size()); + if (LOGGER.isDebugEnabled()) { + LOGGER + .debug( + "Subscribers to send empty,which dataInfoId:{} on dataCenter:{},scope:{},address:{},size:{}", + dataChangeRequest.getDataInfoId(), + dataChangeRequest.getDataCenter(), scopeEnum, + entry.getKey(), subscriberMap.size()); + } continue; } @@ -195,7 +197,7 @@ private Collection subscribersVersionCheck(Collection su public PushTaskClosure getTaskClosure() { //this for all this dataInfoId push result get and call back to change version - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskClosureExecutor()); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,dataChangeRequest.getDataInfoId()); pushTaskClosure.setTaskClosure((status, task) -> { String dataCenter = dataChangeRequest.getDataCenter(); String dataInfoId = dataChangeRequest.getDataInfoId(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java index 68a7a4b45..a2683dcda 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java @@ -18,16 +18,15 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import java.util.Set; -import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** @@ -37,31 +36,37 @@ */ public class PushTaskClosure implements TaskClosure { - private final static Logger LOGGER = LoggerFactory - .getLogger(PushTaskClosure.class); + private final static Logger LOGGER = LoggerFactory + .getLogger(PushTaskClosure.class); - private Set tasks = ConcurrentHashMap - .newKeySet(); + private Set tasks = ConcurrentHashMap + .newKeySet(); - private ConcurrentHashMap taskResultMap = new ConcurrentHashMap<>(); + private ConcurrentHashMap taskResultMap = new ConcurrentHashMap<>(); private TaskClosure taskClosure; - private final BlockingQueue completionQueue = new LinkedBlockingQueue<>(); + private final AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer; - private final ExecutorService pushTaskClosureExecutor; + private final SessionServerConfig sessionServerConfig; - public PushTaskClosure(ExecutorService pushTaskClosureExecutor) { - this.pushTaskClosureExecutor = pushTaskClosureExecutor; + private final String dataInfoId; + + public PushTaskClosure(AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer, + SessionServerConfig sessionServerConfig, String dataInfoId) { + this.pushTaskCheckAsyncHashedWheelTimer = pushTaskCheckAsyncHashedWheelTimer; + this.sessionServerConfig = sessionServerConfig; + this.dataInfoId = dataInfoId; } @Override public void run(ProcessingResult processingResult, Task task) { if (task != null) { - ProcessingResult existed = taskResultMap - .putIfAbsent(task.getTaskId(), processingResult); - if (existed == null) { - completionQueue.add(task.getTaskId()); + ProcessingResult result = taskResultMap.putIfAbsent(task.getTaskId(), processingResult); + if (result == null) { + if (processingResult == ProcessingResult.Success) { + tasks.remove(task.getTaskId()); + } } } } @@ -71,36 +76,24 @@ public void addTask(TaskEvent taskEvent) { } public void start() { - pushTaskClosureExecutor.execute(() -> { - try { - int size = tasks.size(); - LOGGER.info("Push task queue size {},all task size {}", completionQueue.size(), size); - for (int i = 0; i < size; i++) { - String taskId = completionQueue.poll(6000, TimeUnit.MILLISECONDS); - if(taskId != null) { - ProcessingResult result = taskResultMap.get(taskId); - if (result == ProcessingResult.Success) { - tasks.remove(taskId); - } - } - } - } catch (InterruptedException e) { - LOGGER.error("Push task check InterruptedException!", e); - } + int size = tasks.size(); + LOGGER.info("Push task confirm,dataInfoId={},all task size={}", dataInfoId, size); + + pushTaskCheckAsyncHashedWheelTimer.newTimeout(timeout -> { if (tasks.isEmpty()) { - LOGGER.info("Push all tasks success"); + LOGGER.info("Push all tasks success,dataInfoId={}",dataInfoId); if (taskClosure != null) { taskClosure.run(ProcessingResult.Success, null); } - } else { - LOGGER.warn("Push tasks found error tasks {} !", tasks.size()); + LOGGER.warn("Push tasks found error tasks {},dataInfoId={}!", tasks.size(),dataInfoId); if (taskClosure != null) { taskClosure.run(ProcessingResult.PermanentError, null); } } - }); + + },sessionServerConfig.getPushTaskConfirmWaitTimeout(),TimeUnit.MILLISECONDS); } /** diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index e7eb16b09..4539fed32 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -16,15 +16,9 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - import com.alipay.sofa.registry.common.model.PushDataRetryRequest; -import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.core.model.DataBox; import com.alipay.sofa.registry.core.model.ReceivedData; @@ -37,13 +31,19 @@ import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.ClientNodeService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; +import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; -import com.alipay.sofa.registry.server.session.store.Interests; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; /** * @@ -87,54 +87,62 @@ public ReceivedDataMultiPushTask(SessionServerConfig sessionServerConfig, @Override public void execute() { - - if (sessionServerConfig.isStopPushSwitch()) { - LOGGER - .info( - "Stop Push ReceivedData with switch on! dataId: {},group: {},Instance: {}, url: {}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), url); - return; - } - - Object receivedDataPush = receivedDataMultiPushTaskStrategy.convert2PushData(receivedData, - url); - - CallbackHandler callbackHandler = new CallbackHandler() { - @Override - public void onCallback(Channel channel, Object message) { + Object receivedDataPush = null; + try { + if (sessionServerConfig.isStopPushSwitch()) { LOGGER .info( - "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + "Stop Push ReceivedData with switch on! dataId: {},group: {},Instance: {}, url: {}", receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush); - - if (taskClosure != null) { - confirmCallBack(true); - } + receivedData.getInstanceId(), url); + return; } - @Override - public void onException(Channel channel, Throwable exception) { - LOGGER - .error( - "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", - receivedData.getDataId(), receivedData.getGroup(), - receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush, - exception); + receivedDataPush = receivedDataMultiPushTaskStrategy + .convert2PushData(receivedData, url); + + final Object finalReceivedDataPush = receivedDataPush; + CallbackHandler callbackHandler = new CallbackHandler() { + @Override + public void onCallback(Channel channel, Object message) { + + if (taskClosure != null) { + confirmCallBack(true); + } + LOGGER + .info( + "Push ReceivedData success! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, dataPush); + } - if (taskClosure != null) { - confirmCallBack(false); - throw new RuntimeException("Push ReceivedData got exception from callback!"); - } else { - retrySendReceiveData(new PushDataRetryRequest(receivedDataPush, url)); + @Override + public void onException(Channel channel, Throwable exception) { + try { + LOGGER + .error( + "Push ReceivedData error! dataId:{},group:{},Instance:{},version:{},url: {},dataPush:{}", + receivedData.getDataId(), receivedData.getGroup(), + receivedData.getInstanceId(), receivedData.getVersion(), url, + dataPush, exception); + + if (taskClosure != null) { + throw new RuntimeException( + "Push ReceivedData got exception from callback!"); + } else { + retrySendReceiveData(new PushDataRetryRequest(finalReceivedDataPush, + url)); + } + } finally { + if (taskClosure != null) { + confirmCallBack(false); + } + } } - } - }; + }; - try { clientNodeService.pushWithCallback(receivedDataPush, url, callbackHandler); - } catch (Exception e) { + } catch (Throwable e) { if (taskClosure != null) { confirmCallBack(false); throw e; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java new file mode 100644 index 000000000..4c6c136a4 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/AccessLimitWrapperInterceptor.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.wrapper; + +import com.alipay.sofa.registry.common.model.store.BaseInfo; +import com.alipay.sofa.registry.common.model.store.StoreData; +import com.alipay.sofa.registry.server.session.limit.AccessLimitService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author shangyu.wh + * @version 1.0: AccessLimitWrapperInterceptor.java, v 0.1 2019-08-26 20:29 shangyu.wh Exp $ + */ +public class AccessLimitWrapperInterceptor implements WrapperInterceptor { + + @Autowired + private AccessLimitService accessLimitService; + + @Override + public Boolean invokeCodeWrapper(WrapperInvocation invocation) + throws Exception { + + BaseInfo baseInfo = (BaseInfo) invocation.getParameterSupplier().get(); + + if (!accessLimitService.tryAcquire()) { + throw new RuntimeException(String.format( + "Register access limit for session server!dataInfoId=%s,connectId=%s", + baseInfo.getDataInfoId(), baseInfo.getSourceAddress())); + } + + return invocation.proceed(); + } + + @Override + public int getOrder() { + return 0; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java index fd334641f..20e076fd2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/BlacklistWrapperInterceptor.java @@ -70,7 +70,7 @@ public Boolean invokeCodeWrapper(WrapperInvocation invocatio @Override public int getOrder() { - return 100; + return 200; } private void fireSubscriberPushEmptyTask(Subscriber subscriber) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java index ee0c007c6..d3d80ec8c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/wrapper/ClientCheckWrapperInterceptor.java @@ -58,6 +58,6 @@ public Boolean invokeCodeWrapper(WrapperInvocation invocatio @Override public int getOrder() { - return 0; + return 100; } } \ No newline at end of file From 3065157daa80c95b1b6012d9a01b03397c29ed21 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Fri, 30 Aug 2019 13:53:11 +0800 Subject: [PATCH 105/161] add switch renew and expire --- .../model/constants/ValueConstants.java | 4 + .../metaserver/NotifyProvideDataChange.java | 23 ++++ .../data/bootstrap/DataServerBootstrap.java | 50 ++++++--- .../metaserver/DefaultMetaServiceImpl.java | 75 ++++++++++--- .../metaserver/IMetaServerService.java | 16 ++- .../NotifyProvideDataChangeHandler.java | 100 ++++++++++++++++++ .../bootstrap/MetaServerConfiguration.java | 22 ++-- .../server/meta/node/DataNodeService.java | 3 + .../meta/node/impl/DataNodeServiceImpl.java | 65 ++++++++++-- .../task/PersistenceDataChangeNotifyTask.java | 11 +- .../bootstrap/SessionServerBootstrap.java | 51 ++++++--- .../NotifyProvideDataChangeHandler.java | 4 +- .../task/ProvideDataChangeFetchTask.java | 15 +++ 13 files changed, 369 insertions(+), 70 deletions(-) create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java index f12fe930c..7b71d5251 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java @@ -58,6 +58,10 @@ public class ValueConstants { public static final String BLACK_LIST_DATA_ID = "session.blacklist.data#@#9600#@#CONFIG"; + public static final String ENABLE_DATA_RENEW_SNAPSHOT = "session.enable.datum.renew.switch#@#9600#@#CONFIG"; + + public static final String STOP_DATA_DATUM_EXPIRE = "data.stop.datum.expire.switch#@#9600#@#CONFIG"; + public static final String LOGGER_NAME_RENEW = "RENEW-LOGGER"; } diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/NotifyProvideDataChange.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/NotifyProvideDataChange.java index ad14df8f0..a72d16d12 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/NotifyProvideDataChange.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/metaserver/NotifyProvideDataChange.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.common.model.metaserver; +import com.alipay.sofa.registry.common.model.Node.NodeType; + import java.io.Serializable; /** @@ -31,6 +33,8 @@ public class NotifyProvideDataChange implements Serializable { private DataOperator dataOperator; + private NodeType nodeType = NodeType.SESSION; + /** * constructor * @param dataInfoId @@ -97,12 +101,31 @@ public void setDataOperator(DataOperator dataOperator) { this.dataOperator = dataOperator; } + /** + * Getter method for property nodeType. + * + * @return property value of nodeType + */ + public NodeType getNodeType() { + return nodeType; + } + + /** + * Setter method for property nodeType. + * + * @param nodeType value to be assigned to property nodeType + */ + public void setNodeType(NodeType nodeType) { + this.nodeType = nodeType; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("NotifyProvideDataChange{"); sb.append("dataInfoId='").append(dataInfoId).append('\''); sb.append(", version=").append(version); sb.append(", dataOperator=").append(dataOperator); + sb.append(", nodeType=").append(nodeType); sb.append('}'); return sb.toString(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index 24e9e31f9..eaec05cf3 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -16,23 +16,8 @@ */ package com.alipay.sofa.registry.server.data.bootstrap; -import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; - -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; - +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -48,6 +33,21 @@ import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; /** * @@ -124,6 +124,8 @@ public void start() { startRaftClient(); + fetchProviderData(); + startScheduler(); Runtime.getRuntime().addShutdownHook(new Thread(this::doStop)); @@ -190,6 +192,20 @@ private void startRaftClient() { LOGGER.info("raft client started!Leader is {}", metaServerService.getLeader()); } + private void fetchProviderData() { + ProvideData provideData = metaServerService + .fetchData(ValueConstants.STOP_DATA_DATUM_EXPIRE); + if (provideData != null) { + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch stop datum expire switch no data existed,config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + LOGGER.info("Fetch stop datum expire switch {} success!", data); + } + } + private void startScheduler() { try { if (schedulerStarted.compareAndSet(false, true)) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java index 8aef5f909..7873931a4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/DefaultMetaServiceImpl.java @@ -16,27 +16,16 @@ */ package com.alipay.sofa.registry.server.data.remoting.metaserver; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.sofa.jraft.entity.PeerId; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.DataNode; +import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; import com.alipay.sofa.registry.common.model.metaserver.GetNodesRequest; import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.common.model.metaserver.RenewNodesRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.jraft.bootstrap.RaftClient; @@ -44,11 +33,24 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.bolt.BoltChannel; import com.alipay.sofa.registry.remoting.exchange.message.Request; +import com.alipay.sofa.registry.remoting.exchange.message.Response; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; import com.alipay.sofa.registry.server.data.node.DataServerNode; import com.alipay.sofa.registry.server.data.remoting.MetaNodeExchanger; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerNodeFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; /** * @@ -251,6 +253,53 @@ public URL getRequestUrl() { } } + @Override + public ProvideData fetchData(String dataInfoId) { + + Map connectionMap = metaServerConnectionFactory + .getConnections(dataServerConfig.getLocalDataCenter()); + String leader = getLeader().getIp(); + if (connectionMap.containsKey(leader)) { + Connection connection = connectionMap.get(leader); + if (connection.isFine()) { + try { + Request request = new Request() { + + @Override + public FetchProvideDataRequest getRequestBody() { + + return new FetchProvideDataRequest(dataInfoId); + } + + @Override + public URL getRequestUrl() { + return new URL(connection.getRemoteIP(), connection.getRemotePort()); + } + }; + + Response response = metaNodeExchanger.request(request); + + Object result = response.getResult(); + if (result instanceof ProvideData) { + return (ProvideData) result; + } else { + LOGGER.error("fetch null provider data!"); + throw new RuntimeException("MetaNodeService fetch null provider data!"); + } + } catch (Exception e) { + LOGGER.error("fetch provider data error! " + e.getMessage(), e); + throw new RuntimeException("fetch provider data error! " + e.getMessage(), e); + } + } + } + String newip = refreshLeader().getIp(); + LOGGER.warn( + "[ConnectionRefreshTask] refresh connections metaServer not fine,refresh leader : {}", + newip); + return null; + + } + @Override public void startRaftClient() { try { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java index 3bc2abd03..d1cf4192f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/IMetaServerService.java @@ -16,14 +16,15 @@ */ package com.alipay.sofa.registry.server.data.remoting.metaserver; -import java.util.List; -import java.util.Map; -import java.util.Set; - import com.alipay.sofa.jraft.entity.PeerId; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.server.data.cache.DataServerChangeItem; import com.alipay.sofa.registry.server.data.node.DataServerNode; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * The interface Meta server service. * @author qian.lqlq @@ -91,4 +92,11 @@ public interface IMetaServerService { * @return */ PeerId refreshLeader(); + + /** + * get provider data + * @param dataInfoId + * @return + */ + ProvideData fetchData(String dataInfoId); } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java new file mode 100644 index 000000000..d5f883386 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.remoting.metaserver.handler; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.Node.NodeType; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.DataOperator; +import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; +import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author shangyu.wh + * @version $Id: DataChangeRequestHandler.java, v 0.1 2017-12-12 15:09 shangyu.wh Exp $ + */ +public class NotifyProvideDataChangeHandler extends AbstractClientHandler { + + private static final Logger LOGGER = LoggerFactory + .getLogger(NotifyProvideDataChangeHandler.class); + + @Autowired + private IMetaServerService metaServerService; + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + protected NodeType getConnectNodeType() { + return NodeType.DATA; + } + + @Override + public void checkParam(Object request) throws RuntimeException { + + } + + @Override + public Object doHandle(Channel channel, Object request) { + + NotifyProvideDataChange notifyProvideDataChange = (NotifyProvideDataChange) request; + + fireDataChangeFetchTask(notifyProvideDataChange); + return null; + } + + private void fireDataChangeFetchTask(NotifyProvideDataChange notifyProvideDataChange) { + + String dataInfoId = notifyProvideDataChange.getDataInfoId(); + if (notifyProvideDataChange.getDataOperator() != DataOperator.REMOVE) { + + if (ValueConstants.STOP_DATA_DATUM_EXPIRE.equals(dataInfoId)) { + ProvideData provideData = metaServerService.fetchData(dataInfoId); + if (provideData != null) { + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER + .info("Fetch stop datum expire switch no data existed,config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + LOGGER.info("Fetch stop datum expire switch {} success!", data); + } + } + } + } + + @Override + public Class interest() { + return NotifyProvideDataChange.class; + } + + @Override + public CommonResponse buildFailedResponse(String msg) { + return CommonResponse.buildFailedResponse(msg); + } + +} \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java index 8462c6729..41c371814 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java @@ -16,17 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; -import java.util.ArrayList; -import java.util.Collection; - -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - import com.alipay.sofa.registry.jraft.service.PersistenceDataDBService; import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -88,6 +77,16 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import java.util.ArrayList; +import java.util.Collection; /** * @@ -243,6 +242,7 @@ public Collection dataServerHandlers() { list.add(getNodesRequestHandler()); list.add(dataNodeHandler()); list.add(renewNodesRequestHandler()); + list.add(fetchProvideDataRequestHandler()); return list; } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/DataNodeService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/DataNodeService.java index 9fc3efccc..10f77b834 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/DataNodeService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/DataNodeService.java @@ -18,6 +18,7 @@ import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; +import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; import com.alipay.sofa.registry.common.model.metaserver.StatusConfirmRequest; import java.util.Map; @@ -33,4 +34,6 @@ void pushDataNodes(NodeChangeResult nodeChangeResult, Map targ boolean confirm, String confirmNodeIp); void notifyStatusConfirm(StatusConfirmRequest statusConfirmRequest); + + void notifyProvideDataChange(NotifyProvideDataChange notifyProvideDataChange); } \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java index 26cd6ba53..a8300f1b5 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/node/impl/DataNodeServiceImpl.java @@ -16,19 +16,12 @@ */ package com.alipay.sofa.registry.server.meta.node.impl; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; +import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; import com.alipay.sofa.registry.common.model.metaserver.StatusConfirmRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -42,6 +35,13 @@ import com.alipay.sofa.registry.server.meta.remoting.connection.NodeConnectManager; import com.alipay.sofa.registry.server.meta.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.meta.store.StoreService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; /** * @@ -183,6 +183,55 @@ public URL getRequestUrl() { } } + @Override + public void notifyProvideDataChange(NotifyProvideDataChange notifyProvideDataChange) { + + NodeConnectManager nodeConnectManager = getNodeConnectManager(); + Collection connections = nodeConnectManager.getConnections(null); + + if (connections == null || connections.isEmpty()) { + LOGGER.error("Push dataNode list error! No data node connected!"); + throw new RuntimeException("Push dataNode list error! No data node connected!"); + } + + // add register confirm + StoreService storeService = ServiceFactory.getStoreService(NodeType.DATA); + Map dataNodes = storeService.getNodes(); + + if (dataNodes == null || dataNodes.isEmpty()) { + LOGGER.error("Push dataNode list error! No data node registered!"); + throw new RuntimeException("Push dataNode list error! No data node registered!"); + } + + for (InetSocketAddress connection : connections) { + + if (!dataNodes.keySet().contains(connection.getAddress().getHostAddress())) { + continue; + } + + try { + Request request = new Request() { + + @Override + public NotifyProvideDataChange getRequestBody() { + return notifyProvideDataChange; + } + + @Override + public URL getRequestUrl() { + return new URL(connection); + } + }; + + dataNodeExchanger.request(request); + + } catch (RequestException e) { + throw new RuntimeException("Notify provide data change to dataServer error: " + + e.getMessage(), e); + } + } + } + private void confirmStatus(InetSocketAddress address, String confirmNodeIp) { String ipAddress = address.getAddress().getHostAddress(); dataStoreService.confirmNodeStatus(ipAddress, confirmNodeIp); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/task/PersistenceDataChangeNotifyTask.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/task/PersistenceDataChangeNotifyTask.java index 63d986fcc..20cf9643e 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/task/PersistenceDataChangeNotifyTask.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/task/PersistenceDataChangeNotifyTask.java @@ -20,6 +20,7 @@ import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerConfig; import com.alipay.sofa.registry.server.meta.bootstrap.ServiceFactory; +import com.alipay.sofa.registry.server.meta.node.DataNodeService; import com.alipay.sofa.registry.server.meta.node.SessionNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; @@ -32,6 +33,8 @@ public class PersistenceDataChangeNotifyTask extends AbstractMetaServerTask { private final SessionNodeService sessionNodeService; + private final DataNodeService dataNodeService; + final private MetaServerConfig metaServerConfig; private NotifyProvideDataChange notifyProvideDataChange; @@ -40,11 +43,17 @@ public PersistenceDataChangeNotifyTask(MetaServerConfig metaServerConfig) { this.metaServerConfig = metaServerConfig; this.sessionNodeService = (SessionNodeService) ServiceFactory .getNodeService(NodeType.SESSION); + + this.dataNodeService = (DataNodeService) ServiceFactory.getNodeService(NodeType.DATA); } @Override public void execute() { - sessionNodeService.notifyProvideDataChange(notifyProvideDataChange); + if (notifyProvideDataChange.getNodeType() == NodeType.DATA) { + dataNodeService.notifyProvideDataChange(notifyProvideDataChange); + } else { + sessionNodeService.notifyProvideDataChange(notifyProvideDataChange); + } } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 8334aa1da..ec8d93856 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -16,21 +16,6 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; - -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.util.CollectionUtils; - import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; @@ -55,6 +40,19 @@ import com.alipay.sofa.registry.server.session.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; /** * The type Session server bootstrap. @@ -268,6 +266,8 @@ private void connectMetaServer() { fetchStopPushSwitch(leaderUrl); + fetchStopRenewSwitch(leaderUrl); + fetchBlackList(); LOGGER.info("MetaServer connected {} server! Port:{}", size, @@ -322,6 +322,27 @@ private void fetchStopPushSwitch(URL leaderUrl) { } } + private void fetchStopRenewSwitch(URL leaderUrl) { + FetchProvideDataRequest fetchProvideDataRequest = new FetchProvideDataRequest( + ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT); + Object ret = sendMetaRequest(fetchProvideDataRequest, leaderUrl); + if (ret instanceof ProvideData) { + ProvideData provideData = (ProvideData) ret; + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session stop renew switch no data existed,config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + if (data != null) { + //TODO RENEW + } + LOGGER.info("Fetch session stop renew data switch {} success!", data); + } else { + LOGGER.info("Fetch session renew push switch data null,config not change!"); + } + } + private void fetchBlackList() { blacklistManager.load(); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java index ac18b3743..57ca25d32 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/NotifyProvideDataChangeHandler.java @@ -69,7 +69,9 @@ public Object reply(Channel channel, Object message) { if (!ValueConstants.STOP_PUSH_DATA_SWITCH_DATA_ID.equals(notifyProvideDataChange .getDataInfoId()) - && !ValueConstants.BLACK_LIST_DATA_ID.equals(notifyProvideDataChange.getDataInfoId())) { + && !ValueConstants.BLACK_LIST_DATA_ID.equals(notifyProvideDataChange.getDataInfoId()) + && !ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(notifyProvideDataChange + .getDataInfoId())) { boolean result = sessionWatchers.checkWatcherVersions( notifyProvideDataChange.getDataInfoId(), notifyProvideDataChange.getVersion()); if (!result) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java index 22e1dadcf..253c457f8 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java @@ -177,7 +177,22 @@ public void execute() { LOGGER.info("Fetch session blacklist data null,current config not change!"); } return; + } else if (ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(dataInfoId)){ + //stop renew switch + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session stop renew switch no data existed,current config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + if (data != null) { + LOGGER.info("Fetch session stop renew switch data switch {} success!", data); + }else { + LOGGER.info("Fetch session stop renew switch data null,current config not change!"); + } + return; } + if (provideData == null) { LOGGER.warn("Notify provider data Change request {} fetch no provider data!", notifyProvideDataChange); return; From 3cae2f4c9e5394b360b7da1a2b6578e32b78f76a Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 30 Aug 2019 22:19:41 +0800 Subject: [PATCH 106/161] implement renew enable/disable switch --- .../model/constants/ValueConstants.java | 2 +- .../DataServerBeanConfiguration.java | 7 + .../data/bootstrap/DataServerBootstrap.java | 55 ++-- .../NotifyProvideDataChangeHandler.java | 27 +- .../handler/ClientOffHandler.java | 7 + .../server/data/renew/DatumLeaseManager.java | 134 ++++++---- .../bootstrap/MetaServerConfiguration.java | 27 +- .../meta/resource/BlacklistDataResource.java | 4 +- .../meta/resource/RenewSwitchResource.java | 235 ++++++++++++++++++ .../bootstrap/SessionServerBootstrap.java | 58 +++-- .../server/session/registry/Registry.java | 2 + .../session/registry/SessionRegistry.java | 29 ++- .../task/ProvideDataChangeFetchTask.java | 61 +++-- 13 files changed, 483 insertions(+), 165 deletions(-) create mode 100644 server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/RenewSwitchResource.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java index 7b71d5251..005127563 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/constants/ValueConstants.java @@ -60,7 +60,7 @@ public class ValueConstants { public static final String ENABLE_DATA_RENEW_SNAPSHOT = "session.enable.datum.renew.switch#@#9600#@#CONFIG"; - public static final String STOP_DATA_DATUM_EXPIRE = "data.stop.datum.expire.switch#@#9600#@#CONFIG"; + public static final String ENABLE_DATA_DATUM_EXPIRE = "data.enable.datum.expire.switch#@#9600#@#CONFIG"; public static final String LOGGER_NAME_RENEW = "RENEW-LOGGER"; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 96694c971..ef8464081 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -77,6 +77,7 @@ import com.alipay.sofa.registry.server.data.remoting.metaserver.DefaultMetaServiceImpl; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; import com.alipay.sofa.registry.server.data.remoting.metaserver.MetaServerConnectionFactory; +import com.alipay.sofa.registry.server.data.remoting.metaserver.handler.NotifyProvideDataChangeHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.handler.ServerChangeHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.handler.StatusConfirmHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.task.ConnectionRefreshMetaTask; @@ -246,6 +247,7 @@ public Collection metaClientHandlers() { Collection list = new ArrayList<>(); list.add(serverChangeHandler()); list.add(statusConfirmHandler()); + list.add(notifyProvideDataChangeHandler()); return list; } @@ -333,6 +335,11 @@ public AbstractClientHandler serverChangeHandler() { public AbstractClientHandler statusConfirmHandler() { return new StatusConfirmHandler(); } + + @Bean + public NotifyProvideDataChangeHandler notifyProvideDataChangeHandler() { + return new NotifyProvideDataChangeHandler(); + } } @Configuration diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java index eaec05cf3..8cc934baf 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBootstrap.java @@ -16,6 +16,23 @@ */ package com.alipay.sofa.registry.server.data.bootstrap; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; + import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.common.model.store.URL; @@ -33,21 +50,7 @@ import com.alipay.sofa.registry.server.data.event.StartTaskTypeEnum; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; /** * @@ -93,6 +96,9 @@ public class DataServerBootstrap { @Resource(name = "serverSyncHandlers") private Collection serverSyncHandlers; + @Autowired + private DatumLeaseManager datumLeaseManager; + private Server server; private Server dataSyncServer; @@ -194,16 +200,17 @@ private void startRaftClient() { private void fetchProviderData() { ProvideData provideData = metaServerService - .fetchData(ValueConstants.STOP_DATA_DATUM_EXPIRE); - if (provideData != null) { - if (provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch stop datum expire switch no data existed,config not change!"); - return; - } - String data = (String) provideData.getProvideData().getObject(); - LOGGER.info("Fetch stop datum expire switch {} success!", data); + .fetchData(ValueConstants.ENABLE_DATA_DATUM_EXPIRE); + if (provideData == null || provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER + .info("Fetch enableDataDatumExpire but no data existed, current config not change!"); + return; } + boolean enableDataDatumExpire = Boolean.parseBoolean((String) provideData.getProvideData() + .getObject()); + LOGGER.info("Fetch enableDataDatumExpire {} success!", enableDataDatumExpire); + datumLeaseManager.setRenewEnable(enableDataDatumExpire); } private void startScheduler() { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java index d5f883386..756a025cb 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/metaserver/handler/NotifyProvideDataChangeHandler.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.remoting.metaserver.handler; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.constants.ValueConstants; @@ -27,7 +29,7 @@ import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.data.remoting.metaserver.IMetaServerService; -import org.springframework.beans.factory.annotation.Autowired; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; /** * @@ -42,6 +44,9 @@ public class NotifyProvideDataChangeHandler extends AbstractClientHandler { @Autowired private IMetaServerService metaServerService; + @Autowired + private DatumLeaseManager datumLeaseManager; + @Override public HandlerType getType() { return HandlerType.PROCESSER; @@ -71,18 +76,18 @@ private void fireDataChangeFetchTask(NotifyProvideDataChange notifyProvideDataCh String dataInfoId = notifyProvideDataChange.getDataInfoId(); if (notifyProvideDataChange.getDataOperator() != DataOperator.REMOVE) { - if (ValueConstants.STOP_DATA_DATUM_EXPIRE.equals(dataInfoId)) { + if (ValueConstants.ENABLE_DATA_DATUM_EXPIRE.equals(dataInfoId)) { ProvideData provideData = metaServerService.fetchData(dataInfoId); - if (provideData != null) { - if (provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER - .info("Fetch stop datum expire switch no data existed,config not change!"); - return; - } - String data = (String) provideData.getProvideData().getObject(); - LOGGER.info("Fetch stop datum expire switch {} success!", data); + if (provideData == null || provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER + .info("Fetch enableDataDatumExpire but no data existed, current config not change!"); + return; } + boolean enableDataDatumExpire = Boolean.parseBoolean((String) provideData + .getProvideData().getObject()); + LOGGER.info("Fetch enableDataDatumExpire {} success!", enableDataDatumExpire); + datumLeaseManager.setRenewEnable(enableDataDatumExpire); } } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java index 5a775dea5..5df47ec9d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/ClientOffHandler.java @@ -28,6 +28,7 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.ClientDisconnectEvent; import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.DisconnectEventHandler; +import com.alipay.sofa.registry.server.data.renew.DatumLeaseManager; import com.alipay.sofa.registry.util.ParaCheckUtil; /** @@ -44,6 +45,9 @@ public class ClientOffHandler extends AbstractServerHandler { @Autowired private DisconnectEventHandler disconnectEventHandler; + @Autowired + private DatumLeaseManager datumLeaseManager; + @Override public void checkParam(ClientOffRequest request) throws RuntimeException { ParaCheckUtil.checkNotEmpty(request.getHosts(), "ClientOffRequest.hosts"); @@ -53,6 +57,9 @@ public void checkParam(ClientOffRequest request) throws RuntimeException { public Object doHandle(Channel channel, ClientOffRequest request) { List hosts = request.getHosts(); for (String host : hosts) { + // stop task of this connectId + datumLeaseManager.remove(host); + disconnectEventHandler.receive(new ClientDisconnectEvent(host, request.getGmtOccur(), dataServerConfig.getClientOffDelayMs())); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index 6fd11a238..cb7d253e9 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -23,7 +23,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.PostConstruct; @@ -50,40 +49,38 @@ * @version $Id: DatumExpiredCleaner.java, v 0.1 2019-06-03 21:08 kezhu.wukz Exp $ */ public class DatumLeaseManager implements AfterWorkingProcess { - private static final Logger LOGGER = LoggerFactory - .getLogger(DatumLeaseManager.class); - private static final TimeZone TIME_ZONE = TimeZone - .getTimeZone("Asia/Shanghai"); - private static final Logger RENEW_LOGGER = LoggerFactory - .getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[DatumLeaseManager]"); + private static final Logger LOGGER = LoggerFactory.getLogger(DatumLeaseManager.class); + private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Asia/Shanghai"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger(ValueConstants.LOGGER_NAME_RENEW, "[DatumLeaseManager]"); /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ - private final Map connectIdRenewTimestampMap = new ConcurrentHashMap<>(); + private final Map connectIdRenewTimestampMap = new ConcurrentHashMap<>(); /** lock for connectId , format: connectId -> true */ - private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); + private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); - private final AtomicBoolean renewEnabled = new AtomicBoolean(false); + private volatile boolean serverWorking = false; - private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; + private volatile boolean renewEnable = true; + + private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; @Autowired - private DataServerConfig dataServerConfig; + private DataServerConfig dataServerConfig; @Autowired - private DisconnectEventHandler disconnectEventHandler; + private DisconnectEventHandler disconnectEventHandler; @Autowired - private DatumCache datumCache; + private DatumCache datumCache; @Autowired - private DataNodeStatus dataNodeStatus; + private DataNodeStatus dataNodeStatus; - private ScheduledThreadPoolExecutor executorForHeartbeatLess; + private ScheduledThreadPoolExecutor executorForHeartbeatLess; - private ScheduledFuture futureForHeartbeatLess; + private ScheduledFuture futureForHeartbeatLess; /** * constructor @@ -92,25 +89,25 @@ public class DatumLeaseManager implements AfterWorkingProcess { public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); - datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "Registry-DatumLeaseManager-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, - dataServerConfig.getDatumLeaseManagerExecutorThreadSize(), - dataServerConfig.getDatumLeaseManagerExecutorQueueSize(), threadFactoryBuilder - .setNameFormat("Registry-DatumLeaseManager-WheelExecutor-%d").build(), - new TaskFailedCallback() { - @Override - public void executionRejected(Throwable e) { - LOGGER.error("executionRejected: " + e.getMessage(), e); - } + datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer( + threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-WheelTimer").build(), 100, + TimeUnit.MILLISECONDS, 1024, dataServerConfig.getDatumLeaseManagerExecutorThreadSize(), + dataServerConfig.getDatumLeaseManagerExecutorQueueSize(), + threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-WheelExecutor-%d").build(), + new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + LOGGER.error("executionRejected: " + e.getMessage(), e); + } - @Override - public void executionFailed(Throwable e) { - LOGGER.error("executionFailed: " + e.getMessage(), e); - } - }); + @Override + public void executionFailed(Throwable e) { + LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); - executorForHeartbeatLess = new ScheduledThreadPoolExecutor(1, threadFactoryBuilder - .setNameFormat("Registry-DatumLeaseManager-ExecutorForHeartbeatLess").build()); + executorForHeartbeatLess = new ScheduledThreadPoolExecutor(1, + threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-ExecutorForHeartbeatLess").build()); scheduleEvictTaskForHeartbeatLess(); } @@ -119,7 +116,7 @@ public void executionFailed(Throwable e) { */ public synchronized void reset() { LOGGER.info("reset is called, EvictTaskForHeartbeatLess will delay {}s", - dataServerConfig.getDatumTimeToLiveSec()); + dataServerConfig.getDatumTimeToLiveSec()); if (futureForHeartbeatLess != null) { futureForHeartbeatLess.cancel(false); } @@ -127,9 +124,9 @@ public synchronized void reset() { } private void scheduleEvictTaskForHeartbeatLess() { - futureForHeartbeatLess = executorForHeartbeatLess.scheduleWithFixedDelay( - new EvictTaskForHeartbeatLess(), dataServerConfig.getDatumTimeToLiveSec(), - dataServerConfig.getDatumTimeToLiveSec(), TimeUnit.SECONDS); + futureForHeartbeatLess = executorForHeartbeatLess + .scheduleWithFixedDelay(new EvictTaskForHeartbeatLess(), dataServerConfig.getDatumTimeToLiveSec(), + dataServerConfig.getDatumTimeToLiveSec(), TimeUnit.SECONDS); } /** @@ -146,6 +143,20 @@ public void renew(String connectId) { scheduleEvictTask(connectId, 0); } + /** + * remove connectId if clientOff + */ + public void remove(String connectId) { + if (RENEW_LOGGER.isDebugEnabled()) { + RENEW_LOGGER.debug("remove: connectId={}", connectId); + } + + Long removed = connectIdRenewTimestampMap.remove(connectId); + if (removed != null) { + LOGGER.info("remove connectId({}) because it is clientOff", connectId); + } + } + /** * trigger evict task: if connectId expired, create ClientDisconnectEvent to cleanup datums bind to the connectId * PS: every connectId allows only one task to be created @@ -167,7 +178,12 @@ private void scheduleEvictTask(String connectId, long delaySec) { locksForConnectId.remove(connectId); // get lastRenewTime of this connectId - long lastRenewTime = connectIdRenewTimestampMap.get(connectId); + Long lastRenewTime = connectIdRenewTimestampMap.get(connectId); + if (lastRenewTime == null) { + // connectId is already clientOff + LOGGER.info("EvictTask(connectId={}) stop because already disconnected", connectId); + return; + } if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug("EvictTask: connectId={}, lastRenewTime={}", connectId, format(lastRenewTime)); @@ -182,10 +198,16 @@ private void scheduleEvictTask(String connectId, long delaySec) { */ boolean isExpired = System.currentTimeMillis() - lastRenewTime > dataServerConfig.getDatumTimeToLiveSec() * 1000L; - if (isExpired && renewEnabled.get()) { + if (!isRenewEnable()) { + LOGGER.info( + "scheduleEvictTask({}) skipped because isRenewEnable() is false, lastRenewTime is {}, DataNodeStatus is {}, will retry after {}s", + connectId, format(lastRenewTime), dataNodeStatus.getStatus(), + dataServerConfig.getDatumTimeToLiveSec()); + nextDelaySec = dataServerConfig.getDatumTimeToLiveSec(); + } else if (isExpired) { int ownPubSize = getOwnPubSize(connectId); if (ownPubSize > 0) { - LOGGER.info("Evict connectId({}) cause it's expired, lastRenewTime is {}, pub.size is {}", + LOGGER.info("Evict connectId({}) because expired, lastRenewTime is {}, pub.size is {}", connectId, format(lastRenewTime), ownPubSize); evict(connectId); } @@ -217,8 +239,7 @@ private int getOwnPubSize(String connectId) { } private void evict(String connectId) { - disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System - .currentTimeMillis(), 0)); + disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), 0)); } private String format(long lastRenewTime) { @@ -237,7 +258,7 @@ public void afterWorkingProcess() { } catch (InterruptedException e) { LOGGER.error(e.getMessage(), e); } - renewEnabled.set(true); + serverWorking = true; } @Override @@ -253,10 +274,9 @@ private class EvictTaskForHeartbeatLess implements Runnable { @Override public void run() { // If in a non-working state, cannot clean up because the renew request cannot be received at this time. - if (!renewEnabled.get()) { - LOGGER - .info( - "EvictTaskForHeartbeatLess skipped cause renewEnabled is false, DataNodeStatus is {}, will retry after {}s", + if (!isRenewEnable()) { + LOGGER.info( + "EvictTaskForHeartbeatLess skipped because isRenewEnable() is false, DataNodeStatus is {}, will retry after {}s", dataNodeStatus.getStatus(), dataServerConfig.getDatumTimeToLiveSec()); return; } @@ -268,9 +288,8 @@ public void run() { if (timestamp == null) { int ownPubSize = getOwnPubSize(connectId); if (ownPubSize > 0) { - LOGGER.info( - "Evict connectId({}) cause it has no heartbeat, pub.size is {}", - connectId, ownPubSize); + LOGGER.info("Evict connectId({}) because no heartbeat, pub.size is {}", connectId, + ownPubSize); evict(connectId); } } @@ -279,4 +298,13 @@ public void run() { LOGGER.info("connectIdRenewTimestampMap.size is {}", connectIdRenewTimestampMap.size()); } } + + public void setRenewEnable(boolean renewEnable) { + this.renewEnable = renewEnable; + } + + private boolean isRenewEnable() { + return renewEnable && serverWorking; + } + } \ No newline at end of file diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java index 41c371814..e605d40c7 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfiguration.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; +import java.util.ArrayList; +import java.util.Collection; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import com.alipay.sofa.registry.jraft.service.PersistenceDataDBService; import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -63,6 +74,7 @@ import com.alipay.sofa.registry.server.meta.resource.MetaDigestResource; import com.alipay.sofa.registry.server.meta.resource.MetaStoreResource; import com.alipay.sofa.registry.server.meta.resource.PersistentDataResource; +import com.alipay.sofa.registry.server.meta.resource.RenewSwitchResource; import com.alipay.sofa.registry.server.meta.resource.StopPushDataResource; import com.alipay.sofa.registry.server.meta.store.DataStoreService; import com.alipay.sofa.registry.server.meta.store.MetaStoreService; @@ -77,16 +89,6 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import java.util.ArrayList; -import java.util.Collection; /** * @@ -365,6 +367,11 @@ public StopPushDataResource stopPushDataResource() { public BlacklistDataResource blacklistDataResource() { return new BlacklistDataResource(); } + + @Bean + public RenewSwitchResource renewSwitchResource() { + return new RenewSwitchResource(); + } } @Configuration diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java index a43fbff58..f11320812 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/BlacklistDataResource.java @@ -45,10 +45,10 @@ @Path("blacklist") public class BlacklistDataResource { - private static final Logger DB_LOGGER = LoggerFactory.getLogger(StopPushDataResource.class, + private static final Logger DB_LOGGER = LoggerFactory.getLogger(BlacklistDataResource.class, "[DBService]"); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(StopPushDataResource.class, + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(BlacklistDataResource.class, "[Task]"); @RaftReference diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/RenewSwitchResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/RenewSwitchResource.java new file mode 100644 index 000000000..1594661b1 --- /dev/null +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/RenewSwitchResource.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.meta.resource; + +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.Node.NodeType; +import com.alipay.sofa.registry.common.model.console.PersistenceData; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.DataOperator; +import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; +import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.core.model.Result; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.store.api.DBResponse; +import com.alipay.sofa.registry.store.api.DBService; +import com.alipay.sofa.registry.store.api.annotation.RaftReference; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; + +/** + * + * @author shangyu.wh + * @version $Id: StopPushDataResource.java, v 0.1 2018-07-25 11:40 shangyu.wh Exp $ + */ +@Path("renewSwitch") +public class RenewSwitchResource { + + private static final Logger DB_LOGGER = LoggerFactory.getLogger(RenewSwitchResource.class, + "[DBService]"); + + private static final Logger TASK_LOGGER = LoggerFactory.getLogger(RenewSwitchResource.class, + "[Task]"); + + @RaftReference + private DBService persistenceDataDBService; + + @Autowired + private TaskListenerManager taskListenerManager; + + /** + * get + */ + @GET + @Path("get") + @Produces(MediaType.APPLICATION_JSON) + public Map getPushSwitch() throws Exception { + Map resultMap = new HashMap<>(1); + DBResponse enableDataRenewSnapshot = persistenceDataDBService + .get(ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT); + DBResponse enableDataDatumExpire = persistenceDataDBService + .get(ValueConstants.ENABLE_DATA_DATUM_EXPIRE); + + resultMap + .put( + "enableDataRenewSnapshot", + enableDataRenewSnapshot != null && enableDataRenewSnapshot.getEntity() != null ? ((PersistenceData) enableDataRenewSnapshot + .getEntity()).getData() : "null"); + resultMap + .put( + "enableDataDatumExpire", + enableDataDatumExpire != null && enableDataDatumExpire.getEntity() != null ? ((PersistenceData) enableDataDatumExpire + .getEntity()).getData() : "null"); + + return resultMap; + } + + /** + * enable both + */ + @GET + @Path("enable") + @Produces(MediaType.APPLICATION_JSON) + public Result enableRenew() { + invokeSession("true"); + invokeData("true"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + /** + * disable both + */ + @GET + @Path("disable") + @Produces(MediaType.APPLICATION_JSON) + public Result disableRenew() { + invokeSession("false"); + invokeData("false"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + /** + * enable session + */ + @GET + @Path("session/enable") + @Produces(MediaType.APPLICATION_JSON) + public Result enableSessionRenew() { + invokeSession("true"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + /** + * disable session + */ + @GET + @Path("session/disable") + @Produces(MediaType.APPLICATION_JSON) + public Result disableSessionRenew() { + invokeSession("false"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + /** + * enable data + */ + @GET + @Path("data/enable") + @Produces(MediaType.APPLICATION_JSON) + public Result enableDataRenew() { + invokeData("true"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + /** + * disable data + */ + @GET + @Path("data/disable") + @Produces(MediaType.APPLICATION_JSON) + public Result disableDataRenew() { + invokeData("false"); + + Result result = new Result(); + result.setSuccess(true); + return result; + } + + private void invokeSession(String data) { + String msg = "put ENABLE_DATA_RENEW_SNAPSHOT to DB"; + PersistenceData persistenceData = createPersistenceData(ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT); + persistenceData.setData(data); + try { + boolean ret = persistenceDataDBService.put(ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT, + persistenceData); + DB_LOGGER.info(String.format("%s result %s", msg, ret)); + } catch (Exception e) { + DB_LOGGER.error(String.format("Error %s: %s", msg, e.getMessage())); + throw new RuntimeException(String.format("Error %s: %s", msg, e.getMessage()), e); + } + + fireDataChangeNotify(NodeType.SESSION, persistenceData.getVersion(), + ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT, DataOperator.UPDATE); + } + + private void invokeData(String data) { + String msg = "put ENABLE_DATA_DATUM_EXPIRE to DB"; + PersistenceData persistenceData = createPersistenceData(ValueConstants.ENABLE_DATA_DATUM_EXPIRE); + persistenceData.setData(data); + try { + boolean ret = persistenceDataDBService.put(ValueConstants.ENABLE_DATA_DATUM_EXPIRE, + persistenceData); + DB_LOGGER.info(String.format("%s result %s", msg, ret)); + } catch (Exception e) { + DB_LOGGER.error(String.format("Error %s: %s", msg, e.getMessage())); + throw new RuntimeException(String.format("Error %s: %s", msg, e.getMessage()), e); + } + + fireDataChangeNotify(NodeType.DATA, persistenceData.getVersion(), + ValueConstants.ENABLE_DATA_DATUM_EXPIRE, DataOperator.UPDATE); + } + + private PersistenceData createPersistenceData(String dataId) { + DataInfo dataInfo = DataInfo.valueOf(dataId); + PersistenceData persistenceData = new PersistenceData(); + persistenceData.setDataId(dataInfo.getDataId()); + persistenceData.setGroup(dataInfo.getDataType()); + persistenceData.setInstanceId(dataInfo.getInstanceId()); + persistenceData.setVersion(System.currentTimeMillis()); + return persistenceData; + } + + private void fireDataChangeNotify(NodeType nodeType, Long version, String dataInfoId, + DataOperator dataOperator) { + NotifyProvideDataChange notifyProvideDataChange = new NotifyProvideDataChange(dataInfoId, + version, dataOperator); + notifyProvideDataChange.setNodeType(nodeType); + + TaskEvent taskEvent = new TaskEvent(notifyProvideDataChange, + TaskType.PERSISTENCE_DATA_CHANGE_NOTIFY_TASK); + TASK_LOGGER.info("send PERSISTENCE_DATA_CHANGE_NOTIFY_TASK notifyProvideDataChange:" + + notifyProvideDataChange); + taskListenerManager.sendTaskEvent(taskEvent); + } + +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index ec8d93856..3ed3279cd 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -16,6 +16,21 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; @@ -36,23 +51,11 @@ import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; import com.alipay.sofa.registry.server.session.node.RaftClientManager; import com.alipay.sofa.registry.server.session.node.SessionProcessIdGenerator; +import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.util.CollectionUtils; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * The type Session server bootstrap. @@ -103,6 +106,9 @@ public class SessionServerBootstrap { @Autowired private BlacklistManager blacklistManager; + @Autowired + private Registry sessionRegistry; + private Server server; private Server httpServer; @@ -266,7 +272,7 @@ private void connectMetaServer() { fetchStopPushSwitch(leaderUrl); - fetchStopRenewSwitch(leaderUrl); + fetchEnableDataRenewSnapshot(leaderUrl); fetchBlackList(); @@ -322,24 +328,22 @@ private void fetchStopPushSwitch(URL leaderUrl) { } } - private void fetchStopRenewSwitch(URL leaderUrl) { + private void fetchEnableDataRenewSnapshot(URL leaderUrl) { FetchProvideDataRequest fetchProvideDataRequest = new FetchProvideDataRequest( ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT); - Object ret = sendMetaRequest(fetchProvideDataRequest, leaderUrl); - if (ret instanceof ProvideData) { - ProvideData provideData = (ProvideData) ret; - if (provideData.getProvideData() == null + Object data = sendMetaRequest(fetchProvideDataRequest, leaderUrl); + if (data instanceof ProvideData) { + ProvideData provideData = (ProvideData) data; + if (provideData == null || provideData.getProvideData() == null || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch session stop renew switch no data existed,config not change!"); + LOGGER + .info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); return; } - String data = (String) provideData.getProvideData().getObject(); - if (data != null) { - //TODO RENEW - } - LOGGER.info("Fetch session stop renew data switch {} success!", data); - } else { - LOGGER.info("Fetch session renew push switch data null,config not change!"); + boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData + .getProvideData().getObject()); + LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); + this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java index 280ce0056..a0c7c6675 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/Registry.java @@ -82,4 +82,6 @@ public interface Registry { * for scheduler clean no connect client */ void cleanClientConnect(); + + void setEnableDataRenewSnapshot(boolean enableDataRenewSnapshot); } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java index 100e9405a..0ad21988f 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/registry/SessionRegistry.java @@ -65,14 +65,15 @@ */ public class SessionRegistry implements Registry { - private static final Logger LOGGER = LoggerFactory.getLogger(SessionRegistry.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(SessionRegistry.class); - private static final Logger TASK_LOGGER = LoggerFactory.getLogger(SessionRegistry.class, - "[Task]"); + private static final Logger TASK_LOGGER = LoggerFactory.getLogger( + SessionRegistry.class, "[Task]"); - private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( - ValueConstants.LOGGER_NAME_RENEW, - "[SessionRegistry]"); + private static final Logger RENEW_LOGGER = LoggerFactory.getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[SessionRegistry]"); /** * store subscribers @@ -131,6 +132,8 @@ public class SessionRegistry implements Registry { @Autowired private WriteDataAcceptor writeDataAcceptor; + private volatile boolean enableDataRenewSnapshot = true; + @Override public void register(StoreData storeData) { @@ -435,6 +438,10 @@ public void renewDatum(String connectId) { if (RENEW_LOGGER.isDebugEnabled()) { RENEW_LOGGER.debug("renewDatum: connectId={}", connectId); } + // check the renew switch + if (!this.enableDataRenewSnapshot) { + return; + } List renewDatumRequests = renewService.getRenewDatumRequests(connectId); if (renewDatumRequests != null) { @@ -524,4 +531,14 @@ protected DataStore getSessionDataStore() { protected TaskListenerManager getTaskListenerManager() { return taskListenerManager; } + + /** + * Setter method for property enableDataRenewSnapshot . + * + * @param enableDataRenewSnapshot value to be assigned to property enableDataRenewSnapshot + */ + @Override + public void setEnableDataRenewSnapshot(boolean enableDataRenewSnapshot) { + this.enableDataRenewSnapshot = enableDataRenewSnapshot; + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java index 253c457f8..3f398d1aa 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java @@ -16,6 +16,18 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.DataOperator; import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; @@ -43,17 +55,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; /** * @@ -161,35 +162,32 @@ public void execute() { LOGGER.info("Fetch session stop push switch data null,config not change!"); } return; - }else if(ValueConstants.BLACK_LIST_DATA_ID.equals(dataInfoId)){ + } else if (ValueConstants.BLACK_LIST_DATA_ID.equals(dataInfoId)) { //black list data - if (provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { + if (provideData.getProvideData() == null || provideData.getProvideData().getObject() == null) { LOGGER.info("Fetch session blacklist no data existed,current config not change!"); return; } String data = (String) provideData.getProvideData().getObject(); if (data != null) { - Map>> blacklistConfigMap = blacklistManager.convertBlacklistConfig(data); + Map>> blacklistConfigMap = blacklistManager + .convertBlacklistConfig(data); clientOffBlackIp(blacklistConfigMap); LOGGER.info("Fetch session blacklist data switch {} success!", data); - }else { + } else { LOGGER.info("Fetch session blacklist data null,current config not change!"); } return; - } else if (ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(dataInfoId)){ + } else if (ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(dataInfoId)) { //stop renew switch - if (provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch session stop renew switch no data existed,current config not change!"); + if (provideData == null || provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); return; } - String data = (String) provideData.getProvideData().getObject(); - if (data != null) { - LOGGER.info("Fetch session stop renew switch data switch {} success!", data); - }else { - LOGGER.info("Fetch session stop renew switch data null,current config not change!"); - } + boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData.getProvideData().getObject()); + LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); + this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); return; } @@ -216,11 +214,12 @@ public void execute() { if (!registerIds.isEmpty()) { ReceivedConfigData receivedConfigData; if (notifyProvideDataChange.getDataOperator() == DataOperator.REMOVE) { - receivedConfigData = ReceivedDataConverter.getReceivedConfigData(null, dataInfo, - notifyProvideDataChange.getVersion()); + receivedConfigData = ReceivedDataConverter + .getReceivedConfigData(null, dataInfo, notifyProvideDataChange.getVersion()); } else { - receivedConfigData = ReceivedDataConverter.getReceivedConfigData( - provideData.getProvideData(), dataInfo, provideData.getVersion()); + receivedConfigData = ReceivedDataConverter + .getReceivedConfigData(provideData.getProvideData(), dataInfo, + provideData.getVersion()); } receivedConfigData.setConfiguratorRegistIds(registerIds); firePushTask(receivedConfigData, new URL(channel.getRemoteAddress())); @@ -239,7 +238,7 @@ private void fireReSubscriber() { //begin push fire data fetch task first,avoid reSubscriber push duplicate sessionRegistry.fetchChangDataProcess(); } catch (Throwable e) { - LOGGER.error("Open push switch first fetch task execute error",e); + LOGGER.error("Open push switch first fetch task execute error", e); } try { From c3c2ca889501dbfe2587058070ec04db5fc6fa6d Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 2 Sep 2019 14:32:31 +0800 Subject: [PATCH 107/161] fix data client exechange log --- .../handler/AbstractClientHandler.java | 18 ++-- .../server/data/renew/DatumLeaseManager.java | 86 ++++++++++--------- 2 files changed, 59 insertions(+), 45 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractClientHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractClientHandler.java index 8f48d5166..13563f506 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractClientHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/handler/AbstractClientHandler.java @@ -29,7 +29,10 @@ */ public abstract class AbstractClientHandler implements ChannelHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClientHandler.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(AbstractClientHandler.class); + + private static final Logger LOGGER_EXCHANGE = LoggerFactory.getLogger("DATA-EXCHANGE"); @Override public void connected(Channel channel) { @@ -64,7 +67,7 @@ public void received(Channel channel, T message) { @Override public Object reply(Channel channel, T request) { try { - logRequest(request); + logRequest(channel, request); checkParam(request); return doHandle(channel, request); } catch (Exception e) { @@ -102,8 +105,13 @@ public Object reply(Channel channel, T request) { * * @param request */ - protected void logRequest(T request) { - log(request.toString()); + protected void logRequest(Channel channel, T request) { + if (channel != null) { + log(new StringBuilder("Remote:").append(channel.getRemoteAddress()).append(" Request:") + .append(request).toString()); + } else { + log(request.toString()); + } } /** @@ -112,7 +120,7 @@ protected void logRequest(T request) { * @param log */ protected void log(String log) { - LOGGER.info(new StringBuilder("[").append(getClassName()).append("] ").append(log) + LOGGER_EXCHANGE.info(new StringBuilder("[").append(getClassName()).append("] ").append(log) .toString()); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java index cb7d253e9..b42069686 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/renew/DatumLeaseManager.java @@ -49,38 +49,42 @@ * @version $Id: DatumExpiredCleaner.java, v 0.1 2019-06-03 21:08 kezhu.wukz Exp $ */ public class DatumLeaseManager implements AfterWorkingProcess { - private static final Logger LOGGER = LoggerFactory.getLogger(DatumLeaseManager.class); - private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Asia/Shanghai"); - private static final Logger RENEW_LOGGER = LoggerFactory - .getLogger(ValueConstants.LOGGER_NAME_RENEW, "[DatumLeaseManager]"); + private static final Logger LOGGER = LoggerFactory + .getLogger(DatumLeaseManager.class); + private static final TimeZone TIME_ZONE = TimeZone + .getTimeZone("Asia/Shanghai"); + private static final Logger RENEW_LOGGER = LoggerFactory + .getLogger( + ValueConstants.LOGGER_NAME_RENEW, + "[DatumLeaseManager]"); /** record the latest heartbeat time for each connectId, format: connectId -> lastRenewTimestamp */ - private final Map connectIdRenewTimestampMap = new ConcurrentHashMap<>(); + private final Map connectIdRenewTimestampMap = new ConcurrentHashMap<>(); /** lock for connectId , format: connectId -> true */ - private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); + private ConcurrentHashMap locksForConnectId = new ConcurrentHashMap(); - private volatile boolean serverWorking = false; + private volatile boolean serverWorking = false; - private volatile boolean renewEnable = true; + private volatile boolean renewEnable = true; - private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; + private AsyncHashedWheelTimer datumAsyncHashedWheelTimer; @Autowired - private DataServerConfig dataServerConfig; + private DataServerConfig dataServerConfig; @Autowired - private DisconnectEventHandler disconnectEventHandler; + private DisconnectEventHandler disconnectEventHandler; @Autowired - private DatumCache datumCache; + private DatumCache datumCache; @Autowired - private DataNodeStatus dataNodeStatus; + private DataNodeStatus dataNodeStatus; - private ScheduledThreadPoolExecutor executorForHeartbeatLess; + private ScheduledThreadPoolExecutor executorForHeartbeatLess; - private ScheduledFuture futureForHeartbeatLess; + private ScheduledFuture futureForHeartbeatLess; /** * constructor @@ -89,25 +93,25 @@ public class DatumLeaseManager implements AfterWorkingProcess { public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); - datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer( - threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-WheelTimer").build(), 100, - TimeUnit.MILLISECONDS, 1024, dataServerConfig.getDatumLeaseManagerExecutorThreadSize(), - dataServerConfig.getDatumLeaseManagerExecutorQueueSize(), - threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-WheelExecutor-%d").build(), - new TaskFailedCallback() { - @Override - public void executionRejected(Throwable e) { - LOGGER.error("executionRejected: " + e.getMessage(), e); - } + datumAsyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( + "Registry-DatumLeaseManager-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, + dataServerConfig.getDatumLeaseManagerExecutorThreadSize(), + dataServerConfig.getDatumLeaseManagerExecutorQueueSize(), threadFactoryBuilder + .setNameFormat("Registry-DatumLeaseManager-WheelExecutor-%d").build(), + new TaskFailedCallback() { + @Override + public void executionRejected(Throwable e) { + LOGGER.error("executionRejected: " + e.getMessage(), e); + } - @Override - public void executionFailed(Throwable e) { - LOGGER.error("executionFailed: " + e.getMessage(), e); - } - }); + @Override + public void executionFailed(Throwable e) { + LOGGER.error("executionFailed: " + e.getMessage(), e); + } + }); - executorForHeartbeatLess = new ScheduledThreadPoolExecutor(1, - threadFactoryBuilder.setNameFormat("Registry-DatumLeaseManager-ExecutorForHeartbeatLess").build()); + executorForHeartbeatLess = new ScheduledThreadPoolExecutor(1, threadFactoryBuilder + .setNameFormat("Registry-DatumLeaseManager-ExecutorForHeartbeatLess").build()); scheduleEvictTaskForHeartbeatLess(); } @@ -116,7 +120,7 @@ public void executionFailed(Throwable e) { */ public synchronized void reset() { LOGGER.info("reset is called, EvictTaskForHeartbeatLess will delay {}s", - dataServerConfig.getDatumTimeToLiveSec()); + dataServerConfig.getDatumTimeToLiveSec()); if (futureForHeartbeatLess != null) { futureForHeartbeatLess.cancel(false); } @@ -124,9 +128,9 @@ public synchronized void reset() { } private void scheduleEvictTaskForHeartbeatLess() { - futureForHeartbeatLess = executorForHeartbeatLess - .scheduleWithFixedDelay(new EvictTaskForHeartbeatLess(), dataServerConfig.getDatumTimeToLiveSec(), - dataServerConfig.getDatumTimeToLiveSec(), TimeUnit.SECONDS); + futureForHeartbeatLess = executorForHeartbeatLess.scheduleWithFixedDelay( + new EvictTaskForHeartbeatLess(), dataServerConfig.getDatumTimeToLiveSec(), + dataServerConfig.getDatumTimeToLiveSec(), TimeUnit.SECONDS); } /** @@ -239,7 +243,8 @@ private int getOwnPubSize(String connectId) { } private void evict(String connectId) { - disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System.currentTimeMillis(), 0)); + disconnectEventHandler.receive(new ClientDisconnectEvent(connectId, System + .currentTimeMillis(), 0)); } private String format(long lastRenewTime) { @@ -275,7 +280,8 @@ private class EvictTaskForHeartbeatLess implements Runnable { public void run() { // If in a non-working state, cannot clean up because the renew request cannot be received at this time. if (!isRenewEnable()) { - LOGGER.info( + LOGGER + .info( "EvictTaskForHeartbeatLess skipped because isRenewEnable() is false, DataNodeStatus is {}, will retry after {}s", dataNodeStatus.getStatus(), dataServerConfig.getDatumTimeToLiveSec()); return; @@ -288,8 +294,8 @@ public void run() { if (timestamp == null) { int ownPubSize = getOwnPubSize(connectId); if (ownPubSize > 0) { - LOGGER.info("Evict connectId({}) because no heartbeat, pub.size is {}", connectId, - ownPubSize); + LOGGER.info("Evict connectId({}) because no heartbeat, pub.size is {}", + connectId, ownPubSize); evict(connectId); } } From 0ef0e7f4a2d1307559a660f7fcb1330df3a0724d Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 2 Sep 2019 20:43:25 +0800 Subject: [PATCH 108/161] fix datum fetch connect error --- .../dataserver/handler/NotifyFetchDatumHandler.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index 29855bcb3..66a4db1d8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -16,11 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; -import java.util.Map; -import java.util.Map.Entry; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -44,6 +39,10 @@ import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.alipay.sofa.registry.util.ParaCheckUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; +import java.util.Map.Entry; /** * @@ -135,8 +134,7 @@ public Object doHandle(Channel channel, NotifyFetchDatumRequest request) { * @param dataInfoId */ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { - while ((dataServerCache.getDataServers(dataServerConfig.getLocalDataCenter()).keySet()) - .contains(targetIp)) { + while (dataServerConnectionFactory.getConnection(targetIp) != null) { Connection connection = dataServerConnectionFactory.getConnection(targetIp); if (connection == null || !connection.isFine()) { throw new RuntimeException(String.format("connection of %s is not available", From d34c851bbeded55427e844579c91e2d002e50ee1 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 3 Sep 2019 22:55:56 +0800 Subject: [PATCH 109/161] bugfix CacheService: set version zero when first sub and get datum error --- .../session/cache/CacheAccessException.java | 39 +++++++++ .../server/session/cache/CacheService.java | 4 +- .../session/cache/SessionCacheService.java | 26 +++--- .../task/DataChangeFetchCloudTask.java | 32 ++++--- .../scheduler/task/DataChangeFetchTask.java | 31 ++++--- ...faultSubscriberMultiFetchTaskStrategy.java | 87 ++++++++++--------- 6 files changed, 141 insertions(+), 78 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheAccessException.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheAccessException.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheAccessException.java new file mode 100644 index 000000000..7d43cbf65 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheAccessException.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.cache; + +/** + * exception inner cache, e.g. remote invoke error + * @author kezhu.wukz + * @version $Id: CacheAccessException.java, v 0.1 2019-09-02 17:55 kezhu.wukz Exp $ + */ +public class CacheAccessException extends Exception { + public CacheAccessException() { + } + + public CacheAccessException(String message) { + super(message); + } + + public CacheAccessException(String message, Throwable cause) { + super(message, cause); + } + + public CacheAccessException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheService.java index 6b95977ab..30c791f14 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/CacheService.java @@ -30,9 +30,9 @@ public interface CacheService { * @param key * @return */ - Value getValue(Key key); + Value getValue(Key key) throws CacheAccessException; - Map getValues(final Iterable keys); + Map getValues(final Iterable keys) throws CacheAccessException; /** * invalidate cache by keys diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/SessionCacheService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/SessionCacheService.java index ba5c1aab3..65f6bb842 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/SessionCacheService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/cache/SessionCacheService.java @@ -16,17 +16,17 @@ */ package com.alipay.sofa.registry.server.session.cache; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; /** * @@ -84,23 +84,25 @@ private Value generatePayload(Key key) { } @Override - public Value getValue(final Key key) { + public Value getValue(final Key key) throws CacheAccessException { Value payload = null; try { payload = readWriteCacheMap.get(key); - } catch (Throwable t) { - LOGGER.error("Cannot get value for key :" + key, t); + } catch (Throwable e) { + String msg = "Cannot get value for key is:" + key; + throw new CacheAccessException(msg, e); } return payload; } @Override - public Map getValues(final Iterable keys) { + public Map getValues(final Iterable keys) throws CacheAccessException { Map valueMap = null; try { valueMap = readWriteCacheMap.getAll(keys); - } catch (ExecutionException e) { - LOGGER.error("Cannot get value for keys :" + keys, e); + } catch (Throwable e) { + String msg = "Cannot get value for keys are:" + keys; + throw new CacheAccessException(msg, e); } return valueMap; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index 6052833b0..29c00dca3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -26,6 +35,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.cache.CacheAccessException; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumKey; import com.alipay.sofa.registry.server.session.cache.Key; @@ -42,15 +52,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; - /** * * @author shangyu.wh @@ -151,7 +152,8 @@ public void execute() { } public PushTaskClosure getTaskClosure(Map datumMap) { - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,fetchDataInfoId); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(), + sessionServerConfig, fetchDataInfoId); pushTaskClosure.setTaskClosure((status, task) -> { if (status == ProcessingResult.Success) { if (sessionServerConfig.isStopPushSwitch()) { @@ -168,8 +170,7 @@ public PushTaskClosure getTaskClosure(Map datumMap) } else { LOGGER.info( "Push all tasks success,but dataCenter:{} dataInfoId:{} version:{} need not update!", - dataCenter, - dataInfoId, version); + dataCenter, dataInfoId, version); } }); } else { @@ -204,7 +205,12 @@ private Map getDatumsCache() { new DatumKey(fetchDataInfoId, dataCenter))). collect(Collectors.toList()); - Map values = sessionCacheService.getValues(keys); + Map values = null; + try { + values = sessionCacheService.getValues(keys); + } catch (CacheAccessException e) { + LOGGER.error(String.format("error when access cache: %s", e.getMessage()), e); + } if (values != null) { values.forEach((key, value) -> { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 566ebb841..913b40a43 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -26,6 +35,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.cache.CacheAccessException; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumKey; import com.alipay.sofa.registry.server.session.cache.Key; @@ -41,15 +51,6 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.DatumVersionUtil; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - /** * * @author shangyu.wh @@ -197,7 +198,8 @@ private Collection subscribersVersionCheck(Collection su public PushTaskClosure getTaskClosure() { //this for all this dataInfoId push result get and call back to change version - PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(),sessionServerConfig,dataChangeRequest.getDataInfoId()); + PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(), + sessionServerConfig, dataChangeRequest.getDataInfoId()); pushTaskClosure.setTaskClosure((status, task) -> { String dataCenter = dataChangeRequest.getDataCenter(); String dataInfoId = dataChangeRequest.getDataInfoId(); @@ -274,7 +276,14 @@ private Datum getDatumCache() { DatumKey datumKey = new DatumKey(dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter()); Key key = new Key(KeyType.OBJ, datumKey.getClass().getName(), datumKey); - Value value = sessionCacheService.getValue(key); + + Value value = null; + try { + value = sessionCacheService.getValue(key); + } catch (CacheAccessException e) { + LOGGER.error(String.format("error when access cache: %s", e.getMessage()), e); + } + return value == null ? null : value.getPayload(); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberMultiFetchTaskStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberMultiFetchTaskStrategy.java index a33637d65..629c38518 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberMultiFetchTaskStrategy.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSubscriberMultiFetchTaskStrategy.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.session.strategy.impl; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -27,6 +37,7 @@ import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.cache.CacheAccessException; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.cache.DatumKey; import com.alipay.sofa.registry.server.session.cache.Key; @@ -35,19 +46,12 @@ import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; import com.alipay.sofa.registry.server.session.scheduler.task.Constant; +import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.SubscriberMultiFetchTaskStrategy; import com.alipay.sofa.registry.server.session.utils.DatumUtils; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - /** * @author xuanbei * @since 2019/2/15 @@ -60,6 +64,9 @@ public class DefaultSubscriberMultiFetchTaskStrategy implements SubscriberMultiF private static final Logger LOGGER = LoggerFactory .getLogger(DefaultSubscriberMultiFetchTaskStrategy.class); + @Autowired + private Interests sessionInterests; + @Override public void doSubscriberMultiFetchTask(SessionServerConfig sessionServerConfig, TaskListenerManager taskListenerManager, @@ -69,39 +76,29 @@ public void doSubscriberMultiFetchTask(SessionServerConfig sessionServerConfig, Map datumMap = getDatumsCache(fetchDataInfoId, sessionCacheService); - if (datumMap != null) { - - for (ScopeEnum scopeEnum : ScopeEnum.values()) { - Map> map = getPushSubscribers(scopeEnum, - subscribers); - - if (map != null && !map.isEmpty()) { - for (Map.Entry> entry : map - .entrySet()) { - Map subscriberMap = entry.getValue(); - if (subscriberMap != null && !subscriberMap.isEmpty()) { - Subscriber subscriber = subscriberMap.values().iterator().next(); - boolean isOldVersion = !BaseInfo.ClientVersion.StoreData - .equals(subscriber.getClientVersion()); - - if (isOldVersion) { - fireUserDataPushTaskCloud(entry.getKey(), datumMap, - subscriberMap.values(), subscriber, taskListenerManager); - } else { - fireReceivedDataPushTaskCloud(datumMap, - new ArrayList(subscriberMap.keySet()), subscriber, - taskListenerManager); - } + for (ScopeEnum scopeEnum : ScopeEnum.values()) { + Map> map = getPushSubscribers(scopeEnum, + subscribers); + + if (map != null && !map.isEmpty()) { + for (Map.Entry> entry : map.entrySet()) { + Map subscriberMap = entry.getValue(); + if (subscriberMap != null && !subscriberMap.isEmpty()) { + Subscriber subscriber = subscriberMap.values().iterator().next(); + boolean isOldVersion = !BaseInfo.ClientVersion.StoreData.equals(subscriber + .getClientVersion()); + + if (isOldVersion) { + fireUserDataPushTaskCloud(entry.getKey(), datumMap, + subscriberMap.values(), subscriber, taskListenerManager); + } else { + fireReceivedDataPushTaskCloud(datumMap, + new ArrayList(subscriberMap.keySet()), subscriber, + taskListenerManager); } } } } - - } else { - //TODO EMPTY push empty - LOGGER.error( - "SubscriberMultiFetchTask cloud Get publisher data error,which dataInfoId:{}", - fetchDataInfoId); } } @@ -116,7 +113,18 @@ private Map getDatumsCache(String fetchDataInfoId, CacheService s new DatumKey(fetchDataInfoId, dataCenter))). collect(Collectors.toList()); - Map values = sessionCacheService.getValues(keys); + Map values = null; + try { + values = sessionCacheService.getValues(keys); + } catch (CacheAccessException e) { + // The version is set to 0, so that when session checks the datum versions regularly, it will actively re-query the data. + for (String dataCenter : dataCenters) { + boolean result = sessionInterests.checkAndUpdateInterestVersionZero(dataCenter, fetchDataInfoId); + LOGGER.error(String.format( + "error when access cache, so checkAndUpdateInterestVersionZero(return %s): %s", result, + e.getMessage()), e); + } + } if (values != null) { values.forEach((key, value) -> { @@ -140,8 +148,7 @@ private Map> getPushSubscribers(Scope subscribers.forEach((subscriber) -> { if (subscriber.getScope().equals(scopeEnum)) { - InetSocketAddress address = new InetSocketAddress( - subscriber.getSourceAddress().getIpAddress(), + InetSocketAddress address = new InetSocketAddress(subscriber.getSourceAddress().getIpAddress(), subscriber.getSourceAddress().getPort()); Map map = payload.computeIfAbsent(address, k -> new HashMap<>()); map.put(subscriber.getRegisterId(), subscriber); From 0d67f4c53d7518330a2004b0e31babd6a07051cb Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 4 Sep 2019 20:04:25 +0800 Subject: [PATCH 110/161] fix clean task for fetch --- .../dataserver/handler/NotifyFetchDatumHandler.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index 66a4db1d8..d7353e55a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -37,6 +37,7 @@ import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; +import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.alipay.sofa.registry.util.ParaCheckUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -72,6 +73,9 @@ public class NotifyFetchDatumHandler extends AbstractServerHandler> versionMap = request.getDataVersionMap(); long version = request.getChangeVersion(); String ip = request.getIp(); From f1ef9ceb7831e966564ccf78c4134ccfc8eb645b Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 5 Sep 2019 21:11:18 +0800 Subject: [PATCH 111/161] bugfix DatumCache: Forget to clean up the index in datumCache.putSnapshot --- .../alipay/sofa/registry/server/data/cache/DatumCache.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 84e56d4f9..2b076924c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -299,7 +299,10 @@ public Datum putSnapshot(String dataInfoId, Map toBeDeletedPu for (Entry pubEntry : snapshotPubMap.entrySet()) { String registerId = pubEntry.getKey(); Publisher snapshotPub = pubEntry.getValue(); - cacheDatum.getPubMap().put(registerId, snapshotPub); + Publisher cachePub = cacheDatum.getPubMap().put(registerId, snapshotPub); + if (cachePub != null) { + removeFromIndex(cachePub); + } addToIndex(snapshotPub); } From aaf1cd48a4d8ad26bc59a3b438bbb6b89bf5ba69 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 13 Sep 2019 11:18:06 +0800 Subject: [PATCH 112/161] Session&Data increase WordCache use --- .../common/model/dataserver/Datum.java | 6 ++-- .../registry/common/model/store/BaseInfo.java | 10 +++--- .../common/model/store/Publisher.java | 15 +++----- .../common/model/store/Subscriber.java | 25 ++++++++++++-- .../registry/common/model/store/Watcher.java | 19 +++++++++++ .../common/model/store/WordCache.java | 8 ++--- .../server/data/cache/DatumCache.java | 3 +- .../remoting/dataserver/SyncDataCallback.java | 25 ++++---------- .../handler/NotifyFetchDatumHandler.java | 13 ++++--- .../handler/DatumSnapshotHandler.java | 34 +++++++++++++------ .../handler/PublishDataHandler.java | 6 ++-- .../handler/RenewDatumHandler.java | 3 +- .../handler/UnPublishDataHandler.java | 3 +- .../node/service/DataNodeServiceImpl.java | 2 +- .../session/store/SessionDataStore.java | 23 +++++-------- .../session/store/SessionInterests.java | 25 ++++++++------ .../server/session/store/SessionWatchers.java | 16 +++++---- 17 files changed, 141 insertions(+), 95 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java index 246363fa0..704c03d87 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java @@ -62,7 +62,7 @@ public Datum() { * @param dataCenter */ public Datum(String dataInfoId, String dataCenter) { - this.dataInfoId = dataInfoId; + this.dataInfoId = WordCache.getInstance().getWordCache(dataInfoId); this.dataCenter = WordCache.getInstance().getWordCache(dataCenter); updateVersion(); } @@ -244,7 +244,7 @@ public void setContainsUnPub(boolean containsUnPub) { this.containsUnPub = containsUnPub; } - public static Datum processDatum(Datum datum) { + public static Datum internDatum(Datum datum) { datum.setDataCenter(datum.getDataCenter()); datum.setDataInfoId(datum.getDataInfoId()); datum.setDataId(datum.getDataId()); @@ -253,7 +253,7 @@ public static Datum processDatum(Datum datum) { Map pubMap = datum.getPubMap(); if (pubMap != null && !pubMap.isEmpty()) { - pubMap.forEach((registerId, publisher) -> Publisher.processPublisher(publisher)); + pubMap.forEach((registerId, publisher) -> Publisher.internPublisher(publisher)); } return datum; diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java index 2242e5354..38cdddc1a 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java @@ -16,12 +16,12 @@ */ package com.alipay.sofa.registry.common.model.store; -import com.fasterxml.jackson.annotation.JsonIgnore; - import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonIgnore; + /** * * @author shangyu.wh @@ -136,7 +136,7 @@ public String getProcessId() { * @param processId value to be assigned to property processId */ public void setProcessId(String processId) { - this.processId = processId; + this.processId = WordCache.getInstance().getWordCache(processId); } /** @@ -237,7 +237,7 @@ public String getRegisterId() { * @param registerId value to be assigned to property registerId */ public void setRegisterId(String registerId) { - this.registerId = registerId; + this.registerId = WordCache.getInstance().getWordCache(registerId); } /** @@ -273,7 +273,7 @@ public String getClientId() { * @param clientId value to be assigned to property clientId */ public void setClientId(String clientId) { - this.clientId = clientId; + this.clientId = WordCache.getInstance().getWordCache(clientId); } /** diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Publisher.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Publisher.java index 8ecd7566b..a216732aa 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Publisher.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Publisher.java @@ -16,12 +16,12 @@ */ package com.alipay.sofa.registry.common.model.store; +import java.util.List; + import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.ServerDataBox; import com.fasterxml.jackson.annotation.JsonIgnore; -import java.util.List; - /** * * @author shangyu.wh @@ -90,8 +90,8 @@ protected String getOtherInfo() { * @param publisher * @return */ - public static Publisher processPublisher(Publisher publisher) { - + public static Publisher internPublisher(Publisher publisher) { + publisher.setRegisterId(publisher.getRegisterId()); publisher.setDataInfoId(publisher.getDataInfoId()); publisher.setInstanceId(publisher.getInstanceId()); publisher.setGroup(publisher.getGroup()); @@ -101,13 +101,6 @@ public static Publisher processPublisher(Publisher publisher) { publisher.setProcessId(publisher.getProcessId()); publisher.setAppName(publisher.getAppName()); - if (publisher.getSourceAddress() != null) { - publisher.setSourceAddress(new URL(publisher.getSourceAddress().getIpAddress(), - publisher.getSourceAddress().getPort())); - } - - publisher.setAttributes(publisher.getAttributes()); - return publisher; } diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java index 2f0b8b78d..7dc9dcfb6 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java @@ -16,13 +16,13 @@ */ package com.alipay.sofa.registry.common.model.store; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import com.alipay.sofa.registry.common.model.ElementType; import com.alipay.sofa.registry.core.model.ScopeEnum; import com.fasterxml.jackson.annotation.JsonIgnore; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * * @author shangyu.wh @@ -161,4 +161,23 @@ public String toString() { sb.append('}'); return sb.toString(); } + + /** + * change subscriber word cache + * @param subscriber + * @return + */ + public static Subscriber internSubscriber(Subscriber subscriber) { + subscriber.setRegisterId(subscriber.getRegisterId()); + subscriber.setDataInfoId(subscriber.getDataInfoId()); + subscriber.setInstanceId(subscriber.getInstanceId()); + subscriber.setGroup(subscriber.getGroup()); + subscriber.setDataId(subscriber.getDataId()); + subscriber.setClientId(subscriber.getClientId()); + subscriber.setCell(subscriber.getCell()); + subscriber.setProcessId(subscriber.getProcessId()); + subscriber.setAppName(subscriber.getAppName()); + + return subscriber; + } } \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Watcher.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Watcher.java index 6ffa610f9..f369d5e4e 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Watcher.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Watcher.java @@ -27,4 +27,23 @@ public class Watcher extends BaseInfo { public DataType getDataType() { return DataType.WATCHER; } + + /** + * change watcher word cache + * @param watcher + * @return + */ + public static Watcher internWatcher(Watcher watcher) { + watcher.setRegisterId(watcher.getRegisterId()); + watcher.setDataInfoId(watcher.getDataInfoId()); + watcher.setInstanceId(watcher.getInstanceId()); + watcher.setGroup(watcher.getGroup()); + watcher.setDataId(watcher.getDataId()); + watcher.setClientId(watcher.getClientId()); + watcher.setCell(watcher.getCell()); + watcher.setProcessId(watcher.getProcessId()); + watcher.setAppName(watcher.getAppName()); + + return watcher; + } } \ No newline at end of file diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/WordCache.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/WordCache.java index 2734c8ac0..f00e3c938 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/WordCache.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/WordCache.java @@ -16,7 +16,8 @@ */ package com.alipay.sofa.registry.common.model.store; -import java.util.concurrent.ConcurrentHashMap; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; /** * @@ -45,7 +46,7 @@ public static WordCache getInstance() { /** * word cache map */ - private ConcurrentHashMap map = new ConcurrentHashMap<>(); + private Interner interners = Interners.newWeakInterner(); /** * @@ -56,8 +57,7 @@ public String getWordCache(String s) { if (s == null) { return null; } - String oldValue = map.putIfAbsent(s, s); - return oldValue == null ? s : oldValue; + return interners.intern(s); } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 2b076924c..70c8b22df 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -28,6 +28,7 @@ import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; import com.alipay.sofa.registry.server.data.node.DataServerNode; @@ -396,7 +397,7 @@ private void addToIndex(Publisher publisher) { } private String getConnectId(Publisher cachePub) { - return cachePub.getSourceAddress().getAddressString(); + return WordCache.getInstance().getWordCache(cachePub.getSourceAddress().getAddressString()); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java index a5785f314..a721ee718 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java @@ -16,24 +16,23 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver; +import java.util.Collection; +import java.util.concurrent.Executor; + +import org.springframework.util.CollectionUtils; + import com.alipay.remoting.Connection; import com.alipay.remoting.InvokeCallback; import com.alipay.sofa.registry.common.model.GenericResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.SyncData; import com.alipay.sofa.registry.common.model.dataserver.SyncDataRequest; -import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.data.change.DataChangeTypeEnum; import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; import com.alipay.sofa.registry.server.data.change.event.DataChangeEventCenter; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; -import org.springframework.util.CollectionUtils; - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.Executor; /** * @@ -96,7 +95,7 @@ public void onResponse(Object obj) { datum.setDataInfoId(syncData.getDataInfoId()); datum.setDataCenter(syncData.getDataCenter()); } - processDatum(datum); + Datum.internDatum(datum); dataChangeEventCenter.sync(DataChangeTypeEnum.COVER, dataSourceTypeEnum, datum); break; } @@ -105,7 +104,7 @@ public void onResponse(Object obj) { if (!CollectionUtils.isEmpty(datums)) { for (Datum datum : datums) { if (datum != null) { - processDatum(datum); + Datum.internDatum(datum); dataChangeEventCenter.sync(DataChangeTypeEnum.MERGE, dataSourceTypeEnum, datum); } @@ -117,16 +116,6 @@ public void onResponse(Object obj) { } } - private void processDatum(Datum datum) { - if (datum != null) { - Map publisherMap = datum.getPubMap(); - - if (publisherMap != null && !publisherMap.isEmpty()) { - publisherMap.forEach((registerId, publisher) -> Publisher.processPublisher(publisher)); - } - } - } - @Override public void onException(Throwable e) { GenericResponse genericResponse = new GenericResponse(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index d7353e55a..0ce67747d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -16,6 +16,11 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver.handler; +import java.util.Map; +import java.util.Map.Entry; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -40,10 +45,6 @@ import com.alipay.sofa.registry.server.data.renew.LocalDataServerCleanHandler; import com.alipay.sofa.registry.server.data.util.TimeUtil; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Map; -import java.util.Map.Entry; /** * @@ -156,6 +157,10 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { dataServerConfig.getRpcTimeout()); if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); + + // wrap by WordCache + datum = Datum.internDatum(datum); + if (datum != null) { dataChangeEventCenter.sync(DataChangeTypeEnum.COVER, DataSourceTypeEnum.BACKUP, datum); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java index 3c43fc486..6b281aff1 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DatumSnapshotHandler.java @@ -18,12 +18,12 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +33,7 @@ import com.alipay.sofa.registry.common.model.PublisherDigestUtil; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -85,16 +86,26 @@ public void checkParam(DatumSnapshotRequest request) throws RuntimeException { public Object doHandle(Channel channel, DatumSnapshotRequest request) { RENEW_LOGGER.info("Received datumSnapshotRequest: {}", request); - Map pubMap = request.getPublishers().stream() - .collect(Collectors.toMap(p -> p.getRegisterId(), p -> p)); + String connectId = WordCache.getInstance().getWordCache(request.getConnectId()); + + // convert to pubMap, and wrap it by WordCache + Map pubMap = new HashMap<>(); + List publishers = request.getPublishers(); + if (publishers != null) { + for (Publisher publisher : publishers) { + Publisher.internPublisher(publisher); + pubMap.put(publisher.getRegisterId(), publisher); + } + } // diff the cache and snapshot boolean isDiff = true; - Map cachePubMap = datumCache.getOwnByConnectId(request.getConnectId()); + Map cachePubMap = datumCache.getOwnByConnectId(connectId); if (cachePubMap == null) { RENEW_LOGGER - .info(">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, isDiff={}, the diff is: pubMap={}", - request.getConnectId(), pubMap.size(), isDiff, limitedToString(pubMap.values())); + .info( + ">>>>>>> connectId={}, cachePubMap.size=0, pubMap.size={}, isDiff={}, the diff is: pubMap={}", + connectId, pubMap.size(), isDiff, limitedToString(pubMap.values())); } else { List diffPub1 = subtract(pubMap, cachePubMap); List diffPub2 = subtract(cachePubMap, pubMap); @@ -102,18 +113,19 @@ public Object doHandle(Channel channel, DatumSnapshotRequest request) { isDiff = false; } RENEW_LOGGER - .info(">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, isDiff={}, the diff is: pubMap-cachePubMap=(size:{}){}, cachePubMap-pubMap=(size:{}){}", - request.getConnectId(), cachePubMap.size(), pubMap.size(), isDiff, diffPub1.size(), - limitedToString(diffPub1), diffPub2.size(), limitedToString(diffPub2)); + .info( + ">>>>>>> connectId={}, cachePubMap.size={}, pubMap.size={}, isDiff={}, the diff is: pubMap-cachePubMap=(size:{}){}, cachePubMap-pubMap=(size:{}){}", + connectId, cachePubMap.size(), pubMap.size(), isDiff, diffPub1.size(), + limitedToString(diffPub1), diffPub2.size(), limitedToString(diffPub2)); } if (isDiff) { // build DatumSnapshotEvent and send to eventCenter - dataChangeEventCenter.onChange(new DatumSnapshotEvent(request.getConnectId(), cachePubMap, pubMap)); + dataChangeEventCenter.onChange(new DatumSnapshotEvent(connectId, cachePubMap, pubMap)); } // record the renew timestamp - datumLeaseManager.renew(request.getConnectId()); + datumLeaseManager.renew(connectId); return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java index ffbbaab46..130913539 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/PublishDataHandler.java @@ -26,6 +26,7 @@ import com.alipay.sofa.registry.common.model.PublishType; import com.alipay.sofa.registry.common.model.dataserver.PublishDataRequest; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -85,7 +86,7 @@ public void checkParam(PublishDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, PublishDataRequest request) { - Publisher publisher = Publisher.processPublisher(request.getPublisher()); + Publisher publisher = Publisher.internPublisher(request.getPublisher()); if (forwardService.needForward()) { LOGGER.warn("[forward] Publish request refused, request: {}", request); CommonResponse response = new CommonResponse(); @@ -97,7 +98,8 @@ public Object doHandle(Channel channel, PublishDataRequest request) { dataChangeEventCenter.onChange(publisher, dataServerConfig.getLocalDataCenter()); if (publisher.getPublishType() != PublishType.TEMPORARY) { - String connectId = publisher.getSourceAddress().getAddressString(); + String connectId = WordCache.getInstance().getWordCache( + publisher.getSourceAddress().getAddressString()); sessionServerConnectionFactory.registerConnectId(request.getSessionServerProcessId(), connectId); // record the renew timestamp diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index 3004b3bdd..c7de949fc 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -32,6 +32,7 @@ import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -132,7 +133,7 @@ protected Node.NodeType getConnectNodeType() { * 2. Compare checksum: Get all pubs corresponding to the connId from datumCache and calculate checksum. */ private boolean renewDatum(RenewDatumRequest request) { - String connectId = request.getConnectId(); + String connectId = WordCache.getInstance().getWordCache(request.getConnectId()); String renewDigest = request.getDigestSum(); // Get all pubs corresponding to the connectId from datumCache diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java index 42e335664..14cb509fc 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/UnPublishDataHandler.java @@ -27,6 +27,7 @@ import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.UnPublishDataRequest; import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -94,7 +95,7 @@ public Object doHandle(Channel channel, UnPublishDataRequest request) { .getRegisterTimestamp()), dataServerConfig.getLocalDataCenter()); // Attempt to get connectId from datumCache (Datum may not exist), and record the renew timestamp - String connectId = getConnectId(request); + String connectId = WordCache.getInstance().getWordCache(getConnectId(request)); if (connectId != null) { datumLeaseManager.renew(connectId); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index afd2bf2ff..891d6afa1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -341,7 +341,7 @@ public URL getRequestUrl() { if (map == null || map.isEmpty()) { LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}", dataCenterId); } else { - map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); + map.forEach((dataCenter, datum) -> Datum.internDatum(datum)); } } else { throw new RuntimeException( diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java index 6bd16b497..4273dc622 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.server.session.store; -import com.alipay.sofa.registry.common.model.store.Publisher; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; - import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -28,6 +24,11 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.WordCache; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; + /** * * @author shangyu.wh @@ -51,6 +52,8 @@ public class SessionDataStore implements DataStore { @Override public void add(Publisher publisher) { + Publisher.internPublisher(publisher); + write.lock(); try { Map publishers = registry.get(publisher.getDataInfoId()); @@ -209,8 +212,9 @@ public long count() { } private void addToConnectIndex(Publisher publisher) { + String connectId = WordCache.getInstance().getWordCache( + publisher.getSourceAddress().getAddressString()); - String connectId = publisher.getSourceAddress().getAddressString(); Map publisherMap = connectIndex.get(connectId); if (publisherMap == null) { Map newPublisherMap = new ConcurrentHashMap<>(); @@ -233,15 +237,6 @@ private void removeFromConnectIndex(Publisher publisher) { } } - private void invalidateIndex(Publisher publisher) { - String connectId = publisher.getSourceAddress().getAddressString(); - invalidateConnectIndex(connectId); - } - - private void invalidateConnectIndex(String connectId) { - connectIndex.remove(connectId); - } - @Override public Map> getConnectPublishers() { return connectIndex; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index fd5cb9595..0048d35d3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.session.store; -import com.alipay.sofa.registry.common.model.store.Subscriber; -import com.alipay.sofa.registry.core.model.ScopeEnum; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.cache.SubscriberResult; -import com.alipay.sofa.registry.util.VersionsMapUtils; -import org.springframework.beans.factory.annotation.Autowired; - import java.net.InetSocketAddress; import java.util.Collection; import java.util.Iterator; @@ -34,6 +25,17 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.common.model.store.Subscriber; +import com.alipay.sofa.registry.common.model.store.WordCache; +import com.alipay.sofa.registry.core.model.ScopeEnum; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.cache.SubscriberResult; +import com.alipay.sofa.registry.util.VersionsMapUtils; + /** * * @author shangyu.wh @@ -71,6 +73,7 @@ public class SessionInterests implements Interests, ReSubscribers { @Override public void add(Subscriber subscriber) { + Subscriber.internSubscriber(subscriber); write.lock(); try { @@ -231,6 +234,7 @@ public boolean checkInterestVersions(String dataCenter, String dataInfoId, Long public boolean checkAndUpdateInterestVersions(String dataCenter, String dataInfoId, Long version) { read.lock(); try { + dataInfoId = WordCache.getInstance().getWordCache(dataInfoId); Map subscribers = interests.get(dataInfoId); @@ -285,8 +289,9 @@ private void invalidateIndex(Subscriber subscriber) { } private void addConnectIndex(Subscriber subscriber) { - String connectId = subscriber.getSourceAddress().getAddressString(); + connectId = WordCache.getInstance().getWordCache(connectId); + Map subscriberMap = connectIndex.get(connectId); if (subscriberMap == null) { Map newSubscriberMap = new ConcurrentHashMap<>(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionWatchers.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionWatchers.java index 381dbebe8..91edef853 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionWatchers.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionWatchers.java @@ -16,11 +16,6 @@ */ package com.alipay.sofa.registry.server.session.store; -import com.alipay.sofa.registry.common.model.store.Watcher; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.util.VersionsMapUtils; - import java.util.Collection; import java.util.HashMap; import java.util.Iterator; @@ -30,6 +25,12 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.alipay.sofa.registry.common.model.store.Watcher; +import com.alipay.sofa.registry.common.model.store.WordCache; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.util.VersionsMapUtils; + /** * * @author shangyu.wh @@ -60,6 +61,8 @@ public class SessionWatchers implements Watchers { @Override public void add(Watcher watcher) { + Watcher.internWatcher(watcher); + write.lock(); try { Map watcherMap = watchers.get(watcher.getDataInfoId()); @@ -198,8 +201,9 @@ public long count() { } private void addConnectIndex(Watcher watcher) { - String connectId = watcher.getSourceAddress().getAddressString(); + connectId = WordCache.getInstance().getWordCache(connectId); + Map subscriberMap = connectIndex.get(connectId); if (subscriberMap == null) { Map newSubscriberMap = new ConcurrentHashMap<>(); From 75257c1909865c5079154db629991f318ba42068 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sat, 14 Sep 2019 09:21:48 +0800 Subject: [PATCH 113/161] code optimize --- .../server/data/bootstrap/DataServerConfig.java | 4 ++-- .../registry/server/data/cache/DatumCache.java | 13 ++++++------- .../dataserver/DataServerNodeFactory.java | 16 ++++++++-------- .../handler/GetDataVersionsHandler.java | 8 +++++--- .../sessionserver/handler/RenewDatumHandler.java | 3 +-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 48578eb8f..4c35ab7a0 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -95,13 +95,13 @@ public class DataServerConfig { private int notifySessionRetryTimes = 10; - private int publishExecutorMinPoolSize = 80; + private int publishExecutorMinPoolSize = 200; private int publishExecutorMaxPoolSize = 400; private int publishExecutorQueueSize = 10000; - private int renewDatumExecutorMinPoolSize = 50; + private int renewDatumExecutorMinPoolSize = 100; private int renewDatumExecutorMaxPoolSize = 400; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 70c8b22df..09f824387 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -71,11 +71,9 @@ public class DatumCache { * @return */ public Datum get(String dataCenter, String dataInfoId) { - if (DATUM_MAP.containsKey(dataCenter)) { - Map map = DATUM_MAP.get(dataCenter); - if (map.containsKey(dataInfoId)) { - return map.get(dataInfoId); - } + Map map = DATUM_MAP.get(dataCenter); + if (map != null) { + return map.get(dataInfoId); } return null; } @@ -89,8 +87,9 @@ public Datum get(String dataCenter, String dataInfoId) { public Map get(String dataInfoId) { Map datumMap = new HashMap<>(); DATUM_MAP.forEach((dataCenter, datums) -> { - if (datums.containsKey(dataInfoId)) { - datumMap.put(dataCenter, datums.get(dataInfoId)); + Datum datum = datums.get(dataInfoId); + if (datum != null) { + datumMap.put(dataCenter, datum); } }); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java index f13e88355..fb511a683 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/DataServerNodeFactory.java @@ -16,12 +16,6 @@ */ package com.alipay.sofa.registry.server.data.remoting.dataserver; -import com.alipay.remoting.Connection; -import com.alipay.sofa.registry.consistency.hash.ConsistentHash; -import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; -import com.alipay.sofa.registry.server.data.node.DataServerNode; -import com.google.common.collect.Lists; - import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -30,6 +24,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import com.alipay.remoting.Connection; +import com.alipay.sofa.registry.consistency.hash.ConsistentHash; +import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; +import com.alipay.sofa.registry.server.data.node.DataServerNode; +import com.google.common.collect.Lists; + /** * the factory to hold other dataservers and connection connected to them * @@ -194,7 +194,7 @@ public static void remove(String dataCenter) { public static DataServerNode computeDataServerNode(String dataCenter, String dataInfoId) { ConsistentHash consistentHash = CONSISTENT_HASH_MAP.get(dataCenter); if (consistentHash != null) { - return CONSISTENT_HASH_MAP.get(dataCenter).getNodeFor(dataInfoId); + return consistentHash.getNodeFor(dataInfoId); } return null; } @@ -203,7 +203,7 @@ public static List computeDataServerNodes(String dataCenter, Str int backupNodes) { ConsistentHash consistentHash = CONSISTENT_HASH_MAP.get(dataCenter); if (consistentHash != null) { - return CONSISTENT_HASH_MAP.get(dataCenter).getNUniqueNodesFor(dataInfoId, backupNodes); + return consistentHash.getNUniqueNodesFor(dataInfoId, backupNodes); } return null; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java index 268425b14..756280f63 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/GetDataVersionsHandler.java @@ -74,10 +74,12 @@ public Object doHandle(Channel channel, GetDataVersionRequest request) { String dataCenter = entry.getKey(); Datum datum = entry.getValue(); if (datum != null) { - if (!map.containsKey(dataCenter)) { - map.put(dataCenter, new HashMap<>()); + Map dataInfoIdToVersionMap = map.get(dataCenter); + if (dataInfoIdToVersionMap == null) { + dataInfoIdToVersionMap = new HashMap<>(dataInfoIds.size()); + map.put(dataCenter, dataInfoIdToVersionMap); } - map.get(dataCenter).put(dataInfoId, datum.getVersion()); + dataInfoIdToVersionMap.put(dataInfoId, datum.getVersion()); } } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java index c7de949fc..8462f244b 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/RenewDatumHandler.java @@ -95,8 +95,7 @@ public Object doHandle(Channel channel, RenewDatumRequest request) { } if (!renewEnabled.get()) { - LOGGER.warn("[forward] Renew request refused, renewEnabled is false, request: {}", - request); + LOGGER.warn("Renew request refused, renewEnabled is false, request: {}", request); GenericResponse response = new GenericResponse(); response.setSuccess(false); response.setMessage("Renew request refused, renewEnabled is false yet"); From fb3948269b972c5f8c585716c13c557e92e16a42 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 16 Sep 2019 11:28:51 +0800 Subject: [PATCH 114/161] WordCache: registerId do not add WordCache --- .../com/alipay/sofa/registry/common/model/store/BaseInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java index 38cdddc1a..81b470778 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/BaseInfo.java @@ -237,7 +237,7 @@ public String getRegisterId() { * @param registerId value to be assigned to property registerId */ public void setRegisterId(String registerId) { - this.registerId = WordCache.getInstance().getWordCache(registerId); + this.registerId = registerId; } /** From 2af838ec5ce14cdcf611c75dcaed7bb54670edff Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 16 Sep 2019 15:44:18 +0800 Subject: [PATCH 115/161] fix fetch datum word cache --- .../dataserver/handler/NotifyFetchDatumHandler.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index d7353e55a..828452533 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -23,6 +23,7 @@ import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; import com.alipay.sofa.registry.common.model.dataserver.NotifyFetchDatumRequest; +import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -157,6 +158,7 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); if (datum != null) { + processDatum(datum); dataChangeEventCenter.sync(DataChangeTypeEnum.COVER, DataSourceTypeEnum.BACKUP, datum); LOGGER @@ -175,6 +177,16 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { } } + private void processDatum(Datum datum) { + if (datum != null) { + Map publisherMap = datum.getPubMap(); + + if (publisherMap != null && !publisherMap.isEmpty()) { + publisherMap.forEach((registerId, publisher) -> Publisher.processPublisher(publisher)); + } + } + } + @Override public CommonResponse buildFailedResponse(String msg) { return CommonResponse.buildFailedResponse(msg); From a18c92cd5b6af2a53b6118f7fa6a7a31ecc1d5de Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 16 Sep 2019 20:23:17 +0800 Subject: [PATCH 116/161] fix NotifyFetchDatumHandler npe --- .../handler/NotifyFetchDatumHandler.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index 21e2f24b6..996c1e328 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -28,7 +28,6 @@ import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; import com.alipay.sofa.registry.common.model.dataserver.NotifyFetchDatumRequest; -import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -159,11 +158,11 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); - // wrap by WordCache - datum = Datum.internDatum(datum); if (datum != null) { - processDatum(datum); + // wrap by WordCache + datum = Datum.internDatum(datum); + dataChangeEventCenter.sync(DataChangeTypeEnum.COVER, DataSourceTypeEnum.BACKUP, datum); LOGGER @@ -182,16 +181,6 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { } } - private void processDatum(Datum datum) { - if (datum != null) { - Map publisherMap = datum.getPubMap(); - - if (publisherMap != null && !publisherMap.isEmpty()) { - publisherMap.forEach((registerId, publisher) -> Publisher.processPublisher(publisher)); - } - } - } - @Override public CommonResponse buildFailedResponse(String msg) { return CommonResponse.buildFailedResponse(msg); From 8083bce69b7f442e39ff893c64a93e007539c615 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 23 Sep 2019 16:41:57 +0800 Subject: [PATCH 117/161] fix test case time --- .../registry/test/resource/meta/StopPushDataSwitchTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java index 61bff0670..f938fe223 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java @@ -60,7 +60,7 @@ public void testStopPushDataSwitch() throws Exception { String value = "test stop publish data switch"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(1000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); @@ -105,7 +105,7 @@ public void testStopPushDataSwitchByCode() throws Exception { String value = "test stop publish data switch by code"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(1000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); From a6d5d42444a8e2ec7e12003af4c2ac0811d6c527 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 23 Sep 2019 17:20:51 +0800 Subject: [PATCH 118/161] fix test cast --- .../alipay/sofa/registry/test/resource/meta/BlacklistTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java index 9d22878bd..64c76b864 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java @@ -117,6 +117,8 @@ public void testBlacklistUpdatePub() throws Exception { assertTrue(response.isSuccess()); + BaseIntegrationTest.dataId = null; + //wait for new list meta dispatch to session Thread.sleep(1000L); @@ -188,6 +190,7 @@ public void testBlacklistUpdateSub() throws Exception { assertTrue(response.isSuccess()); + BaseIntegrationTest.dataId = null; //wait for new list meta dispatch to session Thread.sleep(1000L); From 086ddd64138e4f0058f2260da210f2eced1e173d Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 23 Sep 2019 18:06:16 +0800 Subject: [PATCH 119/161] fix test case --- .../resource/meta/StopPushDataSwitchTest.java | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java index f938fe223..f94db1559 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.test.resource.meta; import com.alipay.sofa.registry.client.api.model.RegistryType; +import com.alipay.sofa.registry.client.api.model.UserData; import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; import com.alipay.sofa.registry.common.model.store.Subscriber; @@ -35,6 +36,7 @@ import org.springframework.util.CollectionUtils; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; @@ -53,7 +55,8 @@ public void testStopPushDataSwitch() throws Exception { // open stop push switch assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/open") .request(APPLICATION_JSON).get(Result.class).isSuccess()); - BaseIntegrationTest.dataId = null; + AtomicReference dataIdResult = new AtomicReference<>(); + AtomicReference userDataResult = new AtomicReference<>(); // register Publisher & Subscriber, Subscriber get no data String dataId = "test-dataId-" + System.currentTimeMillis(); @@ -63,11 +66,14 @@ public void testStopPushDataSwitch() throws Exception { Thread.sleep(1000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, - new MySubscriberDataObserver()); + (dataIdOb, data) -> { + dataIdResult.set(dataIdOb); + userDataResult.set(data); + }); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); Thread.sleep(1000L); - assertNull(BaseIntegrationTest.dataId); + assertNull(dataIdResult.get()); // close stop push switch assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/close") @@ -75,13 +81,13 @@ public void testStopPushDataSwitch() throws Exception { Thread.sleep(1000L); // Subscriber get data, test data - assertEquals(dataId, this.dataId); - assertEquals(LOCAL_REGION, userData.getLocalZone()); - assertEquals(1, userData.getZoneData().size()); - assertEquals(1, userData.getZoneData().values().size()); - assertEquals(true, userData.getZoneData().containsKey(LOCAL_REGION)); - assertEquals(1, userData.getZoneData().get(LOCAL_REGION).size()); - assertEquals(value, userData.getZoneData().get(LOCAL_REGION).get(0)); + assertEquals(dataId, dataIdResult.get()); + assertEquals(LOCAL_REGION, userDataResult.get().getLocalZone()); + assertEquals(1, userDataResult.get().getZoneData().size()); + assertEquals(1, userDataResult.get().getZoneData().values().size()); + assertEquals(true, userDataResult.get().getZoneData().containsKey(LOCAL_REGION)); + assertEquals(1, userDataResult.get().getZoneData().get(LOCAL_REGION).size()); + assertEquals(value, userDataResult.get().getZoneData().get(LOCAL_REGION).get(0)); // unregister Publisher & Subscriber registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); @@ -98,7 +104,8 @@ public void testStopPushDataSwitchByCode() throws Exception { assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/open").request(APPLICATION_JSON) .get(Result.class) .isSuccess()); - BaseIntegrationTest.dataId = null; + AtomicReference dataIdResult = new AtomicReference<>(); + AtomicReference userDataResult = new AtomicReference<>(); // register Publisher & Subscriber, Subscriber get no data String dataId = "test-dataId-hahhahahahha-" + System.currentTimeMillis(); @@ -107,11 +114,15 @@ public void testStopPushDataSwitchByCode() throws Exception { registryClient1.register(registration, value); Thread.sleep(1000L); - SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + (dataIdOb, data) -> { + dataIdResult.set(dataIdOb); + userDataResult.set(data); + }); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); Thread.sleep(1000L); - assertNull(BaseIntegrationTest.dataId); + assertNull(dataIdResult.get()); // invoke code directly Interests sessionInterests = sessionApplicationContext.getBean(Interests.class); @@ -138,13 +149,13 @@ public void testStopPushDataSwitchByCode() throws Exception { Thread.sleep(1000); // Subscriber get data, test data - assertEquals(dataId, this.dataId); - assertEquals(LOCAL_REGION, userData.getLocalZone()); - assertEquals(1, userData.getZoneData().size()); - assertEquals(1, userData.getZoneData().values().size()); - assertEquals(true, userData.getZoneData().containsKey(LOCAL_REGION)); - assertEquals(1, userData.getZoneData().get(LOCAL_REGION).size()); - assertEquals(value, userData.getZoneData().get(LOCAL_REGION).get(0)); + assertEquals(dataId, dataIdResult.get()); + assertEquals(LOCAL_REGION, userDataResult.get().getLocalZone()); + assertEquals(1, userDataResult.get().getZoneData().size()); + assertEquals(1, userDataResult.get().getZoneData().values().size()); + assertEquals(true, userDataResult.get().getZoneData().containsKey(LOCAL_REGION)); + assertEquals(1, userDataResult.get().getZoneData().get(LOCAL_REGION).size()); + assertEquals(value, userDataResult.get().getZoneData().get(LOCAL_REGION).get(0)); // unregister Publisher & Subscriber, close stop push switch registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); From 932be4af6952d7ee7b350cc7bad31a30cdd49b5d Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 23 Sep 2019 21:54:18 +0800 Subject: [PATCH 120/161] fix tast case --- .../resource/meta/StopPushDataSwitchTest.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java index f94db1559..d66dcb1bd 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java @@ -61,6 +61,13 @@ public void testStopPushDataSwitch() throws Exception { // register Publisher & Subscriber, Subscriber get no data String dataId = "test-dataId-" + System.currentTimeMillis(); String value = "test stop publish data switch"; + + System.out.println("dataidIn:"+dataId); + + SessionServerConfig sessionServerConfig = sessionApplicationContext.getBean(SessionServerConfig.class); + + System.out.println("sessionServerConfig.isStopPushSwitch:"+sessionServerConfig.isStopPushSwitch()); + PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); Thread.sleep(1000L); @@ -110,6 +117,12 @@ public void testStopPushDataSwitchByCode() throws Exception { // register Publisher & Subscriber, Subscriber get no data String dataId = "test-dataId-hahhahahahha-" + System.currentTimeMillis(); String value = "test stop publish data switch by code"; + + System.out.println("dataidIn2:"+dataId); + + SessionServerConfig sessionServerConfig = sessionApplicationContext.getBean(SessionServerConfig.class); + + System.out.println("sessionServerConfig.isStopPushSwitch2:"+sessionServerConfig.isStopPushSwitch()); PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); Thread.sleep(1000L); @@ -127,7 +140,7 @@ public void testStopPushDataSwitchByCode() throws Exception { // invoke code directly Interests sessionInterests = sessionApplicationContext.getBean(Interests.class); TaskListenerManager taskListenerManager = sessionApplicationContext.getBean(TaskListenerManager.class); - SessionServerConfig sessionServerConfig = sessionApplicationContext.getBean(SessionServerConfig.class); + if (sessionInterests instanceof ReSubscribers) { ReSubscribers reSubscriber = (ReSubscribers) sessionInterests; From 2fe9e646633c6b78701dd3009e2077988cc5d014 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 12:01:18 +0800 Subject: [PATCH 121/161] fix ut case: StopPushDataSwitchTest --- test/src/main/resources/logback-spring.xml | 4 +- .../resource/meta/StopPushDataSwitchTest.java | 90 +++++++++++-------- 2 files changed, 53 insertions(+), 41 deletions(-) diff --git a/test/src/main/resources/logback-spring.xml b/test/src/main/resources/logback-spring.xml index adbee9009..a1f43c7db 100644 --- a/test/src/main/resources/logback-spring.xml +++ b/test/src/main/resources/logback-spring.xml @@ -4,14 +4,14 @@ - + [%d{ISO8601}][%p][%t][%c{0}] - %m%n - WARN + INFO diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java index d66dcb1bd..eacb377d1 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java @@ -16,6 +16,22 @@ */ package com.alipay.sofa.registry.test.resource.meta; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.CollectionUtils; + import com.alipay.sofa.registry.client.api.model.RegistryType; import com.alipay.sofa.registry.client.api.model.UserData; import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; @@ -30,19 +46,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.test.BaseIntegrationTest; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.util.CollectionUtils; - -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; /** * @author xuanbei @@ -50,11 +53,17 @@ */ @RunWith(SpringRunner.class) public class StopPushDataSwitchTest extends BaseIntegrationTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(StopPushDataSwitchTest.class); + @Test public void testStopPushDataSwitch() throws Exception { // open stop push switch - assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/open") - .request(APPLICATION_JSON).get(Result.class).isSuccess()); + assertTrue( + metaChannel.getWebTarget().path("stopPushDataSwitch/open").request(APPLICATION_JSON).get(Result.class) + .isSuccess()); + Thread.sleep(2000L); + AtomicReference dataIdResult = new AtomicReference<>(); AtomicReference userDataResult = new AtomicReference<>(); @@ -62,29 +71,30 @@ public void testStopPushDataSwitch() throws Exception { String dataId = "test-dataId-" + System.currentTimeMillis(); String value = "test stop publish data switch"; - System.out.println("dataidIn:"+dataId); + LOGGER.info("dataidIn:" + dataId); SessionServerConfig sessionServerConfig = sessionApplicationContext.getBean(SessionServerConfig.class); - System.out.println("sessionServerConfig.isStopPushSwitch:"+sessionServerConfig.isStopPushSwitch()); + LOGGER.info("sessionServerConfig.isStopPushSwitch:" + sessionServerConfig.isStopPushSwitch()); PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); Thread.sleep(1000L); - SubscriberRegistration subReg = new SubscriberRegistration(dataId, - (dataIdOb, data) -> { - dataIdResult.set(dataIdOb); - userDataResult.set(data); - }); + SubscriberRegistration subReg = new SubscriberRegistration(dataId, (dataIdOb, data) -> { + LOGGER.info("sub:" + data); + dataIdResult.set(dataIdOb); + userDataResult.set(data); + }); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertNull(dataIdResult.get()); // close stop push switch - assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/close") - .request(APPLICATION_JSON).get(Result.class).isSuccess()); + assertTrue( + metaChannel.getWebTarget().path("stopPushDataSwitch/close").request(APPLICATION_JSON).get(Result.class) + .isSuccess()); Thread.sleep(1000L); // Subscriber get data, test data @@ -108,9 +118,11 @@ public void testStopPushDataSwitch() throws Exception { @Test public void testStopPushDataSwitchByCode() throws Exception { // open stop push switch - assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/open").request(APPLICATION_JSON) - .get(Result.class) - .isSuccess()); + assertTrue( + metaChannel.getWebTarget().path("stopPushDataSwitch/open").request(APPLICATION_JSON).get(Result.class) + .isSuccess()); + Thread.sleep(2000L); + AtomicReference dataIdResult = new AtomicReference<>(); AtomicReference userDataResult = new AtomicReference<>(); @@ -118,20 +130,20 @@ public void testStopPushDataSwitchByCode() throws Exception { String dataId = "test-dataId-hahhahahahha-" + System.currentTimeMillis(); String value = "test stop publish data switch by code"; - System.out.println("dataidIn2:"+dataId); + LOGGER.info("dataidIn2:" + dataId); SessionServerConfig sessionServerConfig = sessionApplicationContext.getBean(SessionServerConfig.class); - System.out.println("sessionServerConfig.isStopPushSwitch2:"+sessionServerConfig.isStopPushSwitch()); + LOGGER.info("sessionServerConfig.isStopPushSwitch2:" + sessionServerConfig.isStopPushSwitch()); PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); - SubscriberRegistration subReg = new SubscriberRegistration(dataId, - (dataIdOb, data) -> { - dataIdResult.set(dataIdOb); - userDataResult.set(data); - }); + SubscriberRegistration subReg = new SubscriberRegistration(dataId, (dataIdOb, data) -> { + LOGGER.info("sub:" + data); + dataIdResult.set(dataIdOb); + userDataResult.set(data); + }); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); Thread.sleep(1000L); @@ -173,8 +185,8 @@ public void testStopPushDataSwitchByCode() throws Exception { // unregister Publisher & Subscriber, close stop push switch registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); - assertTrue(metaChannel.getWebTarget().path("stopPushDataSwitch/close").request(APPLICATION_JSON) - .get(Result.class) - .isSuccess()); + assertTrue( + metaChannel.getWebTarget().path("stopPushDataSwitch/close").request(APPLICATION_JSON).get(Result.class) + .isSuccess()); } } From f34a80d5ab1a0cd6a978fe58fff682de98d8edab Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 12:29:22 +0800 Subject: [PATCH 122/161] =?UTF-8?q?ut=20case=EF=BC=9Arenew=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/src/main/resources/application.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/src/main/resources/application.properties b/test/src/main/resources/application.properties index 20ce078a6..4b58d429e 100644 --- a/test/src/main/resources/application.properties +++ b/test/src/main/resources/application.properties @@ -18,6 +18,8 @@ session.server.schedulerHeartbeatExpBackOffBound=10 session.server.schedulerFetchDataTimeout=3 session.server.schedulerFetchDataFirstDelay=3 session.server.schedulerFetchDataExpBackOffBound=10 +session.server.renewAndSnapshotSilentPeriodSec=1 +session.server.renewDatumWheelTaskDelaySec=2 ## data node configuration data.server.logging.level=INFO @@ -31,6 +33,7 @@ data.server.rpcTimeout=3000 data.server.metaServerPort=9611 data.server.storeNodes=3 data.server.numberOfReplicas=1000 +data.server.datumTimeToLiveSec=10 ## meta node configuration meta.server.logging.level=INFO From b4fc3bdf0e259641ab4d2405e3e7628000e520cf Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 15:42:32 +0800 Subject: [PATCH 123/161] =?UTF-8?q?fix=20ut=20case=EF=BC=9ATempPublisherTe?= =?UTF-8?q?st?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/pubsub/TempPublisherTest.java | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java index 96d1f9bd1..45401d224 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java @@ -16,6 +16,18 @@ */ package com.alipay.sofa.registry.test.pubsub; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + import com.alipay.sofa.registry.client.api.model.RegistryType; import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; @@ -26,17 +38,6 @@ import com.alipay.sofa.registry.core.model.ScopeEnum; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.test.BaseIntegrationTest; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; -import static org.junit.Assert.assertEquals; /** * @author xuanbei @@ -45,7 +46,7 @@ @RunWith(SpringRunner.class) public class TempPublisherTest extends BaseIntegrationTest { @Test - public void doTest() throws Exception { + public synchronized void doTest() throws Exception { String dataId = "test-dataId-" + System.currentTimeMillis(); String value = "test publish temp data"; @@ -54,7 +55,7 @@ public void doTest() throws Exception { new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(0, userData.getZoneData().size()); @@ -77,7 +78,7 @@ public void doTest() throws Exception { sessionApplicationContext.getBean(DataNodeService.class).register(tempPublisher); // data size is 1 - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(1, userData.getZoneData().size()); userData = null; @@ -87,14 +88,14 @@ public void doTest() throws Exception { subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(0, userData.getZoneData().size()); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); } @Test - public void doTestPubAndTempPubSameTime() throws Exception { + public synchronized void doTestPubAndTempPubSameTime() throws Exception { String dataId = "test-same-time-pub&tempPub-" + System.currentTimeMillis(); String value = "test same time publish"; @@ -102,13 +103,13 @@ public void doTestPubAndTempPubSameTime() throws Exception { new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); // publish data PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, "test publish"); - Thread.sleep(1000L); + Thread.sleep(2000L); // publish temp data Publisher tempPublisher = new Publisher(); @@ -128,7 +129,7 @@ public void doTestPubAndTempPubSameTime() throws Exception { tempPublisher.setDataList(dataBoxData); sessionApplicationContext.getBean(DataNodeService.class).register(tempPublisher); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(1, userData.getZoneData().size()); assertEquals(2, userData.getZoneData().get(LOCAL_REGION).size()); From 568e90d6c048a96b514201b0a7cda8aa3745ae83 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 24 Sep 2019 16:04:03 +0800 Subject: [PATCH 124/161] fix version,and merge new --- client/all/pom.xml | 2 +- client/api/pom.xml | 2 +- client/impl/pom.xml | 2 +- client/log/pom.xml | 2 +- client/pom.xml | 2 +- core/pom.xml | 2 +- pom.xml | 2 +- server/common/model/pom.xml | 2 +- server/common/pom.xml | 2 +- server/common/util/pom.xml | 2 +- server/distribution/data/pom.xml | 2 +- server/distribution/integration/pom.xml | 2 +- server/distribution/meta/pom.xml | 2 +- server/distribution/pom.xml | 2 +- server/distribution/session/pom.xml | 2 +- server/pom.xml | 2 +- server/remoting/api/pom.xml | 2 +- server/remoting/bolt/pom.xml | 2 +- server/remoting/http/pom.xml | 2 +- server/remoting/pom.xml | 2 +- server/server/data/pom.xml | 2 +- server/server/integration/pom.xml | 2 +- server/server/meta/pom.xml | 2 +- server/server/pom.xml | 2 +- server/server/session/pom.xml | 2 +- server/store/api/pom.xml | 2 +- server/store/jraft/pom.xml | 2 +- server/store/pom.xml | 2 +- test/pom.xml | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/client/all/pom.xml b/client/all/pom.xml index efd3d7917..d04f188b9 100644 --- a/client/all/pom.xml +++ b/client/all/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-client-all - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ${project.groupId}:${project.artifactId} http://github.com/alipay/sofa-registry diff --git a/client/api/pom.xml b/client/api/pom.xml index a546a370c..064053bc4 100644 --- a/client/api/pom.xml +++ b/client/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/impl/pom.xml b/client/impl/pom.xml index 8631db0d6..16744caa8 100644 --- a/client/impl/pom.xml +++ b/client/impl/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/log/pom.xml b/client/log/pom.xml index 04d11fb22..5c9ea93b4 100644 --- a/client/log/pom.xml +++ b/client/log/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-client-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index 06f6a72a6..704d59412 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml diff --git a/core/pom.xml b/core/pom.xml index 8b9bf5306..4ce7108bc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index 92e6aa326..474ea4221 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT pom ${project.groupId}:${project.artifactId} diff --git a/server/common/model/pom.xml b/server/common/model/pom.xml index 48974de3d..1ad8fa214 100644 --- a/server/common/model/pom.xml +++ b/server/common/model/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/pom.xml b/server/common/pom.xml index 0c4e482e3..a2d1cc892 100644 --- a/server/common/pom.xml +++ b/server/common/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/common/util/pom.xml b/server/common/util/pom.xml index a41fc6708..380d151a6 100644 --- a/server/common/util/pom.xml +++ b/server/common/util/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-common - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/data/pom.xml b/server/distribution/data/pom.xml index 444cabe65..286e847f5 100644 --- a/server/distribution/data/pom.xml +++ b/server/distribution/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/integration/pom.xml b/server/distribution/integration/pom.xml index 8118951ca..e867cef68 100644 --- a/server/distribution/integration/pom.xml +++ b/server/distribution/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/meta/pom.xml b/server/distribution/meta/pom.xml index 512053820..8928604ae 100644 --- a/server/distribution/meta/pom.xml +++ b/server/distribution/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/pom.xml b/server/distribution/pom.xml index ec4b3de52..ac8e09765 100644 --- a/server/distribution/pom.xml +++ b/server/distribution/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-server-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/distribution/session/pom.xml b/server/distribution/session/pom.xml index ca9f732ec..87f30ab9b 100644 --- a/server/distribution/session/pom.xml +++ b/server/distribution/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-distribution - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/pom.xml b/server/pom.xml index d2f9f1782..879bec253 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -7,7 +7,7 @@ com.alipay.sofa registry-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml diff --git a/server/remoting/api/pom.xml b/server/remoting/api/pom.xml index 620b1f1e2..594eb3706 100644 --- a/server/remoting/api/pom.xml +++ b/server/remoting/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/bolt/pom.xml b/server/remoting/bolt/pom.xml index 2f7d8a849..9159707cd 100644 --- a/server/remoting/bolt/pom.xml +++ b/server/remoting/bolt/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/http/pom.xml b/server/remoting/http/pom.xml index bff60eaf9..09f2dd33f 100644 --- a/server/remoting/http/pom.xml +++ b/server/remoting/http/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-remoting - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/remoting/pom.xml b/server/remoting/pom.xml index 29e168179..44f2e7239 100644 --- a/server/remoting/pom.xml +++ b/server/remoting/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/data/pom.xml b/server/server/data/pom.xml index cefa28648..24b270ff6 100644 --- a/server/server/data/pom.xml +++ b/server/server/data/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/integration/pom.xml b/server/server/integration/pom.xml index fbe1f0316..bc07458ad 100644 --- a/server/server/integration/pom.xml +++ b/server/server/integration/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/meta/pom.xml b/server/server/meta/pom.xml index 8bedc1a01..d712828e4 100644 --- a/server/server/meta/pom.xml +++ b/server/server/meta/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/pom.xml b/server/server/pom.xml index 742c1fa75..4b611b9bb 100644 --- a/server/server/pom.xml +++ b/server/server/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/server/session/pom.xml b/server/server/session/pom.xml index ff54e7abc..14eaa23a7 100644 --- a/server/server/session/pom.xml +++ b/server/server/session/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/api/pom.xml b/server/store/api/pom.xml index b2f226779..4fcfa0c56 100644 --- a/server/store/api/pom.xml +++ b/server/store/api/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-store - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/store/jraft/pom.xml b/server/store/jraft/pom.xml index c2c5022bf..ac49e8965 100644 --- a/server/store/jraft/pom.xml +++ b/server/store/jraft/pom.xml @@ -6,7 +6,7 @@ com.alipay.sofa registry-store - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml diff --git a/server/store/pom.xml b/server/store/pom.xml index a9e371a24..2bc6f7079 100644 --- a/server/store/pom.xml +++ b/server/store/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 11c4eca5d..55b7e2d44 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-parent - 5.3.0-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 From d236a64782d3ce2c4f5f83326b45d17a62779da0 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 16:23:16 +0800 Subject: [PATCH 125/161] bugfix ut case: increase sleep time --- .../provider/DefaultRegistryClientTest.java | 39 ++++++++++--------- .../client/provider/RegisterOrderTest.java | 39 ++++++++++--------- .../src/main/resources/application.properties | 2 +- .../sofa/registry/test/pubsub/PubSubTest.java | 20 +++++----- .../resource/data/DataDigestResourceTest.java | 6 +-- .../test/resource/meta/BlacklistTest.java | 12 +++--- .../resource/meta/StopPushDataSwitchTest.java | 6 +-- .../session/ClientsOpenResourceTest.java | 2 +- .../session/SessionDigestResourceTest.java | 4 +- .../sofa/registry/test/sync/DataSyncTest.java | 21 +++++----- .../test/sync/SyncDataHandlerTest.java | 2 +- 11 files changed, 78 insertions(+), 75 deletions(-) diff --git a/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/DefaultRegistryClientTest.java b/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/DefaultRegistryClientTest.java index 183ebb4ec..aba3677dc 100644 --- a/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/DefaultRegistryClientTest.java +++ b/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/DefaultRegistryClientTest.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.client.provider; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.junit.After; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.alipay.sofa.registry.client.api.ConfigDataObserver; import com.alipay.sofa.registry.client.api.Configurator; import com.alipay.sofa.registry.client.api.Publisher; @@ -31,16 +42,6 @@ import com.alipay.sofa.registry.core.model.PublisherRegister; import com.alipay.sofa.registry.core.model.ScopeEnum; import com.alipay.sofa.registry.core.model.SubscriberRegister; -import org.junit.After; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; /** * The type Default registry client test. @@ -89,7 +90,7 @@ public void registerPublisher() throws InterruptedException { defaultPublisher.republish("republish test"); - Thread.sleep(500L); + Thread.sleep(2000L); // register success when republish assertTrue(defaultPublisher.isRegistered()); } @@ -111,7 +112,7 @@ public void handleData(String dataId, UserData data) { assertNotNull(subscriber); assertEquals(dataId, subscriber.getDataId()); - Thread.sleep(500L); + Thread.sleep(2000L); RegisterCache registerCache = registryClient.getRegisterCache(); @@ -142,7 +143,7 @@ public void handleData(String dataId, ConfigData configData) { assertNotNull(configurator); assertEquals(dataId, configurator.getDataId()); - Thread.sleep(500L); + Thread.sleep(2000L); RegisterCache registerCache = registryClient.getRegisterCache(); @@ -164,7 +165,7 @@ public void unregisterSinglePublisherTest() throws InterruptedException { int unregisterCount = registryClient.unregister(dataId, null, RegistryType.PUBLISHER); assertEquals(1, unregisterCount); - Thread.sleep(500L); + Thread.sleep(2000L); Publisher temp = registryClient.getRegisterCache().getPublisherByRegistId( publisher.getRegistId()); @@ -185,7 +186,7 @@ public void unregisterSingleSubscriberTest() throws InterruptedException { int unregisterCount = registryClient.unregister(dataId, null, RegistryType.SUBSCRIBER); assertEquals(1, unregisterCount); - Thread.sleep(500L); + Thread.sleep(2000L); Subscriber temp = registryClient.getRegisterCache().getSubscriberByRegistId( subscriber.getRegistId()); @@ -206,7 +207,7 @@ public void unregisterSingleConfiguratorTest() throws InterruptedException { int unregisterCount = registryClient.unregister(dataId, null, RegistryType.CONFIGURATOR); assertEquals(1, unregisterCount); - Thread.sleep(500L); + Thread.sleep(2000L); Subscriber temp = registryClient.getRegisterCache().getSubscriberByRegistId( configurator.getRegistId()); @@ -236,13 +237,13 @@ public void unregisterMultiTest() throws InterruptedException { Subscriber subscriber2 = registryClient.register(subscriberRegistration2); - Thread.sleep(500L); + Thread.sleep(2000L); // 2. unregister publisher int unregisterCount = registryClient.unregister(dataId, null, RegistryType.PUBLISHER); assertEquals(2, unregisterCount); - Thread.sleep(500L); + Thread.sleep(2000L); // 3. check publisher register cache RegisterCache registerCache = registryClient.getRegisterCache(); @@ -256,7 +257,7 @@ public void unregisterMultiTest() throws InterruptedException { unregisterCount = registryClient.unregister(dataId, null, RegistryType.SUBSCRIBER); assertEquals(2, unregisterCount); - Thread.sleep(500L); + Thread.sleep(2000L); // 5. check subscriber register cache Subscriber tempSub = registerCache.getSubscriberByRegistId(subscriber1.getRegistId()); diff --git a/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/RegisterOrderTest.java b/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/RegisterOrderTest.java index 90117a8aa..2e23dd731 100644 --- a/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/RegisterOrderTest.java +++ b/client/impl/src/test/java/com/alipay/sofa/registry/client/provider/RegisterOrderTest.java @@ -16,6 +16,20 @@ */ package com.alipay.sofa.registry.client.provider; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.alipay.sofa.registry.client.api.Publisher; import com.alipay.sofa.registry.client.api.Subscriber; import com.alipay.sofa.registry.client.api.SubscriberDataObserver; @@ -26,19 +40,6 @@ import com.alipay.sofa.registry.core.model.DataBox; import com.alipay.sofa.registry.core.model.PublisherRegister; import com.alipay.sofa.registry.core.model.SubscriberRegister; -import org.junit.After; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; /** * @@ -126,7 +127,7 @@ public void publishAndUnregister() throws InterruptedException { // step 1 Publisher publisher = registryClient.register(new PublisherRegistration(dataId), data); - Thread.sleep(500L); + Thread.sleep(2000L); String registId = publisher.getRegistId(); PublisherRegister publisherRegister = mockServer.queryPubliser(registId); @@ -137,7 +138,7 @@ public void publishAndUnregister() throws InterruptedException { // step 2 publisher.unregister(); - Thread.sleep(500L); + Thread.sleep(2000L); assertNull(mockServer.queryPubliser(registId)); @@ -151,7 +152,7 @@ public void publishAndRefused() throws InterruptedException { // step 1 Publisher publisher = registryClient.register(new PublisherRegistration(data), data); - Thread.sleep(500L); + Thread.sleep(2000L); String registId = publisher.getRegistId(); PublisherRegister publisherRegister = mockServer.queryPubliser(registId); @@ -182,7 +183,7 @@ public void handleData(String dataId, UserData data) { Subscriber subscriber = registryClient.register(new SubscriberRegistration(dataId, dataObserver)); - Thread.sleep(500L); + Thread.sleep(2000L); String registId = subscriber.getRegistId(); SubscriberRegister subscriberRegister = mockServer.querySubscriber(registId); @@ -191,7 +192,7 @@ public void handleData(String dataId, UserData data) { // step 2 subscriber.unregister(); - Thread.sleep(500L); + Thread.sleep(2000L); assertNull(mockServer.queryPubliser(registId)); @@ -211,7 +212,7 @@ public void handleData(String dataId, UserData data) { Subscriber subscriber = registryClient.register(new SubscriberRegistration( "subscribeAndRefused", dataObserver)); - Thread.sleep(500L); + Thread.sleep(2000L); String registId = subscriber.getRegistId(); SubscriberRegister subscriberRegister = mockServer.querySubscriber(registId); diff --git a/test/src/main/resources/application.properties b/test/src/main/resources/application.properties index 4b58d429e..e95b4e3a4 100644 --- a/test/src/main/resources/application.properties +++ b/test/src/main/resources/application.properties @@ -33,7 +33,7 @@ data.server.rpcTimeout=3000 data.server.metaServerPort=9611 data.server.storeNodes=3 data.server.numberOfReplicas=1000 -data.server.datumTimeToLiveSec=10 +data.server.datumTimeToLiveSec=20 ## meta node configuration meta.server.logging.level=INFO diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/PubSubTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/PubSubTest.java index bb7c60a42..ab7495f50 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/PubSubTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/PubSubTest.java @@ -45,7 +45,7 @@ public void publisherTest() throws InterruptedException { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); @@ -53,7 +53,7 @@ public void publisherTest() throws InterruptedException { registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); assertEquals(1, userData.getZoneData().size()); @@ -80,11 +80,11 @@ public void subscriberTest() throws InterruptedException { new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); - Thread.sleep(500L); + Thread.sleep(2000L); PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); @@ -112,7 +112,7 @@ public void multiClientTest() throws InterruptedException { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); @@ -120,7 +120,7 @@ public void multiClientTest() throws InterruptedException { registryClient2.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); assertEquals(1, userData.getZoneData().size()); @@ -139,11 +139,11 @@ public void multiClientTest() throws InterruptedException { subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.global); registryClient1.register(subReg); - Thread.sleep(500L); + Thread.sleep(2000L); registration = new PublisherRegistration(dataId); registryClient2.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); @@ -163,12 +163,12 @@ public void multiClientTest() throws InterruptedException { subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(500L); + Thread.sleep(2000L); registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); registryClient2.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/data/DataDigestResourceTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/data/DataDigestResourceTest.java index 5bacd905e..fef3d6864 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/data/DataDigestResourceTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/data/DataDigestResourceTest.java @@ -54,17 +54,17 @@ public static void beforeClass() throws Exception { clientOff(); dataId = "test-dataId-" + System.currentTimeMillis(); value = "DataDigestResourceTest"; - Thread.sleep(1000L); + Thread.sleep(2000L); PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); - Thread.sleep(500L); + Thread.sleep(2000L); } @AfterClass diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java index 64c76b864..fff295990 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/BlacklistTest.java @@ -120,14 +120,14 @@ public void testBlacklistUpdatePub() throws Exception { BaseIntegrationTest.dataId = null; //wait for new list meta dispatch to session - Thread.sleep(1000L); + Thread.sleep(2000L); String dataId = "test-dataId-blacklist"; String value = "test blacklist"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); @@ -135,7 +135,7 @@ public void testBlacklistUpdatePub() throws Exception { registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); @@ -192,14 +192,14 @@ public void testBlacklistUpdateSub() throws Exception { BaseIntegrationTest.dataId = null; //wait for new list meta dispatch to session - Thread.sleep(1000L); + Thread.sleep(2000L); String dataId = "test-dataId-blacklist2"; String value = "test blacklist2"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); @@ -207,7 +207,7 @@ public void testBlacklistUpdateSub() throws Exception { registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertEquals(dataId, this.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java index eacb377d1..ca7ff690f 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/meta/StopPushDataSwitchTest.java @@ -79,7 +79,7 @@ public void testStopPushDataSwitch() throws Exception { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, (dataIdOb, data) -> { LOGGER.info("sub:" + data); @@ -95,7 +95,7 @@ public void testStopPushDataSwitch() throws Exception { assertTrue( metaChannel.getWebTarget().path("stopPushDataSwitch/close").request(APPLICATION_JSON).get(Result.class) .isSuccess()); - Thread.sleep(1000L); + Thread.sleep(2000L); // Subscriber get data, test data assertEquals(dataId, dataIdResult.get()); @@ -146,7 +146,7 @@ public void testStopPushDataSwitchByCode() throws Exception { }); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); - Thread.sleep(1000L); + Thread.sleep(2000L); assertNull(dataIdResult.get()); // invoke code directly diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/ClientsOpenResourceTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/ClientsOpenResourceTest.java index f456d5b01..c9a74282e 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/ClientsOpenResourceTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/ClientsOpenResourceTest.java @@ -38,7 +38,7 @@ public void testClientOff() throws Exception { String value = "test client off"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(1000L); + Thread.sleep(2000L); String countResult = dataChannel.getWebTarget().path("digest/datum/count") .request(APPLICATION_JSON).get(String.class); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java index 2c0b7f28c..5ed053960 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/resource/session/SessionDigestResourceTest.java @@ -59,13 +59,13 @@ public static void beforeClass() throws Exception { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); - Thread.sleep(500L); + Thread.sleep(2000L); } @AfterClass diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/DataSyncTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/DataSyncTest.java index 0bccb8810..93ef9a882 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/DataSyncTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/DataSyncTest.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.test.sync; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.NotifyDataSyncRequest; @@ -32,15 +42,6 @@ import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; import com.alipay.sofa.registry.server.data.remoting.dataserver.handler.DataSyncServerConnectionHandler; import com.alipay.sofa.registry.test.BaseIntegrationTest; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * @author xuanbei @@ -94,7 +95,7 @@ public void doTest() throws Exception { registryClient1.register(subReg); // assert result - Thread.sleep(1000L); + Thread.sleep(5000L); assertEquals(MockSyncDataHandler.dataId, BaseIntegrationTest.dataId); assertEquals(LOCAL_REGION, userData.getLocalZone()); assertEquals(1, userData.getZoneData().size()); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java index 074960dc9..f9fc97667 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java @@ -51,7 +51,7 @@ public void doTest() throws Exception { String value = "test publish"; PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - Thread.sleep(500L); + Thread.sleep(2000L); // request syncData DataNodeExchanger dataNodeExchanger = dataApplicationContext.getBean("dataNodeExchanger", From c9f7f21e5653431428e90ee82818f158bd715515 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 17:32:33 +0800 Subject: [PATCH 126/161] =?UTF-8?q?fix=20ut=20case=EF=BC=9ARenewTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 5 +- .../sofa/registry/test/renew/RenewTest.java | 104 ++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java diff --git a/test/src/main/resources/application.properties b/test/src/main/resources/application.properties index e95b4e3a4..ea2cbe7fe 100644 --- a/test/src/main/resources/application.properties +++ b/test/src/main/resources/application.properties @@ -18,8 +18,9 @@ session.server.schedulerHeartbeatExpBackOffBound=10 session.server.schedulerFetchDataTimeout=3 session.server.schedulerFetchDataFirstDelay=3 session.server.schedulerFetchDataExpBackOffBound=10 -session.server.renewAndSnapshotSilentPeriodSec=1 -session.server.renewDatumWheelTaskDelaySec=2 +session.server.renewAndSnapshotSilentPeriodSec=10 +session.server.renewDatumWheelTaskDelaySec=10 +session.server.renewDatumWheelTaskRandomFirstDelaySec=10 ## data node configuration data.server.logging.level=INFO diff --git a/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java new file mode 100644 index 000000000..4a5374702 --- /dev/null +++ b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.test.renew; + +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + +import com.alipay.sofa.registry.client.api.model.RegistryType; +import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; +import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; +import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.core.model.ScopeEnum; +import com.alipay.sofa.registry.server.data.cache.DatumCache; +import com.alipay.sofa.registry.test.BaseIntegrationTest; + +/** + * @author kezhu.wukz + */ +@RunWith(SpringRunner.class) +public class RenewTest extends BaseIntegrationTest { + + /** + * clean datum -> renew + */ + @Test + public void testRenewAfterClean() throws InterruptedException { + String dataId = "test-dataId-" + System.currentTimeMillis(); + String value = "test publish"; + + // pub/sub + { + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + + SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + + registryClient1.register(subReg); + } + + Thread.sleep(5000L); + + // check sub + { + assertEquals(dataId, this.dataId); + assertEquals(LOCAL_REGION, userData.getLocalZone()); + assertEquals(1, userData.getZoneData().size()); + assertEquals(1, userData.getZoneData().values().size()); + assertEquals(true, userData.getZoneData().containsKey(LOCAL_REGION)); + assertEquals(1, userData.getZoneData().get(LOCAL_REGION).size()); + assertEquals(value, userData.getZoneData().get(LOCAL_REGION).get(0)); + } + + //clean datum and unsub + { + //pub again to ignore renew for 10sec + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + //un sub, because will new sub below + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); + // sleep to sure pub is done + Thread.sleep(2000L); + // clean all datum + DatumCache datumCache = (DatumCache) dataApplicationContext.getBean("datumCache"); + datumCache.cleanDatum(LOCAL_DATACENTER, DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)); + } + + // new sub, and got empty datum + { + SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + registryClient1.register(subReg); + } + Thread.sleep(3000L); + assertEquals(0, userData.getZoneData().size()); + + //renew in 20sec + Thread.sleep(20000L); + assertEquals(1, userData.getZoneData().size()); + + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); + } + +} \ No newline at end of file From 1aec70a546ea68806797c7c95a37113bf590c470 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 24 Sep 2019 17:40:33 +0800 Subject: [PATCH 127/161] fix version and fix callback executor,fix log error --- server/consistency/pom.xml | 2 +- .../consistency/hash/ConsistentHash.java | 55 ++++++++++++++++ .../registry/remoting/CallbackHandler.java | 8 +++ .../registry/remoting/bolt/BoltServer.java | 62 +++++++++++-------- .../remoting/jersey/JerseyExchangeTest.java | 6 ++ .../change/notify/SessionServerNotifier.java | 22 ++++--- .../change/notify/TempPublisherNotifier.java | 18 +++--- .../dataserver/GetSyncDataHandler.java | 7 +++ .../node/service/DataNodeServiceImpl.java | 22 +++---- .../task/ReceivedConfigDataPushTask.java | 6 ++ .../task/ReceivedDataMultiPushTask.java | 11 ++++ 11 files changed, 163 insertions(+), 56 deletions(-) diff --git a/server/consistency/pom.xml b/server/consistency/pom.xml index 74f34ed4f..ef32250f9 100644 --- a/server/consistency/pom.xml +++ b/server/consistency/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.1-SNAPSHOT ../pom.xml 4.0.0 diff --git a/server/consistency/src/main/java/com/alipay/sofa/registry/consistency/hash/ConsistentHash.java b/server/consistency/src/main/java/com/alipay/sofa/registry/consistency/hash/ConsistentHash.java index 3c6949236..fdcbd2ad6 100644 --- a/server/consistency/src/main/java/com/alipay/sofa/registry/consistency/hash/ConsistentHash.java +++ b/server/consistency/src/main/java/com/alipay/sofa/registry/consistency/hash/ConsistentHash.java @@ -148,4 +148,59 @@ public List getNUniqueNodesFor(Object key, int n) { } return list; } + + /** + * This returns the closest n unique nodes in order for the object. + * + * This will return a list that has all nodes if n > number of nodes. + * + * @param key the key + * @param n the n + * @param disasterList disaster region name + * @return the n unique nodes for + */ + public List getNUniqueNodesFor(Object key, int n, List disasterList) { + if (circle.isEmpty()) { + return Collections.emptyList(); + } + + if (n > realNodes.size()) { + n = realNodes.size(); + } + + List disasters = disasterList != null && !disasterList.isEmpty() ? disasterList + : new ArrayList<>(); + List list = new ArrayList<>(n); + int hash = hashFunction.hash(key); + for (int i = 0; i < n; i++) { + if (!circle.containsKey(hash)) { + // go to next element. + SortedMap tailMap = circle.tailMap(hash); + hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); + } + T candidate = circle.get(hash); + if (!list.contains(candidate)) { + + while (!disasters.isEmpty() && !disasters.contains(candidate.getNodeName())) { + hash++; + if (!circle.containsKey(hash)) { + // go to next element. + SortedMap tailMap = circle.tailMap(hash); + hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); + } + candidate = circle.get(hash); + } + list.add(candidate); + if (!disasters.isEmpty()) { + disasters.remove(candidate.getNodeName()); + } + + } else { + i--; // try again. + } + // find the next element in the circle + hash++; + } + return list; + } } diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/CallbackHandler.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/CallbackHandler.java index 2b32e72a0..aa73eeb46 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/CallbackHandler.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/CallbackHandler.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.remoting; +import java.util.concurrent.Executor; + /** * * @author shangyu.wh @@ -38,4 +40,10 @@ public interface CallbackHandler { * @param exception */ void onException(Channel channel, Throwable exception); + + /** + * override executor + * @return + */ + Executor getExecutor(); } \ No newline at end of file diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java index af2c3d71a..1118a6e1c 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java @@ -16,16 +16,6 @@ */ package com.alipay.sofa.registry.remoting.bolt; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; - import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventType; import com.alipay.remoting.InvokeCallback; @@ -43,6 +33,16 @@ import com.alipay.sofa.registry.remoting.ChannelHandler.InvokeType; import com.alipay.sofa.registry.remoting.Server; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + /** * * @author shangyu.wh @@ -243,20 +243,23 @@ public boolean isClosed() { @Override public void sendOneway(Channel channel, Object message) { if (channel != null && channel.isConnected()) { + Url boltUrl = null; try { - Url url = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel + boltUrl = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel .getRemoteAddress().getPort()); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Bolt Server one way message:{} , target url:{}", message, url); + LOGGER + .debug("Bolt Server one way message:{} , target url:{}", message, boltUrl); } - boltServer.oneway(url, message); + boltServer.oneway(boltUrl, message); } catch (RemotingException e) { - LOGGER.error("Bolt Server one way message RemotingException! target url:" + url, e); + LOGGER.error( + "Bolt Server one way message RemotingException! target url:" + boltUrl, e); throw new RuntimeException("Bolt Server one way message RemotingException!", e); } catch (InterruptedException e) { - LOGGER.error("Bolt Server one way message InterruptedException! target url:" + url, - e); + LOGGER.error("Bolt Server one way message InterruptedException! target url:" + + boltUrl, e); throw new RuntimeException("Bolt Server one way message InterruptedException!", e); } } @@ -267,22 +270,24 @@ public void sendOneway(Channel channel, Object message) { @Override public Object sendSync(Channel channel, Object message, int timeoutMillis) { if (channel != null && channel.isConnected()) { + Url boltUrl = null; try { - Url url = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel + boltUrl = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel .getRemoteAddress().getPort()); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Bolt Server sendSync message:{} , target url:{}", message, url); + LOGGER.debug("Bolt Server sendSync message:{} , target url:{}", message, + boltUrl); } - return boltServer.invokeSync(url, message, timeoutMillis); + return boltServer.invokeSync(boltUrl, message, timeoutMillis); } catch (RemotingException e) { - LOGGER - .error("Bolt Server sendSync message RemotingException! target url:" + url, e); + LOGGER.error("Bolt Server sendSync message RemotingException! target url:" + + boltUrl, e); throw new RuntimeException("Bolt Server sendSync message RemotingException!", e); } catch (InterruptedException e) { - LOGGER.error( - "Bolt Server sendSync message InterruptedException! target url:" + url, e); + LOGGER.error("Bolt Server sendSync message InterruptedException! target url:" + + boltUrl, e); throw new RuntimeException("Bolt Server sendSync message InterruptedException!", e); } } @@ -294,14 +299,16 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { public void sendCallback(Channel channel, Object message, CallbackHandler callbackHandler, int timeoutMillis) { if (channel != null && channel.isConnected()) { + Url boltUrl = null; try { - Url url = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel + boltUrl = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel .getRemoteAddress().getPort()); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Bolt Server sendSync message:{} , target url:{}", message, url); + LOGGER.debug("Bolt Server sendSync message:{} , target url:{}", message, + boltUrl); } - boltServer.invokeWithCallback(url, message, new InvokeCallback() { + boltServer.invokeWithCallback(boltUrl, message, new InvokeCallback() { @Override public void onResponse(Object result) { callbackHandler.onCallback(channel, result); @@ -322,7 +329,8 @@ public Executor getExecutor() { throw new RuntimeException("Bolt Server invoke with callback RemotingException!", e); } catch (InterruptedException e) { PUSH_LOGGER.error( - "Bolt Server invoke with callback InterruptedException! target url:" + url, e); + "Bolt Server invoke with callback InterruptedException! target url:" + boltUrl, + e); throw new RuntimeException( "Bolt Server invoke with callback InterruptedException!", e); } diff --git a/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java b/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java index 22713c6d2..4e587d8ec 100644 --- a/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java +++ b/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import java.net.InetSocketAddress; +import java.util.concurrent.Executor; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; @@ -51,6 +52,11 @@ public void onCallback(Channel channel, Object message) { @Override public void onException(Channel channel, Throwable exception) { } + + @Override + public Executor getExecutor() { + return null; + } }; JerseyExchange jerseyExchange = new JerseyExchange(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index 451f89804..956b6e828 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.data.change.notify; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -42,6 +33,14 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; /** * Notify session DataChangeRequest,if fail get result callback retry @@ -209,6 +208,11 @@ public void onException(Channel channel, Throwable e) { onFailed(this); } + @Override + public Executor getExecutor() { + return null; + } + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java index f4f5f5e9a..742b66e05 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java @@ -16,13 +16,6 @@ */ package com.alipay.sofa.registry.server.data.change.notify; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Executor; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.remoting.Connection; import com.alipay.remoting.InvokeCallback; import com.alipay.sofa.registry.common.model.CommonResponse; @@ -38,6 +31,12 @@ import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; /** * @@ -97,6 +96,11 @@ public void onCallback(Channel channel, Object message) { public void onException(Channel channel, Throwable exception) { notifyPushdataCallback.onException(exception); } + + @Override + public Executor getExecutor() { + return notifyPushdataCallback.getExecutor(); + } }, dataServerConfig.getRpcTimeout()); } catch (Exception e) { LOGGER.error("[TempPublisherNotifier] notify sessionserver {} failed, {}", diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/GetSyncDataHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/GetSyncDataHandler.java index c315110ee..62456108e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/GetSyncDataHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/GetSyncDataHandler.java @@ -25,6 +25,8 @@ import com.alipay.sofa.registry.server.data.remoting.DataNodeExchanger; import org.springframework.beans.factory.annotation.Autowired; +import java.util.concurrent.Executor; + /** * * @author qian.lqlq @@ -71,6 +73,11 @@ public void onCallback(Channel channel, Object message) { public void onException(Channel channel, Throwable exception) { callback.onException(exception); } + + @Override + public Executor getExecutor() { + return callback.getExecutor(); + } }; } }); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index afd2bf2ff..ddb71adbf 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -16,17 +16,6 @@ */ package com.alipay.sofa.registry.server.session.node.service; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -53,6 +42,15 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * @@ -339,7 +337,7 @@ public URL getRequestUrl() { if (genericResponse.isSuccess()) { map = (Map) genericResponse.getData(); if (map == null || map.isEmpty()) { - LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}", dataCenterId); + LOGGER.warn("GetDataRequest get response contains no datum!dataInfoId={}", dataInfoId); } else { map.forEach((dataCenter, datum) -> Datum.processDatum(datum)); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java index 11f6df8b6..fdbb11250 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedConfigDataPushTask.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.Executor; /** * @@ -83,6 +84,11 @@ public void onException(Channel channel, Throwable exception) { receivedConfigData.getDataId(), receivedConfigData.getGroup(), receivedConfigData.getInstanceId(), url); } + + @Override + public Executor getExecutor() { + return null; + } }; clientNodeService.pushWithCallback( diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index 4539fed32..38d9076e9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; /** @@ -139,6 +140,11 @@ public void onException(Channel channel, Throwable exception) { } } } + + @Override + public Executor getExecutor() { + return null; + } }; clientNodeService.pushWithCallback(receivedDataPush, url, callbackHandler); @@ -188,6 +194,11 @@ public void onException(Channel channel, Throwable exception) { dataPush, retryTimes); retrySendReceiveData(pushDataRetryRequest); } + + @Override + public Executor getExecutor() { + return null; + } }); } catch (Exception e) { From e35104863e7a2f2c65f02c689f4186298faa934d Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 17:43:40 +0800 Subject: [PATCH 128/161] =?UTF-8?q?fix=20ut=20case=EF=BC=9ARenewTest=20for?= =?UTF-8?q?mat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alipay/sofa/registry/test/renew/RenewTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java index 4a5374702..93da6d14f 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java @@ -51,7 +51,8 @@ public void testRenewAfterClean() throws InterruptedException { PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, value); - SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); @@ -81,12 +82,14 @@ public void testRenewAfterClean() throws InterruptedException { Thread.sleep(2000L); // clean all datum DatumCache datumCache = (DatumCache) dataApplicationContext.getBean("datumCache"); - datumCache.cleanDatum(LOCAL_DATACENTER, DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)); + datumCache.cleanDatum(LOCAL_DATACENTER, + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)); } // new sub, and got empty datum { - SubscriberRegistration subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.dataCenter); registryClient1.register(subReg); } From da949d9432e53535c3838f0c03516e2d36bb3c67 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 24 Sep 2019 18:10:32 +0800 Subject: [PATCH 129/161] fix pom version --- server/consistency/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/consistency/pom.xml b/server/consistency/pom.xml index 74f34ed4f..9c52b6b98 100644 --- a/server/consistency/pom.xml +++ b/server/consistency/pom.xml @@ -5,7 +5,7 @@ com.alipay.sofa registry-server-parent - 5.2.1-SNAPSHOT + 5.3.0-SNAPSHOT ../pom.xml 4.0.0 From fad705700ef659859ffaf201c64cc409786988f9 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 24 Sep 2019 19:19:56 +0800 Subject: [PATCH 130/161] =?UTF-8?q?fix=20ut=20case=EF=BC=9Ado=20not=20run?= =?UTF-8?q?=20parallelly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 + .../sofa/registry/test/renew/RenewTest.java | 80 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/pom.xml b/pom.xml index 92e6aa326..19d72061d 100644 --- a/pom.xml +++ b/pom.xml @@ -402,6 +402,9 @@ org.apache.maven.plugins maven-surefire-plugin 2.21.0 + + once + org.jacoco diff --git a/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java index 93da6d14f..c531420c4 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/renew/RenewTest.java @@ -20,6 +20,9 @@ import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; import static org.junit.Assert.assertEquals; +import javax.ws.rs.core.MediaType; + +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringRunner; @@ -28,6 +31,7 @@ import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.core.model.Result; import com.alipay.sofa.registry.core.model.ScopeEnum; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.test.BaseIntegrationTest; @@ -104,4 +108,80 @@ public void testRenewAfterClean() throws InterruptedException { registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); } + /** + * close renew -> clean datum + */ + @Test + public void testNoRenewAfterClean() throws InterruptedException { + // close renew + Assert.assertTrue(metaChannel.getWebTarget().path("renewSwitch/disable") + .request(MediaType.APPLICATION_JSON).get(Result.class).isSuccess()); + Thread.sleep(2000L); + + String dataId = "test-dataId-" + System.currentTimeMillis(); + String value = "test publish"; + + // pub/sub + { + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + + registryClient1.register(subReg); + } + + Thread.sleep(5000L); + + // check sub + { + assertEquals(dataId, this.dataId); + assertEquals(LOCAL_REGION, userData.getLocalZone()); + assertEquals(1, userData.getZoneData().size()); + assertEquals(1, userData.getZoneData().values().size()); + assertEquals(true, userData.getZoneData().containsKey(LOCAL_REGION)); + assertEquals(1, userData.getZoneData().get(LOCAL_REGION).size()); + assertEquals(value, userData.getZoneData().get(LOCAL_REGION).get(0)); + } + + //clean datum and unsub + { + //pub again to ignore renew for 10sec + PublisherRegistration registration = new PublisherRegistration(dataId); + registryClient1.register(registration, value); + //un sub, because will new sub below + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); + // sleep to sure pub is done + Thread.sleep(2000L); + // clean all datum + DatumCache datumCache = (DatumCache) dataApplicationContext.getBean("datumCache"); + datumCache.cleanDatum(LOCAL_DATACENTER, + DataInfo.toDataInfoId(dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP)); + } + + // new sub, and got empty datum + { + SubscriberRegistration subReg = new SubscriberRegistration(dataId, + new MySubscriberDataObserver()); + subReg.setScopeEnum(ScopeEnum.dataCenter); + registryClient1.register(subReg); + } + Thread.sleep(3000L); + assertEquals(0, userData.getZoneData().size()); + + //renew is disable, so it's also 0 in 20sec + Thread.sleep(20000L); + assertEquals(0, userData.getZoneData().size()); + + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); + registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); + + // open renew + Assert.assertTrue(metaChannel.getWebTarget().path("renewSwitch/enable") + .request(MediaType.APPLICATION_JSON).get(Result.class).isSuccess()); + Thread.sleep(2000L); + } + } \ No newline at end of file From bd95d6c9972895aba582ab54a9c32174fea54ba5 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 10 Oct 2019 15:08:08 +0800 Subject: [PATCH 131/161] refactor providerdata process --- .../bootstrap/SessionServerBootstrap.java | 58 ++--- .../bootstrap/SessionServerConfiguration.java | 38 ++++ .../ProvideDataChangeFetchTaskListener.java | 14 +- .../provideData/ProvideDataProcessor.java | 33 +++ .../ProvideDataProcessorManager.java | 59 ++++++ .../BlackListProvideDataProcessor.java | 139 ++++++++++++ .../RenewSnapshotProvideDataProcessor.java | 74 +++++++ .../StopPushProvideDataProcessor.java | 171 +++++++++++++++ .../task/ProvideDataChangeFetchTask.java | 200 ++---------------- 9 files changed, 550 insertions(+), 236 deletions(-) create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessorManager.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/BlackListProvideDataProcessor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/RenewSnapshotProvideDataProcessor.java create mode 100644 server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/StopPushProvideDataProcessor.java diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 3ed3279cd..9a363c075 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -16,21 +16,6 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; - -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.util.CollectionUtils; - import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; @@ -51,11 +36,25 @@ import com.alipay.sofa.registry.server.session.node.NodeManagerFactory; import com.alipay.sofa.registry.server.session.node.RaftClientManager; import com.alipay.sofa.registry.server.session.node.SessionProcessIdGenerator; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; /** * The type Session server bootstrap. @@ -109,6 +108,9 @@ public class SessionServerBootstrap { @Autowired private Registry sessionRegistry; + @Autowired + private ProvideDataProcessor provideDataProcessorManager; + private Server server; private Server httpServer; @@ -309,20 +311,7 @@ private void fetchStopPushSwitch(URL leaderUrl) { Object ret = sendMetaRequest(fetchProvideDataRequest, leaderUrl); if (ret instanceof ProvideData) { ProvideData provideData = (ProvideData) ret; - if (provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch session stop push switch no data existed,config not change!"); - return; - } - String data = (String) provideData.getProvideData().getObject(); - sessionServerConfig.setStopPushSwitch(Boolean.valueOf(data)); - if (data != null) { - if (!Boolean.valueOf(data)) { - //stop push init on,then begin fetch data schedule task - sessionServerConfig.setBeginDataFetchTask(true); - } - } - LOGGER.info("Fetch session stop push data switch {} success!", data); + provideDataProcessorManager.fetchDataProcess(provideData); } else { LOGGER.info("Fetch session stop push switch data null,config not change!"); } @@ -334,16 +323,7 @@ private void fetchEnableDataRenewSnapshot(URL leaderUrl) { Object data = sendMetaRequest(fetchProvideDataRequest, leaderUrl); if (data instanceof ProvideData) { ProvideData provideData = (ProvideData) data; - if (provideData == null || provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER - .info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); - return; - } - boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData - .getProvideData().getObject()); - LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); - this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); + provideDataProcessorManager.fetchDataProcess(provideData); } } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 1faa2628c..d2ae41468 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -68,6 +68,11 @@ import com.alipay.sofa.registry.server.session.node.service.DataNodeServiceImpl; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; import com.alipay.sofa.registry.server.session.node.service.MetaNodeServiceImpl; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessorManager; +import com.alipay.sofa.registry.server.session.provideData.processor.BlackListProvideDataProcessor; +import com.alipay.sofa.registry.server.session.provideData.processor.RenewSnapshotProvideDataProcessor; +import com.alipay.sofa.registry.server.session.provideData.processor.StopPushProvideDataProcessor; import com.alipay.sofa.registry.server.session.registry.Registry; import com.alipay.sofa.registry.server.session.registry.SessionRegistry; import com.alipay.sofa.registry.server.session.remoting.ClientNodeExchanger; @@ -738,4 +743,37 @@ public RenewService renewService() { return new DefaultRenewService(); } } + + @Configuration + public static class SessionProvideDataConfiguration { + + @Bean + public ProvideDataProcessor provideDataProcessorManager() { + return new ProvideDataProcessorManager(); + } + + @Bean + public ProvideDataProcessor blackListProvideDataProcessor(ProvideDataProcessor provideDataProcessorManager) { + ProvideDataProcessor blackListProvideDataProcessor = new BlackListProvideDataProcessor(); + ((ProvideDataProcessorManager) provideDataProcessorManager) + .addProvideDataProcessor(blackListProvideDataProcessor); + return blackListProvideDataProcessor; + } + + @Bean + public ProvideDataProcessor renewSnapshotProvideDataProcessor(ProvideDataProcessor provideDataProcessorManager) { + ProvideDataProcessor renewSnapshotProvideDataProcessor = new RenewSnapshotProvideDataProcessor(); + ((ProvideDataProcessorManager) provideDataProcessorManager) + .addProvideDataProcessor(renewSnapshotProvideDataProcessor); + return renewSnapshotProvideDataProcessor; + } + + @Bean + public ProvideDataProcessor stopPushProvideDataProcessor(ProvideDataProcessor provideDataProcessorManager) { + ProvideDataProcessor stopPushProvideDataProcessor = new StopPushProvideDataProcessor(); + ((ProvideDataProcessorManager) provideDataProcessorManager) + .addProvideDataProcessor(stopPushProvideDataProcessor); + return stopPushProvideDataProcessor; + } + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java index aeb82529b..91fa6127a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java @@ -18,12 +18,10 @@ import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; -import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; import com.alipay.sofa.registry.server.session.scheduler.task.ProvideDataChangeFetchTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; -import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.task.batcher.TaskDispatcher; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; @@ -59,17 +57,11 @@ public class ProvideDataChangeFetchTaskListener implements TaskListener { @Autowired private Exchange boltExchange; - @Autowired - private Interests sessionInterests; - @Autowired private Watchers sessionWatchers; @Autowired - private Registry sessionRegistry; - - @Autowired - private BlacklistManager blacklistManager; + private ProvideDataProcessor provideDataProcessorManager; private TaskDispatcher singleTaskDispatcher; @@ -97,7 +89,7 @@ public void handleEvent(TaskEvent event) { SessionTask provideDataChangeFetchTask = new ProvideDataChangeFetchTask( sessionServerConfig, taskListenerManager, metaNodeService, sessionWatchers, - boltExchange, sessionInterests, sessionRegistry, blacklistManager); + boltExchange, provideDataProcessorManager); provideDataChangeFetchTask.setTaskEvent(event); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessor.java new file mode 100644 index 000000000..91566fa98 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessor.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.provideData; + +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; + +/** + * + * @author shangyu.wh + * @version 1.0: ProvideDataProcessor.java, v 0.1 2019-10-09 17:26 shangyu.wh Exp $ + */ +public interface ProvideDataProcessor { + + void changeDataProcess(ProvideData provideData); + + void fetchDataProcess(ProvideData provideData); + + boolean support(ProvideData provideData); +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessorManager.java new file mode 100644 index 000000000..c68dafc46 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/ProvideDataProcessorManager.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.provideData; + +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * + * @author shangyu.wh + * @version 1.0: ProvideDataProcessorManager.java, v 0.1 2019-10-09 17:39 shangyu.wh Exp $ + */ +public class ProvideDataProcessorManager implements ProvideDataProcessor { + + private Collection provideDataProcessors = new ArrayList<>(); + + public void addProvideDataProcessor(ProvideDataProcessor provideDataProcessor) { + provideDataProcessors.add(provideDataProcessor); + } + + @Override + public void changeDataProcess(ProvideData provideData) { + for (ProvideDataProcessor provideDataProcessor : provideDataProcessors) { + if (provideDataProcessor.support(provideData)) { + provideDataProcessor.changeDataProcess(provideData); + } + } + } + + @Override + public void fetchDataProcess(ProvideData provideData) { + for (ProvideDataProcessor provideDataProcessor : provideDataProcessors) { + if (provideDataProcessor.support(provideData)) { + provideDataProcessor.fetchDataProcess(provideData); + } + } + } + + @Override + public boolean support(ProvideData provideData) { + return false; + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/BlackListProvideDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/BlackListProvideDataProcessor.java new file mode 100644 index 000000000..9a002962a --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/BlackListProvideDataProcessor.java @@ -0,0 +1,139 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.provideData.processor; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistConstants; +import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; +import com.alipay.sofa.registry.server.session.registry.Registry; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * + * @author shangyu.wh + * @version 1.0: BlackListProvideDataProcessor.java, v 0.1 2019-10-09 20:21 shangyu.wh Exp $ + */ +public class BlackListProvideDataProcessor implements ProvideDataProcessor { + + private static final Logger LOGGER = LoggerFactory + .getLogger(BlackListProvideDataProcessor.class); + + @Autowired + private SessionServerConfig sessionServerConfig; + + @Autowired + private Registry sessionRegistry; + + @Autowired + private Exchange boltExchange; + + @Autowired + private BlacklistManager blacklistManager; + + @Override + public void changeDataProcess(ProvideData provideData) { + //black list data + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session blacklist no data existed,current config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + if (data != null) { + Map>> blacklistConfigMap = blacklistManager + .convertBlacklistConfig(data); + clientOffBlackIp(blacklistConfigMap); + LOGGER.info("Fetch session blacklist data switch {} success!", data); + } else { + LOGGER.info("Fetch session blacklist data null,current config not change!"); + } + return; + } + + private void clientOffBlackIp(Map>> blacklistConfigMap) { + + if (blacklistConfigMap != null) { + Set ipSet = new HashSet(); + + for (Map.Entry>> configEntry : blacklistConfigMap + .entrySet()) { + if (BlacklistConstants.FORBIDDEN_PUB.equals(configEntry.getKey()) + || BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX.equals(configEntry.getKey())) { + Map> typeMap = configEntry.getValue(); + if (typeMap != null) { + for (Map.Entry> typeEntry : typeMap.entrySet()) { + if (BlacklistConstants.IP_FULL.equals(typeEntry.getKey())) { + if (typeEntry.getValue() != null) { + ipSet.addAll(typeEntry.getValue()); + } + } + } + } + } + + } + + sessionRegistry.remove(getIpConnects(ipSet)); + } + } + + public List getIpConnects(Set _ipList) { + + Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); + + List connections = new ArrayList<>(); + + if (sessionServer != null) { + Collection channels = sessionServer.getChannels(); + for (Channel channel : channels) { + String key = NetUtil.toAddressString(channel.getRemoteAddress()); + String ip = key.substring(0, key.indexOf(":")); + if (_ipList.contains(ip)) { + connections.add(key); + } + } + } + + return connections; + } + + @Override + public void fetchDataProcess(ProvideData provideData) { + + } + + @Override + public boolean support(ProvideData provideData) { + return ValueConstants.BLACK_LIST_DATA_ID.equals(provideData.getDataInfoId()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/RenewSnapshotProvideDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/RenewSnapshotProvideDataProcessor.java new file mode 100644 index 000000000..6b829f0a3 --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/RenewSnapshotProvideDataProcessor.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.provideData.processor; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; +import com.alipay.sofa.registry.server.session.registry.Registry; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author shangyu.wh + * @version 1.0: RenewSnapshotProvideDataProcessor.java, v 0.1 2019-10-09 20:30 shangyu.wh Exp $ + */ +public class RenewSnapshotProvideDataProcessor implements ProvideDataProcessor { + + private static final Logger LOGGER = LoggerFactory + .getLogger(RenewSnapshotProvideDataProcessor.class); + + @Autowired + private Registry sessionRegistry; + + @Override + public void changeDataProcess(ProvideData provideData) { + //stop renew switch + if (provideData == null || provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER + .info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); + return; + } + boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData + .getProvideData().getObject()); + LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); + this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); + return; + } + + @Override + public void fetchDataProcess(ProvideData provideData) { + if (provideData == null || provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER + .info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); + return; + } + boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData + .getProvideData().getObject()); + LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); + this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); + } + + @Override + public boolean support(ProvideData provideData) { + return ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(provideData.getDataInfoId()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/StopPushProvideDataProcessor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/StopPushProvideDataProcessor.java new file mode 100644 index 000000000..316fae70f --- /dev/null +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/provideData/processor/StopPushProvideDataProcessor.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.session.provideData.processor; + +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.metaserver.ProvideData; +import com.alipay.sofa.registry.common.model.store.Subscriber; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; +import com.alipay.sofa.registry.server.session.registry.Registry; +import com.alipay.sofa.registry.server.session.scheduler.task.Constant; +import com.alipay.sofa.registry.server.session.store.Interests; +import com.alipay.sofa.registry.server.session.store.ReSubscribers; +import com.alipay.sofa.registry.task.listener.TaskEvent; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * + * @author shangyu.wh + * @version 1.0: StopPushProvideDataProcessor.java, v 0.1 2019-10-09 18:53 shangyu.wh Exp $ + */ +public class StopPushProvideDataProcessor implements ProvideDataProcessor { + + private static final Logger TASK_LOGGER = LoggerFactory.getLogger( + StopPushProvideDataProcessor.class, "[Task]"); + + private static final Logger LOGGER = LoggerFactory + .getLogger(StopPushProvideDataProcessor.class); + + @Autowired + private SessionServerConfig sessionServerConfig; + + @Autowired + private Registry sessionRegistry; + + @Autowired + private Interests sessionInterests; + + @Autowired + private TaskListenerManager taskListenerManager; + + @Override + public void changeDataProcess(ProvideData provideData) { + //push stop switch + if (provideData != null) { + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session stop push switch no data existed,config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + LOGGER.info("Fetch session stop push data switch {} success!", data); + + //receive stop push switch off + if (data != null) { + boolean switchData = Boolean.valueOf(data); + boolean ifChange = sessionServerConfig.isStopPushSwitch() != switchData; + sessionServerConfig.setStopPushSwitch(switchData); + if (!switchData) { + //avoid duplicate false receive + if (ifChange) { + fireReSubscriber(); + } + } else { + //stop push and stop fetch data task + sessionServerConfig.setBeginDataFetchTask(false); + } + } else { + LOGGER.error("Fetch session stop push data switch is null!"); + } + return; + } else { + LOGGER.info("Fetch session stop push switch data null,config not change!"); + } + return; + } + + /** + * open push switch to push all reSubscribers + */ + private void fireReSubscriber() { + + //try catch avoid to error cancel beginDataFetchTask switch on + try { + //begin push fire data fetch task first,avoid reSubscriber push duplicate + sessionRegistry.fetchChangDataProcess(); + } catch (Throwable e) { + LOGGER.error("Open push switch first fetch task execute error", e); + } + + try { + //wait 1 MINUTES for dataFetch task evict duplicate subscriber push + TimeUnit.MINUTES.sleep(1); + } catch (InterruptedException e) { + LOGGER.error("Wait for dataFetch Task Interrupted!"); + } + + //fetch task process 1 minutes,can schedule execute fetch task + sessionServerConfig.setBeginDataFetchTask(true); + + if (sessionInterests instanceof ReSubscribers) { + ReSubscribers reSubscriber = (ReSubscribers) sessionInterests; + + Map> reSubscribers = reSubscriber + .getReSubscribers(); + + if (reSubscribers != null && !reSubscribers.isEmpty()) { + reSubscribers.forEach( + (dataInfoId, subscribers) -> fireSubscriberMultiFetchTask(dataInfoId, subscribers.values())); + reSubscriber.clearReSubscribers(); + } + } + } + + private void fireSubscriberMultiFetchTask(String dataInfoId, Collection subscribers) { + //trigger fetch data for subscriber,and push to client node + if (!CollectionUtils.isEmpty(subscribers)) { + TaskEvent taskEvent = new TaskEvent(dataInfoId, TaskType.SUBSCRIBER_MULTI_FETCH_TASK); + taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); + TASK_LOGGER.info("send " + taskEvent.getTaskType() + + " subscribersSize:{},dataInfoId:{}", subscribers.size(), dataInfoId); + taskListenerManager.sendTaskEvent(taskEvent); + } + } + + @Override + public void fetchDataProcess(ProvideData provideData) { + if (provideData.getProvideData() == null + || provideData.getProvideData().getObject() == null) { + LOGGER.info("Fetch session stop push switch no data existed,config not change!"); + return; + } + String data = (String) provideData.getProvideData().getObject(); + sessionServerConfig.setStopPushSwitch(Boolean.valueOf(data)); + if (data != null) { + if (!Boolean.valueOf(data)) { + //stop push init on,then begin fetch data schedule task + sessionServerConfig.setBeginDataFetchTask(true); + } + } + LOGGER.info("Fetch session stop push data switch {} success!", data); + } + + @Override + public boolean support(ProvideData provideData) { + return ValueConstants.STOP_PUSH_DATA_SWITCH_DATA_ID.equals(provideData.getDataInfoId()); + } +} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java index 3f398d1aa..351068da0 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ProvideDataChangeFetchTask.java @@ -16,24 +16,10 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import org.springframework.util.CollectionUtils; - -import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.DataOperator; import com.alipay.sofa.registry.common.model.metaserver.NotifyProvideDataChange; import com.alipay.sofa.registry.common.model.metaserver.ProvideData; import com.alipay.sofa.registry.common.model.store.DataInfo; -import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.common.model.store.Watcher; import com.alipay.sofa.registry.core.model.ReceivedConfigData; @@ -45,17 +31,19 @@ import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.converter.ReceivedDataConverter; -import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistConstants; -import com.alipay.sofa.registry.server.session.filter.blacklist.BlacklistManager; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; -import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.server.session.store.Interests; -import com.alipay.sofa.registry.server.session.store.ReSubscribers; +import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * * @author shangyu.wh @@ -83,27 +71,21 @@ public class ProvideDataChangeFetchTask extends AbstractSessionTask { private final Exchange boltExchange; - private final Interests sessionInterests; - - private final Registry sessionRegistry; - - private final BlacklistManager blacklistManager; - private NotifyProvideDataChange notifyProvideDataChange; + private ProvideDataProcessor provideDataProcessorManager; + public ProvideDataChangeFetchTask(SessionServerConfig sessionServerConfig, TaskListenerManager taskListenerManager, MetaNodeService metaNodeService, Watchers sessionWatchers, - Exchange boltExchange, Interests sessionInterests, - Registry sessionRegistry, BlacklistManager blacklistManager) { + Exchange boltExchange, + ProvideDataProcessor provideDataProcessorManager) { this.sessionServerConfig = sessionServerConfig; this.taskListenerManager = taskListenerManager; this.metaNodeService = metaNodeService; this.sessionWatchers = sessionWatchers; this.boltExchange = boltExchange; - this.sessionInterests = sessionInterests; - this.sessionRegistry = sessionRegistry; - this.blacklistManager = blacklistManager; + this.provideDataProcessorManager = provideDataProcessorManager; } @Override @@ -130,71 +112,12 @@ public void execute() { if (notifyProvideDataChange.getDataOperator() != DataOperator.REMOVE) { provideData = metaNodeService.fetchData(dataInfoId); - if (ValueConstants.STOP_PUSH_DATA_SWITCH_DATA_ID.equals(dataInfoId)) { - //push stop switch - if (provideData != null) { - if (provideData.getProvideData() == null || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch session stop push switch no data existed,config not change!"); - return; - } - String data = (String) provideData.getProvideData().getObject(); - LOGGER.info("Fetch session stop push data switch {} success!", data); - - //receive stop push switch off - if (data != null) { - boolean switchData = Boolean.valueOf(data); - boolean ifChange = sessionServerConfig.isStopPushSwitch() != switchData; - sessionServerConfig.setStopPushSwitch(switchData); - if (!switchData) { - //avoid duplicate false receive - if (ifChange) { - fireReSubscriber(); - } - } else { - //stop push and stop fetch data task - sessionServerConfig.setBeginDataFetchTask(false); - } - } else { - LOGGER.error("Fetch session stop push data switch is null!"); - } - return; - } else { - LOGGER.info("Fetch session stop push switch data null,config not change!"); - } - return; - } else if (ValueConstants.BLACK_LIST_DATA_ID.equals(dataInfoId)) { - //black list data - if (provideData.getProvideData() == null || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch session blacklist no data existed,current config not change!"); - return; - } - String data = (String) provideData.getProvideData().getObject(); - if (data != null) { - Map>> blacklistConfigMap = blacklistManager - .convertBlacklistConfig(data); - clientOffBlackIp(blacklistConfigMap); - LOGGER.info("Fetch session blacklist data switch {} success!", data); - } else { - LOGGER.info("Fetch session blacklist data null,current config not change!"); - } - return; - } else if (ValueConstants.ENABLE_DATA_RENEW_SNAPSHOT.equals(dataInfoId)) { - //stop renew switch - if (provideData == null || provideData.getProvideData() == null - || provideData.getProvideData().getObject() == null) { - LOGGER.info("Fetch enableDataRenewSnapshot but no data existed, current config not change!"); - return; - } - boolean enableDataRenewSnapshot = Boolean.parseBoolean((String) provideData.getProvideData().getObject()); - LOGGER.info("Fetch enableDataRenewSnapshot {} success!", enableDataRenewSnapshot); - this.sessionRegistry.setEnableDataRenewSnapshot(enableDataRenewSnapshot); - return; - } - if (provideData == null) { LOGGER.warn("Notify provider data Change request {} fetch no provider data!", notifyProvideDataChange); return; } + provideDataProcessorManager.changeDataProcess(provideData); + } DataInfo dataInfo = DataInfo.valueOf(dataInfoId); @@ -228,54 +151,6 @@ public void execute() { } } - /** - * open push switch to push all reSubscribers - */ - private void fireReSubscriber() { - - //try catch avoid to error cancel beginDataFetchTask switch on - try { - //begin push fire data fetch task first,avoid reSubscriber push duplicate - sessionRegistry.fetchChangDataProcess(); - } catch (Throwable e) { - LOGGER.error("Open push switch first fetch task execute error", e); - } - - try { - //wait 1 MINUTES for dataFetch task evict duplicate subscriber push - TimeUnit.MINUTES.sleep(1); - } catch (InterruptedException e) { - LOGGER.error("Wait for dataFetch Task Interrupted!"); - } - - //fetch task process 1 minutes,can schedule execute fetch task - sessionServerConfig.setBeginDataFetchTask(true); - - if (this.sessionInterests instanceof ReSubscribers) { - ReSubscribers reSubscriber = (ReSubscribers) sessionInterests; - - Map> reSubscribers = reSubscriber - .getReSubscribers(); - - if (reSubscribers != null && !reSubscribers.isEmpty()) { - reSubscribers.forEach( - (dataInfoId, subscribers) -> fireSubscriberMultiFetchTask(dataInfoId, subscribers.values())); - reSubscriber.clearReSubscribers(); - } - } - } - - private void fireSubscriberMultiFetchTask(String dataInfoId, Collection subscribers) { - //trigger fetch data for subscriber,and push to client node - if (!CollectionUtils.isEmpty(subscribers)) { - TaskEvent taskEvent = new TaskEvent(dataInfoId, TaskType.SUBSCRIBER_MULTI_FETCH_TASK); - taskEvent.setAttribute(Constant.PUSH_CLIENT_SUBSCRIBERS, subscribers); - TASK_LOGGER.info("send " + taskEvent.getTaskType() - + " subscribersSize:{},dataInfoId:{}", subscribers.size(), dataInfoId); - taskListenerManager.sendTaskEvent(taskEvent); - } - } - private void firePushTask(ReceivedConfigData receivedConfigData, URL clientUrl) { Map parameter = new HashMap<>(); @@ -285,53 +160,6 @@ private void firePushTask(ReceivedConfigData receivedConfigData, URL clientUrl) taskListenerManager.sendTaskEvent(taskEvent); } - private void clientOffBlackIp(Map>> blacklistConfigMap) { - - if (blacklistConfigMap != null) { - Set ipSet = new HashSet(); - - for (Map.Entry>> configEntry : blacklistConfigMap - .entrySet()) { - if (BlacklistConstants.FORBIDDEN_PUB.equals(configEntry.getKey()) - || BlacklistConstants.FORBIDDEN_SUB_BY_PREFIX.equals(configEntry.getKey())) { - Map> typeMap = configEntry.getValue(); - if (typeMap != null) { - for (Map.Entry> typeEntry : typeMap.entrySet()) { - if (BlacklistConstants.IP_FULL.equals(typeEntry.getKey())) { - if (typeEntry.getValue() != null) { - ipSet.addAll(typeEntry.getValue()); - } - } - } - } - } - - } - - sessionRegistry.remove(getIpConnects(ipSet)); - } - } - - public List getIpConnects(Set _ipList) { - - Server sessionServer = boltExchange.getServer(sessionServerConfig.getServerPort()); - - List connections = new ArrayList<>(); - - if (sessionServer != null) { - Collection channels = sessionServer.getChannels(); - for (Channel channel : channels) { - String key = NetUtil.toAddressString(channel.getRemoteAddress()); - String ip = key.substring(0, key.indexOf(":")); - if (_ipList.contains(ip)) { - connections.add(key); - } - } - } - - return connections; - } - private Map getCache(String connectId) { Map map = sessionWatchers.queryByConnectId(connectId); return map == null ? new ConcurrentHashMap<>() : map; From 827b48e331c88ee52a6306d8e444c1f6c245d76e Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 11 Oct 2019 21:45:38 +0800 Subject: [PATCH 132/161] =?UTF-8?q?Memory=20optimization=EF=BC=9ADatum.pro?= =?UTF-8?q?cessDatum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sofa/registry/common/model/dataserver/Datum.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java index 246363fa0..770dc8ef9 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/Datum.java @@ -253,7 +253,13 @@ public static Datum processDatum(Datum datum) { Map pubMap = datum.getPubMap(); if (pubMap != null && !pubMap.isEmpty()) { - pubMap.forEach((registerId, publisher) -> Publisher.processPublisher(publisher)); + pubMap.forEach((registerId, publisher) -> { + // let registerId == pub.getRegisterId in every , for reducing old gen memory + // because this Datum is put into Memory directly, by DatumCache.coverDatum + publisher.setRegisterId(registerId); + // change publisher word cache + Publisher.processPublisher(publisher); + }); } return datum; From 51d35682547e44646470682c8392bb725678907a Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 28 Oct 2019 21:15:45 +0800 Subject: [PATCH 133/161] add session notify test --- .../registry/test/sync/SessionNotifyTest.java | 402 ++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java new file mode 100644 index 000000000..9c1e657fb --- /dev/null +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java @@ -0,0 +1,402 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.test.sync; + +import com.alipay.remoting.Connection; +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.GenericResponse; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.ServerDataBox; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import com.alipay.sofa.registry.common.model.dataserver.Datum; +import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; +import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; +import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; +import com.alipay.sofa.registry.common.model.store.DataInfo; +import com.alipay.sofa.registry.common.model.store.Publisher; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.remoting.CallbackHandler; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.ChannelHandler; +import com.alipay.sofa.registry.remoting.Client; +import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.bolt.BoltChannel; +import com.alipay.sofa.registry.remoting.bolt.BoltClient; +import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; +import com.alipay.sofa.registry.remoting.exchange.Exchange; +import com.alipay.sofa.registry.server.data.remoting.dataserver.DataServerConnectionFactory; +import com.alipay.sofa.registry.server.data.remoting.dataserver.handler.DataSyncServerConnectionHandler; +import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; +import com.alipay.sofa.registry.server.session.cache.DatumKey; +import com.alipay.sofa.registry.server.session.cache.Key; +import com.alipay.sofa.registry.server.session.cache.Key.KeyType; +import com.alipay.sofa.registry.server.session.cache.SessionCacheService; +import com.alipay.sofa.registry.server.session.store.SessionInterests; +import com.alipay.sofa.registry.test.BaseIntegrationTest; +import com.alipay.sofa.registry.util.DatumVersionUtil; +import com.alipay.sofa.registry.util.NamedThreadFactory; +import com.alipay.sofa.registry.util.ParaCheckUtil; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_DATA_CENTER; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; + +/** + * @author xuanbei + * @since 2019/1/16 + */ +@RunWith(SpringRunner.class) +public class SessionNotifyTest extends BaseIntegrationTest { + private static final int TEST_SYNC_PORT = 9677; + private static DataServerConnectionFactory dataServerConnectionFactory; + private static Server dataSyncServer; + private static String remoteIP; + private static BoltChannel boltChannel; + + private static Map boltChannelMap = new ConcurrentHashMap<>(); + + private static Map boltChannelMapInt = new ConcurrentHashMap<>(); + + private static final int connectNum = 20; + + private static final int threadNum = 20; + + private static final int idNum = 100; + + private static SessionCacheService sessionCacheService; + + private static SessionInterests sessionInterests; + + private static Datum datum; + + private static BoltClient boltClientFetch = new BoltClient(); + + private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), new NamedThreadFactory("TestSessionNotifyFetch")); + + @BeforeClass + public static void beforeClass() throws Exception { + startServerIfNecessary(); + BoltExchange boltExchange = (BoltExchange) dataApplicationContext.getBean("boltExchange"); + dataServerConnectionFactory = dataApplicationContext.getBean("dataServerConnectionFactory", + DataServerConnectionFactory.class); + + sessionCacheService = sessionApplicationContext.getBean("sessionCacheService",SessionCacheService.class); + + sessionInterests = sessionApplicationContext.getBean("sessionInterests",SessionInterests.class); + + Map publisherMap = new HashMap<>(); + + for (int i=0;i<10;i++) { + Publisher publisher = new Publisher(); + + String connectId = "123.123.123."+i; + publisher.setAppName("APP"); + //ZONE MUST BE CURRENT SESSION ZONE + publisher.setCell("CELL"); + publisher.setClientId(connectId); + publisher.setDataId(MockSyncDataHandler.dataId); + publisher.setGroup(DEFAULT_GROUP); + publisher.setInstanceId(DEFAULT_INSTANCE_ID); + publisher.setRegisterId(UUID.randomUUID().toString()); + publisher.setProcessId(connectId); + publisher.setVersion(Long.valueOf(i)); + + //registerTimestamp must happen from server,client time maybe different cause pub and unPublisher fail + publisher.setRegisterTimestamp(System.currentTimeMillis()); + + publisher.setClientRegisterTimestamp(System.currentTimeMillis()); + publisher.setSourceAddress(new URL(connectId, 5050)); + + publisher.setClientVersion(ClientVersion.StoreData); + + DataInfo dataInfo = new DataInfo(DEFAULT_INSTANCE_ID, MockSyncDataHandler.dataId, + DEFAULT_GROUP); + publisher.setDataInfoId(dataInfo.getDataInfoId()); + + ServerDataBox serverDataBox = new ServerDataBox(""); + List list = new ArrayList<>(); + list.add(serverDataBox); + + publisher.setDataList(list); + publisherMap.put(publisher.getRegisterId(),publisher); + } + + datum = new Datum(); + datum.setDataId(MockSyncDataHandler.dataId); + datum.setInstanceId(DEFAULT_INSTANCE_ID); + datum.setGroup(DEFAULT_GROUP); + //no datum set version current timestamp + datum.setVersion(DatumVersionUtil.nextId()); + datum.setPubMap(publisherMap); + datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); + + + // open sync port and connect it + dataSyncServer = boltExchange.open(new URL(NetUtil.getLocalAddress().getHostAddress(), + TEST_SYNC_PORT), new ChannelHandler[] { new MockGetDataHandler(),dataApplicationContext.getBean( + DataSyncServerConnectionHandler.class) }); + + for (int i = 0; i < connectNum; i++) { + + URL urltemp = new URL(LOCAL_ADDRESS, TEST_SYNC_PORT); + + Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE+i, urltemp,new ChannelHandler[]{new MockDataChangeRequestHandler()}); + + + BoltChannel boltChannel = (BoltChannel)client.getChannel(urltemp); + + + String key = boltChannel.getConnection().getLocalIP()+":"+boltChannel.getConnection().getLocalPort(); + boltChannelMap.put(key,boltChannel); + System.out.println("testsyncserver remote connect remote:" + + boltChannel.getConnection().getRemoteAddress() + " local:" + + key); + } + + for (int i = 0; i < connectNum; i++) { + + URL urltemp = new URL(LOCAL_ADDRESS, TEST_SYNC_PORT); + + Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE+i+10, urltemp,new ChannelHandler[]{new MockDataChangeRequestHandler()}); + + + BoltChannel boltChannel = (BoltChannel)client.getChannel(urltemp); + + + String key = boltChannel.getConnection().getLocalIP()+":"+boltChannel.getConnection().getLocalPort(); + boltChannelMapInt.put(i,boltChannel); + System.out.println("testsyncserver remote connect remote:" + + boltChannel.getConnection().getRemoteAddress() + " local:" + + key); + } + + Thread.sleep(500); + } + + @Ignore + @Test + public void doTest() throws Exception { + + ThreadPoolExecutor executor = new ThreadPoolExecutor(threadNum, threadNum, 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), new NamedThreadFactory("TestSessionNotify")); + for (int i = 0; i < idNum; i++) { + + int finalI = i; + executor.submit(()->{ + + // post sync data request + DataChangeRequest request = new DataChangeRequest(DataInfo.toDataInfoId( + MockSyncDataHandler.dataId, DEFAULT_INSTANCE_ID, DEFAULT_GROUP), LOCAL_DATACENTER, + finalI); + + boltChannelMap.forEach((connect,boltChannel)->{ + + CommonResponse commonResponse = null; + try { + dataSyncServer.sendCallback(dataSyncServer + .getChannel(new URL(boltChannel.getConnection().getLocalIP(), boltChannel.getConnection().getLocalPort())), request, + new NotifyCallback(boltChannel.getConnection(),request),3000); + //assertTrue(commonResponse.isSuccess()); + } catch (Exception e) { + e.printStackTrace(); + } + }); + }); + } + + while (true){ + TimeUnit.SECONDS.sleep(10); + } + + } + + + public static class MockDataChangeRequestHandler extends AbstractServerHandler{ + + @Override + public void checkParam(DataChangeRequest request) throws RuntimeException { + + } + + @Override + public Object doHandle(Channel channel, DataChangeRequest request) { + + DataChangeRequest dataChangeRequest = (DataChangeRequest) request; + + dataChangeRequest.setDataCenter(dataChangeRequest.getDataCenter()); + dataChangeRequest.setDataInfoId(dataChangeRequest.getDataInfoId()); + long version = dataChangeRequest.getVersion(); + + + //update cache when change + sessionCacheService.invalidate(new Key(KeyType.OBJ, DatumKey.class.getName(), new DatumKey( + dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter()))); + + + try { + boolean resultT = sessionInterests.checkInterestVersions( + dataChangeRequest.getDataCenter(), dataChangeRequest.getDataInfoId(), + dataChangeRequest.getVersion()); + //if (!resultT) { + // return null; + //} + + System.out.println(String.format( + "Data version has change,and will fetch to update!Request=%s,URL=%s", + dataChangeRequest, channel.getRemoteAddress())); + //TimeUnit.MILLISECONDS.sleep(2000); + + //fireChangFetch(dataChangeRequest); + //if(version%3==0) { + executor.submit(() -> { + + Object result = boltClientFetch.sendSync(boltChannelMapInt.get(Math.abs((MockSyncDataHandler.dataId+version).hashCode() % connectNum)), + new GetDataRequest(MockSyncDataHandler.dataId, DEFAULT_DATA_CENTER), 1000); + GenericResponse genericResponse = (GenericResponse) result; + if (genericResponse.isSuccess()) { + Map map = (Map) genericResponse.getData(); + if (map == null || map.isEmpty()) { + System.out.println(String.format("GetDataRequest get response contains no datum!dataInfoId=%s", + MockSyncDataHandler.dataId)); + } else { + System.out.println(String.format("GetDataRequest get response contains datum!dataInfoId=%s,size=%s", + MockSyncDataHandler.dataId, map.get(DEFAULT_DATA_CENTER).getPubMap().size())); + } + } else { + throw new RuntimeException( + String.format("GetDataRequest has got fail response!dataInfoId:%s msg:%s", MockSyncDataHandler.dataId, + genericResponse.getMessage())); + } + }); + //} + + } catch (Exception e) { + //LOGGER.error("DataChange Request error!", e); + throw new RuntimeException("DataChangeRequest Request error!", e); + } + //System.out.println(String.format("There are not Subscriber Existed! Who are interest with dataInfoId %s !", + // request.getDataInfoId())); + return null; + } + + @Override + public GenericResponse buildFailedResponse(String msg) { + return new GenericResponse().fillFailed(msg); + } + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + public Class interest() { + return DataChangeRequest.class; + } + } + + private static class MockGetDataHandler extends AbstractServerHandler{ + public void checkParam(GetDataRequest request) throws RuntimeException { + ParaCheckUtil.checkNotBlank(request.getDataInfoId(), "GetDataRequest.dataInfoId"); + } + + @Override + public Object doHandle(Channel channel, GetDataRequest request) { + Map map = new HashMap<>(); + map.put(DEFAULT_DATA_CENTER,datum); + + return new GenericResponse>().fillSucceed(map); + } + + @Override + public GenericResponse> buildFailedResponse(String msg) { + return new GenericResponse>().fillFailed(msg); + } + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + public Class interest() { + return GetDataRequest.class; + } + + @Override + protected Node.NodeType getConnectNodeType() { + return Node.NodeType.DATA; + } + } + + private class NotifyCallback implements CallbackHandler { + + private int retryTimes = 0; + private Connection connection; + private DataChangeRequest request; + + public NotifyCallback(Connection connection, DataChangeRequest request) { + this.connection = connection; + this.request = request; + } + + @Override + public void onCallback(Channel channel, Object message) { + CommonResponse result = (CommonResponse) message; + if (result != null && !result.isSuccess()) { + System.out.println(String + .format( + "response not success when notify sessionServer(%s), retryTimes=%s, request=%s, response=%s", + connection.getRemoteAddress(), retryTimes, request, result)); + //onFailed(this); + } + } + + @Override + public void onException(Channel channel, Throwable e) { + System.err.println(String.format( + "exception when notify sessionServer(%s), retryTimes=%s, request=%s,error=%s", + connection.getRemoteAddress(), retryTimes, request,e)); + e.printStackTrace(); + //onFailed(this); + } + + @Override + public Executor getExecutor() { + return null; + } + + } +} From df0719571820fa8c05160f23232b879f2bf7f087 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 29 Oct 2019 20:40:39 +0800 Subject: [PATCH 134/161] copy from mybank: 1. Update Subscriber: support for push context 2. increase queueSize of checkPushExecutor 3. fix the isolation function of Gzone and Rzone --- .../common/model/store/Subscriber.java | 104 +++++++++++++----- .../handler/NotifyFetchDatumHandler.java | 1 - .../session/scheduler/ExecutorManager.java | 27 ++--- .../scheduler/task/DataChangeFetchTask.java | 2 +- .../session/scheduler/task/DataPushTask.java | 20 ++-- 5 files changed, 99 insertions(+), 55 deletions(-) diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java index 7dc9dcfb6..3d9b532b7 100644 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/store/Subscriber.java @@ -20,6 +20,7 @@ import java.util.concurrent.ConcurrentHashMap; import com.alipay.sofa.registry.common.model.ElementType; +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.core.model.ScopeEnum; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -31,16 +32,16 @@ public class Subscriber extends BaseInfo { /** UID */ - private static final long serialVersionUID = 98433360274932292L; + private static final long serialVersionUID = 98433360274932292L; /** */ - private ScopeEnum scope; + private ScopeEnum scope; /** */ - private ElementType elementType; + private ElementType elementType; /** - * all dataCenter push dataInfo version + * last push context */ - private Map lastPushVersions = new ConcurrentHashMap<>(); + private Map lastPushContexts = new ConcurrentHashMap<>(); /** * Getter method for property scope. @@ -71,7 +72,11 @@ public ElementType getElementType() { */ public boolean checkVersion(String dataCenter, Long version) { - Long oldVersion = lastPushVersions.get(dataCenter); + PushContext lastPushContext = lastPushContexts.get(dataCenter); + if (lastPushContext == null) { + return version != null; + } + Long oldVersion = lastPushContext.pushVersion; if (oldVersion == null) { return version != null; } else { @@ -88,15 +93,26 @@ public boolean checkVersion(String dataCenter, Long version) { * @return */ public void checkAndUpdateVersion(String dataCenter, Long version) { + checkAndUpdateVersion(dataCenter, version, -1); + } + + /** + * check version input greater or equal to current version + * @param version + * @return + */ + public void checkAndUpdateVersion(String dataCenter, Long version, int pubCount) { while (true) { - Long oldVersion = lastPushVersions.putIfAbsent(dataCenter, version); + PushContext pushContext = new PushContext(version, pubCount); + PushContext oldPushContext = lastPushContexts.putIfAbsent(dataCenter, pushContext); // Add firstly - if (oldVersion == null) { + if (oldPushContext == null) { break; } else { - if (version > oldVersion) { - if (lastPushVersions.replace(dataCenter, oldVersion, version)) { + if (oldPushContext.pushVersion == null + || (pushContext.pushVersion != null && pushContext.pushVersion > oldPushContext.pushVersion)) { + if (lastPushContexts.replace(dataCenter, oldPushContext, pushContext)) { break; } } else { @@ -106,6 +122,23 @@ public void checkAndUpdateVersion(String dataCenter, Long version) { } } + /** + * If the pushed data is empty, check the last push, for avoid continuous empty datum push + */ + public boolean allowPush(String dataCenter, int pubCount) { + boolean allowPush = true; + // condition of no push: + // 1. last push count is 0 and this time is also 0 + // 2. last push is a valid push (version > 1) + if (pubCount == 0) { + PushContext pushContext = lastPushContexts.get(dataCenter); + allowPush = !(pushContext != null && pushContext.pushPubCount == 0 + //last push is a valid push + && pushContext.pushVersion != null && pushContext.pushVersion > ValueConstants.DEFAULT_NO_DATUM_VERSION); + } + return allowPush; + } + /** * Setter method for property elementType. * @@ -126,28 +159,10 @@ protected String getOtherInfo() { final StringBuilder sb = new StringBuilder("scope="); sb.append(scope).append(","); sb.append("elementType=").append(elementType).append(","); - sb.append("lastPushVersion=").append(lastPushVersions); + sb.append("pushVersion=").append(lastPushContexts); return sb.toString(); } - /** - * Getter method for property lastPushVersions. - * - * @return property value of lastPushVersions - */ - public Map getLastPushVersions() { - return lastPushVersions; - } - - /** - * Setter method for property lastPushVersions . - * - * @param lastPushVersions value to be assigned to property lastPushVersions - */ - public void setLastPushVersions(Map lastPushVersions) { - this.lastPushVersions = lastPushVersions; - } - /** * @see Object#toString() */ @@ -156,7 +171,7 @@ public String toString() { final StringBuilder sb = new StringBuilder("Subscriber{"); sb.append("scope=").append(scope); sb.append(", elementType=").append(elementType); - sb.append(", lastPushVersions=").append(lastPushVersions); + sb.append(", lastPushContexts=").append(lastPushContexts); sb.append(", super=").append(super.toString()); sb.append('}'); return sb.toString(); @@ -180,4 +195,33 @@ public static Subscriber internSubscriber(Subscriber subscriber) { return subscriber; } + + static class PushContext { + /** + * last pushed dataInfo version + */ + private Long pushVersion; + + /** + * push pushed dataInfo pubCount + */ + private int pushPubCount; + + public PushContext(Long pushVersion, int pushPubCount) { + this.pushVersion = pushVersion; + this.pushPubCount = pushPubCount; + } + + /** + * @see Object#toString() + */ + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("PushContext{"); + sb.append("pushVersion=").append(pushVersion); + sb.append(", pushPubCount=").append(pushPubCount); + sb.append('}'); + return sb.toString(); + } + } } \ No newline at end of file diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index 996c1e328..068b57e35 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -158,7 +158,6 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); - if (datum != null) { // wrap by WordCache datum = Datum.internDatum(datum); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index 13ab127a1..c7edfaade 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -16,6 +16,19 @@ */ package com.alipay.sofa.registry.server.session.scheduler; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.metrics.TaskMetrics; @@ -28,18 +41,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * @@ -161,7 +162,7 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { .computeIfAbsent(USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, k -> new SessionThreadPoolExecutor( USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, 100, 600, 60L, TimeUnit.SECONDS, - new LinkedBlockingQueue(100000), + new LinkedBlockingQueue(150000), new NamedThreadFactory("UserDataElementPushCheck-executor", true))); connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 626088eb5..fd3013179 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -237,7 +237,7 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR // zone scope subscribe only return zone list return true; - } else if (ScopeEnum.dataCenter == scopeEnum) { + } else if (ScopeEnum.dataCenter == scopeEnum || ScopeEnum.global == scopeEnum) { // disable zone config return sessionServerConfig.isInvalidForeverZone(zone) && !sessionServerConfig .isInvalidIgnored(dataId); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java index 8e768b46f..8e57586be 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataPushTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataPushRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -33,15 +42,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - /** * * @author shangyu.wh @@ -154,7 +154,7 @@ private void fireReceivedDataMultiPushTask(Datum datum, List subscriberR // zone scope subscribe only return zone list return true; - } else if (ScopeEnum.dataCenter == scopeEnum) { + } else if (ScopeEnum.dataCenter == scopeEnum || ScopeEnum.global == scopeEnum) { // disable zone config if (sessionServerConfig.isInvalidForeverZone(zone) && !sessionServerConfig.isInvalidIgnored(dataId)) { From 830a01c60f6099bf9e0f3a658b57d1bbd0741b44 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Wed, 30 Oct 2019 16:01:07 +0800 Subject: [PATCH 135/161] Modify the deny policy of accessDataExecutor of SessionServer --- .../DataServerBeanConfiguration.java | 8 +- .../bootstrap/SessionServerConfiguration.java | 23 ++-- .../remoting/handler/WatcherHandler.java | 14 ++- .../session/scheduler/ExecutorManager.java | 119 ++++++++---------- .../scheduler/SessionThreadPoolExecutor.java | 39 +++--- 5 files changed, 102 insertions(+), 101 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 155861aab..7b8a2d590 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -127,7 +127,7 @@ public CommonConfig commonConfig() { } @Bean - @ConditionalOnMissingBean(name = "dataServerConfig") + @ConditionalOnMissingBean public DataServerConfig dataServerConfig(CommonConfig commonConfig) { return new DataServerConfig(commonConfig); } @@ -207,7 +207,7 @@ public MetaServerConnectionFactory metaServerConnectionFactory() { } @Bean(name = "serverHandlers") - public Collection serverHandlers(DataServerConfig dataServerConfig) { + public Collection serverHandlers() { Collection list = new ArrayList<>(); list.add(getDataHandler()); list.add(clientOffHandler()); @@ -222,7 +222,7 @@ public Collection serverHandlers(DataServerConfig dataSer } @Bean(name = "serverSyncHandlers") - public Collection serverSyncHandlers(DataServerConfig dataServerConfig) { + public Collection serverSyncHandlers() { Collection list = new ArrayList<>(); list.add(getDataHandler()); list.add(publishDataProcessor()); @@ -370,7 +370,7 @@ public SnapshotBackUpNotifier snapshotBackUpNotifier() { } @Bean(name = "dataChangeNotifiers") - public List dataChangeNotifiers(DataServerConfig dataServerBootstrapConfig) { + public List dataChangeNotifiers() { List list = new ArrayList<>(); list.add(sessionServerNotifier()); list.add(tempPublisherNotifier()); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java index 1faa2628c..ead4e0edb 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfiguration.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; +import java.util.ArrayList; +import java.util.Collection; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import com.alipay.sofa.registry.remoting.bolt.exchange.BoltExchange; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.exchange.NodeExchanger; @@ -133,16 +144,6 @@ import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.PropertySplitter; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -import java.util.ArrayList; -import java.util.Collection; /** * @@ -168,7 +169,7 @@ public CommonConfig commonConfig() { } @Bean - @ConditionalOnMissingBean(name = "sessionServerConfig") + @ConditionalOnMissingBean public SessionServerConfig sessionServerConfig(CommonConfig commonConfig) { return new SessionServerConfigBean(commonConfig); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/WatcherHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/WatcherHandler.java index 07fd647ab..aa8825973 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/WatcherHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/WatcherHandler.java @@ -16,11 +16,15 @@ */ package com.alipay.sofa.registry.server.session.remoting.handler; +import java.util.concurrent.Executor; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.core.model.ConfiguratorRegister; import com.alipay.sofa.registry.core.model.RegisterResponse; import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.strategy.WatcherHandlerStrategy; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -28,6 +32,9 @@ * @version $Id: SubscriberHandler.java, v 0.1 2017-11-30 15:01 shangyu.wh Exp $ */ public class WatcherHandler extends AbstractServerHandler { + @Autowired + private ExecutorManager executorManager; + @Autowired private WatcherHandlerStrategy watcherHandlerStrategy; @@ -49,4 +56,9 @@ public Class interest() { return ConfiguratorRegister.class; } + @Override + public Executor getExecutor() { + return executorManager.getAccessDataExecutor(); + } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index c7edfaade..b5b4851a4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -112,32 +112,36 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { scheduler = new ScheduledThreadPoolExecutor(7, new NamedThreadFactory("SessionScheduler")); - fetchDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-fetchData")); + fetchDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory("SessionScheduler-fetchData")); - renNewDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-renewData")); + renNewDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory("SessionScheduler-renewData")); - getSessionNodeExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-getSessionNode")); + getSessionNodeExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory("SessionScheduler-getSessionNode")); standaloneCheckVersionExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-standaloneCheckVersion")); - connectMetaExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-connectMetaServer")); + connectMetaExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory("SessionScheduler-connectMetaServer")); - connectDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, - new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-connectDataServer")); + connectDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), + new NamedThreadFactory("SessionScheduler-connectDataServer")); - accessDataExecutor = reportExecutors - .computeIfAbsent(ACCESS_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(ACCESS_DATA_EXECUTOR, + accessDataExecutor = reportExecutors.computeIfAbsent(ACCESS_DATA_EXECUTOR, + k -> new SessionThreadPoolExecutor(ACCESS_DATA_EXECUTOR, sessionServerConfig.getAccessDataExecutorMinPoolSize(), sessionServerConfig.getAccessDataExecutorMaxPoolSize(), - sessionServerConfig.getAccessDataExecutorKeepAliveTime(), - TimeUnit.SECONDS, + sessionServerConfig.getAccessDataExecutorKeepAliveTime(), TimeUnit.SECONDS, new ArrayBlockingQueue<>(sessionServerConfig.getAccessDataExecutorQueueSize()), - new NamedThreadFactory("AccessData-executor", true))); + new NamedThreadFactory("AccessData-executor", true), (r, executor) -> { + String msg = String + .format("Task(%s) %s rejected from %s, just ignore it to let client timeout.", + r.getClass(), r, executor); + LOGGER.error(msg); + })); pushTaskExecutor = reportExecutors.computeIfAbsent(PUSH_TASK_EXECUTOR, k -> new ThreadPoolExecutor(sessionServerConfig.getPushTaskExecutorMinPoolSize(), @@ -152,32 +156,29 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { k -> new SessionThreadPoolExecutor(DATA_CHANGE_REQUEST_EXECUTOR, sessionServerConfig.getDataChangeExecutorMinPoolSize(), sessionServerConfig.getDataChangeExecutorMaxPoolSize(), - sessionServerConfig.getDataChangeExecutorKeepAliveTime(), - TimeUnit.SECONDS, + sessionServerConfig.getDataChangeExecutorKeepAliveTime(), TimeUnit.SECONDS, new ArrayBlockingQueue<>(sessionServerConfig.getDataChangeExecutorQueueSize()), - new NamedThreadFactory( - "DataChangeRequestHandler-executor", true))); - - checkPushExecutor = reportExecutors - .computeIfAbsent(USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, k -> new SessionThreadPoolExecutor( - USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, 100, 600, 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(150000), + new NamedThreadFactory("DataChangeRequestHandler-executor", true))); + + checkPushExecutor = reportExecutors.computeIfAbsent(USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, + k -> new SessionThreadPoolExecutor(USER_DATA_ELEMENT_PUSH_TASK_CHECK_EXECUTOR, 100, 600, 60L, + TimeUnit.SECONDS, new LinkedBlockingQueue(150000), new NamedThreadFactory("UserDataElementPushCheck-executor", true))); - connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR,k->new SessionThreadPoolExecutor( - CONNECT_CLIENT_EXECUTOR, sessionServerConfig.getConnectClientExecutorMinPoolSize(), - sessionServerConfig.getConnectClientExecutorMaxPoolSize(), 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), - new NamedThreadFactory("DisconnectClientExecutor", true))); + connectClientExecutor = reportExecutors.computeIfAbsent(CONNECT_CLIENT_EXECUTOR, + k -> new SessionThreadPoolExecutor(CONNECT_CLIENT_EXECUTOR, + sessionServerConfig.getConnectClientExecutorMinPoolSize(), + sessionServerConfig.getConnectClientExecutorMaxPoolSize(), 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue(sessionServerConfig.getConnectClientExecutorQueueSize()), + new NamedThreadFactory("DisconnectClientExecutor", true))); - pushTaskCheckAsyncHashedWheelTimer = new AsyncHashedWheelTimer(new NamedThreadFactory("PushTaskConfirmCheck-executor", true), + pushTaskCheckAsyncHashedWheelTimer = new AsyncHashedWheelTimer( + new NamedThreadFactory("PushTaskConfirmCheck-executor", true), sessionServerConfig.getPushTaskConfirmCheckWheelTicksDuration(), TimeUnit.MILLISECONDS, sessionServerConfig.getPushTaskConfirmCheckWheelTicksSize(), sessionServerConfig.getPushTaskConfirmCheckExecutorThreadSize(), - sessionServerConfig.getPushTaskConfirmCheckExecutorQueueSize(), new ThreadFactoryBuilder() - .setNameFormat("PushTaskConfirmCheck-executor-%d").build(), + sessionServerConfig.getPushTaskConfirmCheckExecutorQueueSize(), + new ThreadFactoryBuilder().setNameFormat("PushTaskConfirmCheck-executor-%d").build(), new TaskFailedCallback() { @Override public void executionRejected(Throwable e) { @@ -189,54 +190,42 @@ public void executionFailed(Throwable e) { LOGGER.error("executionFailed: " + e.getMessage(), e); } }); - publishDataExecutor = reportExecutors - .computeIfAbsent(PUBLISH_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(PUBLISH_DATA_EXECUTOR, + publishDataExecutor = reportExecutors.computeIfAbsent(PUBLISH_DATA_EXECUTOR, + k -> new SessionThreadPoolExecutor(PUBLISH_DATA_EXECUTOR, sessionServerConfig.getPublishDataExecutorMinPoolSize(), sessionServerConfig.getPublishDataExecutorMaxPoolSize(), - sessionServerConfig.getPublishDataExecutorKeepAliveTime(), - TimeUnit.SECONDS, + sessionServerConfig.getPublishDataExecutorKeepAliveTime(), TimeUnit.SECONDS, new ArrayBlockingQueue<>(sessionServerConfig.getPublishDataExecutorQueueSize()), new NamedThreadFactory("PublishData-executor", true))); } public void startScheduler() { - scheduler.schedule( - new TimedSupervisorTask("FetchData", scheduler, fetchDataExecutor, + scheduler.schedule(new TimedSupervisorTask("FetchData", scheduler, fetchDataExecutor, sessionServerConfig.getSchedulerFetchDataTimeout(), TimeUnit.MINUTES, - sessionServerConfig.getSchedulerFetchDataExpBackOffBound(), - () -> sessionRegistry.fetchChangData()), + sessionServerConfig.getSchedulerFetchDataExpBackOffBound(), () -> sessionRegistry.fetchChangData()), sessionServerConfig.getSchedulerFetchDataFirstDelay(), TimeUnit.SECONDS); - scheduler.schedule( - new TimedSupervisorTask("RenewData", scheduler, renNewDataExecutor, + scheduler.schedule(new TimedSupervisorTask("RenewData", scheduler, renNewDataExecutor, sessionServerConfig.getSchedulerHeartbeatTimeout(), TimeUnit.SECONDS, - sessionServerConfig.getSchedulerHeartbeatExpBackOffBound(), - () -> sessionNodeManager.renewNode()), + sessionServerConfig.getSchedulerHeartbeatExpBackOffBound(), () -> sessionNodeManager.renewNode()), sessionServerConfig.getSchedulerHeartbeatFirstDelay(), TimeUnit.SECONDS); - scheduler.schedule( - new TimedSupervisorTask("GetSessionNode", scheduler, getSessionNodeExecutor, - sessionServerConfig.getSchedulerGetSessionNodeTimeout(), TimeUnit.SECONDS, - sessionServerConfig.getSchedulerGetSessionNodeExpBackOffBound(), - () -> { - sessionNodeManager.getAllDataCenterNodes(); - dataNodeManager.getAllDataCenterNodes(); - metaNodeManager.getAllDataCenterNodes(); - }), - sessionServerConfig.getSchedulerGetSessionNodeFirstDelay(), TimeUnit.SECONDS); - - scheduler.schedule( - new TimedSupervisorTask("ConnectMetaServer", scheduler, connectMetaExecutor, + scheduler.schedule(new TimedSupervisorTask("GetSessionNode", scheduler, getSessionNodeExecutor, + sessionServerConfig.getSchedulerGetSessionNodeTimeout(), TimeUnit.SECONDS, + sessionServerConfig.getSchedulerGetSessionNodeExpBackOffBound(), () -> { + sessionNodeManager.getAllDataCenterNodes(); + dataNodeManager.getAllDataCenterNodes(); + metaNodeManager.getAllDataCenterNodes(); + }), sessionServerConfig.getSchedulerGetSessionNodeFirstDelay(), TimeUnit.SECONDS); + + scheduler.schedule(new TimedSupervisorTask("ConnectMetaServer", scheduler, connectMetaExecutor, sessionServerConfig.getSchedulerConnectMetaTimeout(), TimeUnit.SECONDS, - sessionServerConfig.getSchedulerConnectMetaExpBackOffBound(), - () -> metaNodeExchanger.connectServer()), + sessionServerConfig.getSchedulerConnectMetaExpBackOffBound(), () -> metaNodeExchanger.connectServer()), sessionServerConfig.getSchedulerConnectMetaFirstDelay(), TimeUnit.SECONDS); - scheduler.schedule( - new TimedSupervisorTask("ConnectDataServer", scheduler, connectDataExecutor, + scheduler.schedule(new TimedSupervisorTask("ConnectDataServer", scheduler, connectDataExecutor, sessionServerConfig.getSchedulerConnectDataTimeout(), TimeUnit.SECONDS, - sessionServerConfig.getSchedulerConnectDataExpBackOffBound(), - () -> dataNodeExchanger.connectServer()), + sessionServerConfig.getSchedulerConnectDataExpBackOffBound(), () -> dataNodeExchanger.connectServer()), sessionServerConfig.getSchedulerConnectDataFirstDelay(), TimeUnit.SECONDS); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/SessionThreadPoolExecutor.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/SessionThreadPoolExecutor.java index 18652a22c..5887c2bc7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/SessionThreadPoolExecutor.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/SessionThreadPoolExecutor.java @@ -16,16 +16,17 @@ */ package com.alipay.sofa.registry.server.session.scheduler; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.metrics.TaskMetrics; - import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.metrics.TaskMetrics; + /** * * @author shangyu.wh @@ -39,34 +40,32 @@ public class SessionThreadPoolExecutor extends ThreadPoolExecutor { public SessionThreadPoolExecutor(String executorName, int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, - BlockingQueue workQueue, ThreadFactory threadFactory) { + BlockingQueue workQueue, + ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); this.executorName = executorName; registerTaskMetrics(); + this.setRejectedExecutionHandler(handler); } - private void registerTaskMetrics() { + public SessionThreadPoolExecutor(String executorName, int corePoolSize, int maximumPoolSize, long keepAliveTime, + TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) { + this(executorName, corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, + (r, executor) -> { + String msg = String.format("Task(%s) %s rejected from %s, throw RejectedExecutionException.", + r.getClass(), r, executor); + LOGGER.error(msg); + throw new RejectedExecutionException(msg); + }); + } + private void registerTaskMetrics() { TaskMetrics.getInstance().registerThreadExecutor(executorName, this); } @Override public String toString() { - return (new StringBuilder(executorName).append(" ").append(super.toString())).toString(); } - @Override - public void execute(Runnable command) { - - try { - super.execute(command); - } catch (Exception e) { - if (e instanceof RejectedExecutionException) { - LOGGER.error("Processor session executor {} Rejected Execution!command {}", this, - command.getClass(), e); - } - throw e; - } - } } \ No newline at end of file From 840d8c651e20f1f4e514cd7c43502c8b6a5150f6 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 31 Oct 2019 10:44:27 +0800 Subject: [PATCH 136/161] remove useless code --- .../task/ReceivedDataMultiPushTask.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java index 38d9076e9..2752e70f7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/ReceivedDataMultiPushTask.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + import com.alipay.sofa.registry.common.model.PushDataRetryRequest; import com.alipay.sofa.registry.common.model.store.DataInfo; import com.alipay.sofa.registry.common.model.store.Subscriber; @@ -33,25 +40,17 @@ import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.ReceivedDataMultiPushTaskStrategy; -import com.alipay.sofa.registry.task.Task; import com.alipay.sofa.registry.task.TaskClosure; import com.alipay.sofa.registry.task.batcher.TaskProcessor.ProcessingResult; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; - /** * * @author shangyu.wh * @version $Id: SubscriberRegisterPushTask.java, v 0.1 2017-12-11 20:57 shangyu.wh Exp $ */ -public class ReceivedDataMultiPushTask extends AbstractSessionTask implements TaskClosure { +public class ReceivedDataMultiPushTask extends AbstractSessionTask { private static final Logger LOGGER = LoggerFactory.getLogger("SESSION-PUSH", "[Receive]"); @@ -344,10 +343,4 @@ public boolean checkRetryTimes() { return checkRetryTimes(sessionServerConfig.getReceivedDataMultiPushTaskRetryTimes()); } - @Override - public void run(ProcessingResult processingResult, Task task) { - if (taskClosure != null) { - taskClosure.run(processingResult, task); - } - } } \ No newline at end of file From 81e76fe61f573f62a438ff0451ef7e847120068a Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 6 Nov 2019 18:42:54 +0800 Subject: [PATCH 137/161] fix call back --- pom.xml | 2 +- .../registry/remoting/bolt/BoltClient.java | 2 +- .../registry/remoting/bolt/BoltServer.java | 2 +- .../handler/NotifyFetchDatumHandler.java | 1 - .../server/meta/remoting/RaftExchanger.java | 26 +++-- .../registry/test/sync/SessionNotifyTest.java | 97 ++++++++++--------- 6 files changed, 70 insertions(+), 60 deletions(-) diff --git a/pom.xml b/pom.xml index 2fa270a20..d0964942d 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ 1.5.2 1.10.19 1.6.6 - 1.2.5 + 1.2.7.beta1 4.0.2 2.4 [9.4.17.v20190418,9.4.19.v20190610] diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index ad09d9b31..006a326a7 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -307,7 +307,7 @@ public void onException(Throwable e) { @Override public Executor getExecutor() { - return null; + return callbackHandler.getExecutor(); } }, timeoutMillis); return; diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java index 1118a6e1c..2e9bc42dd 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java @@ -321,7 +321,7 @@ public void onException(Throwable e) { @Override public Executor getExecutor() { - return null; + return callbackHandler.getExecutor(); } }, timeoutMillis); return; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java index 996c1e328..068b57e35 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/handler/NotifyFetchDatumHandler.java @@ -158,7 +158,6 @@ private void fetchDatum(String targetIp, String dataCenter, String dataInfoId) { if (response.isSuccess()) { Datum datum = response.getData().get(dataCenter); - if (datum != null) { // wrap by WordCache datum = Datum.internDatum(datum); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java index f64c15ced..3528e8490 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java @@ -16,15 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.remoting; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.jraft.CliService; import com.alipay.sofa.jraft.Status; import com.alipay.sofa.jraft.conf.Configuration; @@ -47,6 +38,14 @@ import com.alipay.sofa.registry.server.meta.bootstrap.NodeConfig; import com.alipay.sofa.registry.server.meta.executor.ExecutorManager; import com.alipay.sofa.registry.server.meta.registry.Registry; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; /** * @@ -384,4 +383,13 @@ public AtomicBoolean getServerStart() { public AtomicBoolean getClsStart() { return clsStart; } + + /** + * Getter method for property raftServer. + * + * @return property value of raftServer + */ + public RaftServer getRaftServer() { + return raftServer; + } } \ No newline at end of file diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java index 9c1e657fb..823768af1 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java @@ -78,32 +78,35 @@ */ @RunWith(SpringRunner.class) public class SessionNotifyTest extends BaseIntegrationTest { - private static final int TEST_SYNC_PORT = 9677; + private static final int TEST_SYNC_PORT = 9677; private static DataServerConnectionFactory dataServerConnectionFactory; private static Server dataSyncServer; private static String remoteIP; private static BoltChannel boltChannel; - private static Map boltChannelMap = new ConcurrentHashMap<>(); + private static Map boltChannelMap = new ConcurrentHashMap<>(); - private static Map boltChannelMapInt = new ConcurrentHashMap<>(); + private static Map boltChannelMapInt = new ConcurrentHashMap<>(); - private static final int connectNum = 20; + private static final int connectNum = 20; - private static final int threadNum = 20; + private static final int threadNum = 20; - private static final int idNum = 100; + private static final int idNum = 100; - private static SessionCacheService sessionCacheService; + private static SessionCacheService sessionCacheService; - private static SessionInterests sessionInterests; + private static SessionInterests sessionInterests; - private static Datum datum; + private static Datum datum; - private static BoltClient boltClientFetch = new BoltClient(); + private static BoltClient boltClientFetch = new BoltClient(); - private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue<>(), new NamedThreadFactory("TestSessionNotifyFetch")); + private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), + new NamedThreadFactory( + "TestSessionNotifyFetch")); @BeforeClass public static void beforeClass() throws Exception { @@ -112,16 +115,18 @@ public static void beforeClass() throws Exception { dataServerConnectionFactory = dataApplicationContext.getBean("dataServerConnectionFactory", DataServerConnectionFactory.class); - sessionCacheService = sessionApplicationContext.getBean("sessionCacheService",SessionCacheService.class); + sessionCacheService = sessionApplicationContext.getBean("sessionCacheService", + SessionCacheService.class); - sessionInterests = sessionApplicationContext.getBean("sessionInterests",SessionInterests.class); + sessionInterests = sessionApplicationContext.getBean("sessionInterests", + SessionInterests.class); Map publisherMap = new HashMap<>(); - for (int i=0;i<10;i++) { + for (int i = 0; i < 10; i++) { Publisher publisher = new Publisher(); - String connectId = "123.123.123."+i; + String connectId = "123.123.123." + i; publisher.setAppName("APP"); //ZONE MUST BE CURRENT SESSION ZONE publisher.setCell("CELL"); @@ -142,7 +147,7 @@ public static void beforeClass() throws Exception { publisher.setClientVersion(ClientVersion.StoreData); DataInfo dataInfo = new DataInfo(DEFAULT_INSTANCE_ID, MockSyncDataHandler.dataId, - DEFAULT_GROUP); + DEFAULT_GROUP); publisher.setDataInfoId(dataInfo.getDataInfoId()); ServerDataBox serverDataBox = new ServerDataBox(""); @@ -150,7 +155,7 @@ public static void beforeClass() throws Exception { list.add(serverDataBox); publisher.setDataList(list); - publisherMap.put(publisher.getRegisterId(),publisher); + publisherMap.put(publisher.getRegisterId(), publisher); } datum = new Datum(); @@ -162,44 +167,41 @@ public static void beforeClass() throws Exception { datum.setPubMap(publisherMap); datum.setDataCenter(ValueConstants.DEFAULT_DATA_CENTER); - // open sync port and connect it dataSyncServer = boltExchange.open(new URL(NetUtil.getLocalAddress().getHostAddress(), - TEST_SYNC_PORT), new ChannelHandler[] { new MockGetDataHandler(),dataApplicationContext.getBean( - DataSyncServerConnectionHandler.class) }); + TEST_SYNC_PORT), new ChannelHandler[] { new MockGetDataHandler(), + dataApplicationContext.getBean(DataSyncServerConnectionHandler.class) }); for (int i = 0; i < connectNum; i++) { URL urltemp = new URL(LOCAL_ADDRESS, TEST_SYNC_PORT); - Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE+i, urltemp,new ChannelHandler[]{new MockDataChangeRequestHandler()}); - - - BoltChannel boltChannel = (BoltChannel)client.getChannel(urltemp); + Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE + i, urltemp, + new ChannelHandler[] { new MockDataChangeRequestHandler() }); + BoltChannel boltChannel = (BoltChannel) client.getChannel(urltemp); - String key = boltChannel.getConnection().getLocalIP()+":"+boltChannel.getConnection().getLocalPort(); - boltChannelMap.put(key,boltChannel); + String key = boltChannel.getConnection().getLocalIP() + ":" + + boltChannel.getConnection().getLocalPort(); + boltChannelMap.put(key, boltChannel); System.out.println("testsyncserver remote connect remote:" - + boltChannel.getConnection().getRemoteAddress() + " local:" - + key); + + boltChannel.getConnection().getRemoteAddress() + " local:" + key); } for (int i = 0; i < connectNum; i++) { URL urltemp = new URL(LOCAL_ADDRESS, TEST_SYNC_PORT); - Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE+i+10, urltemp,new ChannelHandler[]{new MockDataChangeRequestHandler()}); + Client client = boltExchange.connect(Exchange.DATA_SERVER_TYPE + i + 10, urltemp, + new ChannelHandler[] { new MockDataChangeRequestHandler() }); + BoltChannel boltChannel = (BoltChannel) client.getChannel(urltemp); - BoltChannel boltChannel = (BoltChannel)client.getChannel(urltemp); - - - String key = boltChannel.getConnection().getLocalIP()+":"+boltChannel.getConnection().getLocalPort(); - boltChannelMapInt.put(i,boltChannel); + String key = boltChannel.getConnection().getLocalIP() + ":" + + boltChannel.getConnection().getLocalPort(); + boltChannelMapInt.put(i, boltChannel); System.out.println("testsyncserver remote connect remote:" - + boltChannel.getConnection().getRemoteAddress() + " local:" - + key); + + boltChannel.getConnection().getRemoteAddress() + " local:" + key); } Thread.sleep(500); @@ -242,8 +244,8 @@ public void doTest() throws Exception { } - - public static class MockDataChangeRequestHandler extends AbstractServerHandler{ + public static class MockDataChangeRequestHandler extends + AbstractServerHandler { @Override public void checkParam(DataChangeRequest request) throws RuntimeException { @@ -327,7 +329,7 @@ public Class interest() { } } - private static class MockGetDataHandler extends AbstractServerHandler{ + private static class MockGetDataHandler extends AbstractServerHandler { public void checkParam(GetDataRequest request) throws RuntimeException { ParaCheckUtil.checkNotBlank(request.getDataInfoId(), "GetDataRequest.dataInfoId"); } @@ -335,7 +337,7 @@ public void checkParam(GetDataRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, GetDataRequest request) { Map map = new HashMap<>(); - map.put(DEFAULT_DATA_CENTER,datum); + map.put(DEFAULT_DATA_CENTER, datum); return new GenericResponse>().fillSucceed(map); } @@ -376,10 +378,11 @@ public NotifyCallback(Connection connection, DataChangeRequest request) { public void onCallback(Channel channel, Object message) { CommonResponse result = (CommonResponse) message; if (result != null && !result.isSuccess()) { - System.out.println(String - .format( - "response not success when notify sessionServer(%s), retryTimes=%s, request=%s, response=%s", - connection.getRemoteAddress(), retryTimes, request, result)); + System.out + .println(String + .format( + "response not success when notify sessionServer(%s), retryTimes=%s, request=%s, response=%s", + connection.getRemoteAddress(), retryTimes, request, result)); //onFailed(this); } } @@ -387,8 +390,8 @@ public void onCallback(Channel channel, Object message) { @Override public void onException(Channel channel, Throwable e) { System.err.println(String.format( - "exception when notify sessionServer(%s), retryTimes=%s, request=%s,error=%s", - connection.getRemoteAddress(), retryTimes, request,e)); + "exception when notify sessionServer(%s), retryTimes=%s, request=%s,error=%s", + connection.getRemoteAddress(), retryTimes, request, e)); e.printStackTrace(); //onFailed(this); } From 79f916718c3a949bd1845456416d6df2cefa8bfa Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Mon, 11 Nov 2019 19:51:40 +0800 Subject: [PATCH 138/161] fix meta methodhandle cache --- .../meta/bootstrap/MetaServerConfig.java | 2 + .../meta/bootstrap/MetaServerConfigBean.java | 25 +++++++++-- .../server/meta/remoting/RaftExchanger.java | 3 ++ .../server/meta/resource/HealthResource.java | 19 ++++---- .../registry/jraft/bootstrap/RaftServer.java | 37 ++++++++++++++++ .../jraft/bootstrap/RaftServerConfig.java | 20 +++++++++ .../jraft/handler/RaftServerHandler.java | 1 + .../registry/jraft/processor/Processor.java | 44 +++++++++++++++---- 8 files changed, 130 insertions(+), 21 deletions(-) diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfig.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfig.java index d4b09b38b..cc7694cf4 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfig.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfig.java @@ -80,6 +80,8 @@ public interface MetaServerConfig { boolean isEnableMetrics(); + int getRockDBCacheSize(); + /** * decision mode enum */ diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java index 68864e817..655227a2f 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/bootstrap/MetaServerConfigBean.java @@ -16,13 +16,12 @@ */ package com.alipay.sofa.registry.server.meta.bootstrap; -import java.io.File; - +import com.alipay.sofa.registry.common.model.constants.ValueConstants; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.boot.context.properties.ConfigurationProperties; -import com.alipay.sofa.registry.common.model.constants.ValueConstants; +import java.io.File; /** * @@ -94,6 +93,8 @@ public class MetaServerConfigBean implements MetaServerConfig { + File.separator + "raftData"; + private int rockDBCacheSize = 64; //64M + @Override public int getSessionServerPort() { return sessionServerPort; @@ -603,6 +604,24 @@ public void setEnableMetrics(boolean enableMetrics) { this.enableMetrics = enableMetrics; } + /** + * Getter method for property RockDBCacheSize. + * + * @return property value of RockDBCacheSize + */ + public int getRockDBCacheSize() { + return rockDBCacheSize; + } + + /** + * Setter method for property RockDBCacheSize. + * + * @param rockDBCacheSize value to be assigned to property RockDBCacheSize + */ + public void setRockDBCacheSize(int rockDBCacheSize) { + this.rockDBCacheSize = rockDBCacheSize; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java index 3528e8490..36103a75a 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/RaftExchanger.java @@ -140,6 +140,9 @@ public void stopProcess(PeerId leader) { RaftServerConfig raftServerConfig = new RaftServerConfig(); raftServerConfig.setMetricsLogger(METRICS_LOGGER); raftServerConfig.setEnableMetrics(metaServerConfig.isEnableMetrics()); + if (metaServerConfig.getRockDBCacheSize() > 0) { + raftServerConfig.setRockDBCacheSize(metaServerConfig.getRockDBCacheSize()); + } raftServer.start(raftServerConfig); } diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java index e284a05d9..616445b64 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/resource/HealthResource.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.meta.resource; +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; +import com.alipay.sofa.registry.metrics.ReporterUtils; +import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerBootstrap; +import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; +import org.springframework.beans.factory.annotation.Autowired; + import javax.annotation.PostConstruct; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -25,16 +34,6 @@ import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; -import org.springframework.beans.factory.annotation.Autowired; - -import com.alipay.sofa.registry.common.model.CommonResponse; -import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; -import com.alipay.sofa.registry.metrics.ReporterUtils; -import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerBootstrap; -import com.alipay.sofa.registry.server.meta.remoting.RaftExchanger; -import com.codahale.metrics.Gauge; -import com.codahale.metrics.MetricRegistry; - /** * * @author shangyu.wh diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java index 2aad27198..2c40d7fb9 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java @@ -26,6 +26,8 @@ import com.alipay.sofa.jraft.option.NodeOptions; import com.alipay.sofa.jraft.rpc.RaftRpcServerFactory; import com.alipay.sofa.jraft.rpc.impl.AbstractBoltClientService; +import com.alipay.sofa.jraft.storage.impl.RocksDBLogStorage; +import com.alipay.sofa.jraft.util.StorageOptionsFactory; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.jraft.command.NotifyLeaderChange; import com.alipay.sofa.registry.jraft.handler.NotifyLeaderChangeHandler; @@ -42,6 +44,11 @@ import com.alipay.sofa.registry.remoting.bolt.BoltServer; import com.alipay.sofa.registry.remoting.bolt.SyncUserProcessorAdapter; import com.alipay.sofa.registry.util.FileUtils; +import org.rocksdb.BlockBasedTableConfig; +import org.rocksdb.BloomFilter; +import org.rocksdb.IndexType; +import org.rocksdb.RocksDB; +import org.rocksdb.util.SizeUnit; import java.io.File; import java.io.IOException; @@ -56,6 +63,10 @@ */ public class RaftServer { + static { + RocksDB.loadLibrary(); + } + private static final Logger LOGGER = LoggerFactory.getLogger(RaftServer.class); private RaftGroupService raftGroupService; @@ -170,6 +181,24 @@ private NodeOptions initNodeOptions(RaftServerConfig raftServerConfig) { nodeOptions.setEnableMetrics(raftServerConfig.isEnableMetrics()); } + // See https://github.com/sofastack/sofa-jraft/pull/156 + final BlockBasedTableConfig conf = new BlockBasedTableConfig() // + // Begin to use partitioned index filters + // https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters#how-to-use-it + .setIndexType(IndexType.kTwoLevelIndexSearch) // + .setFilter(new BloomFilter(16, false)) // + .setPartitionFilters(true) // + .setMetadataBlockSize(8 * SizeUnit.KB) // + .setCacheIndexAndFilterBlocks(false) // + .setCacheIndexAndFilterBlocksWithHighPriority(true) // + .setPinL0FilterAndIndexBlocksInCache(true) // + // End of partitioned index filters settings. + .setBlockSize(4 * SizeUnit.KB)// + .setBlockCacheSize(raftServerConfig.getRockDBCacheSize() * SizeUnit.MB) // + .setCacheNumShardBits(8); + + StorageOptionsFactory.registerRocksDBTableFormatConfig(RocksDBLogStorage.class, conf); + return nodeOptions; } @@ -255,4 +284,12 @@ public void setFollowerProcessListener(FollowerProcessListener followerProcessLi this.followerProcessListener = followerProcessListener; } + /** + * Getter method for property serverHandlers. + * + * @return property value of serverHandlers + */ + public List getServerHandlers() { + return serverHandlers; + } } \ No newline at end of file diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServerConfig.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServerConfig.java index 9e68e1e66..f739bc81b 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServerConfig.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServerConfig.java @@ -50,6 +50,8 @@ public class RaftServerConfig { */ private int snapshotIntervalSecs = 3600; + private int RockDBCacheSize = 64; //64M + private Logger metricsLogger; /** @@ -141,4 +143,22 @@ public Logger getMetricsLogger() { public void setMetricsLogger(Logger metricsLogger) { this.metricsLogger = metricsLogger; } + + /** + * Getter method for property RockDBCacheSize. + * + * @return property value of RockDBCacheSize + */ + public int getRockDBCacheSize() { + return RockDBCacheSize; + } + + /** + * Setter method for property RockDBCacheSize. + * + * @param RockDBCacheSize value to be assigned to property RockDBCacheSize + */ + public void setRockDBCacheSize(int rockDBCacheSize) { + RockDBCacheSize = rockDBCacheSize; + } } \ No newline at end of file diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/handler/RaftServerHandler.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/handler/RaftServerHandler.java index 12bbba9a6..e4524acc2 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/handler/RaftServerHandler.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/handler/RaftServerHandler.java @@ -159,4 +159,5 @@ public Object reply(Channel channel, Object message) { public InvokeType getInvokeType() { return InvokeType.ASYNC; } + } \ No newline at end of file diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java index a395a365d..fc584c9a8 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java @@ -36,12 +36,16 @@ */ public class Processor { - private static final Logger LOG = LoggerFactory - .getLogger(Processor.class); + private static final Logger LOG = LoggerFactory + .getLogger(Processor.class); - private Map> workerMethods = new HashMap<>(); + private Map> workerMethods = new HashMap<>(); - private Map workers = new HashMap<>(); + private Map workers = new HashMap<>(); + + private Map methodHandleMap = new HashMap<>(); + + private final static String SERVICE_METHOD_SPLIT = "#@#"; private static volatile Processor instance; @@ -97,15 +101,21 @@ public ProcessResponse process(ProcessRequest request) { for (int i = 0; i < sig.length; i++) { methodKeyBuffer.append(sig[i]); } - Method appServiceMethod = workerMethods.get(serviceId).get(methodKeyBuffer.toString()); + String methodKey = methodKeyBuffer.toString(); + Method appServiceMethod = workerMethods.get(serviceId).get(methodKey); if (appServiceMethod == null) { LOG.error("Can not find method {} from processor by serviceId {}", methodName, serviceId); throw new NoSuchMethodException("Can not find method from processor!"); } - Object[] methodArg = request.getMethodArgs(); - MethodHandle methodHandle = MethodHandles.lookup().unreflect(appServiceMethod); + String methodHandleKey = getMethodHandleKey(serviceId, methodKey); + MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); + if (methodHandle == null) { + methodHandle = methodHandleMap.put(methodHandleKey, MethodHandles.lookup() + .unreflect(appServiceMethod)); + } + Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); if (ret != null) { return ProcessResponse.ok(ret).build(); @@ -133,7 +143,21 @@ public ProcessResponse process(Method method, ProcessRequest request) { try { Object[] methodArg = request.getMethodArgs(); - MethodHandle methodHandle = MethodHandles.lookup().unreflect(method); + + StringBuilder methodKeyBuffer = new StringBuilder(); + methodKeyBuffer.append(methodName); + String[] sig = request.getMethodArgSigs(); + for (int i = 0; i < sig.length; i++) { + methodKeyBuffer.append(sig[i]); + } + String methodKey = methodKeyBuffer.toString(); + String methodHandleKey = getMethodHandleKey(serviceId, methodKey); + MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); + if (methodHandle == null) { + methodHandle = methodHandleMap.put(methodHandleKey, MethodHandles.lookup() + .unreflect(method)); + } + Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); if (ret != null) { return ProcessResponse.ok(ret).build(); @@ -185,4 +209,8 @@ public boolean isLeaderReadMethod(Method method) { return false; } + public String getMethodHandleKey(String serviceId, String methodKey) { + return serviceId + SERVICE_METHOD_SPLIT + methodKey; + } + } From 5b1f7848f48a02796d1a78029b8229f4622fdc90 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 21 Nov 2019 14:06:05 +0800 Subject: [PATCH 139/161] fix push confirm success --- .../scheduler/task/PushTaskClosure.java | 13 +++++----- .../registry/jraft/bootstrap/RaftServer.java | 26 +++++++++---------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java index a2683dcda..9d9910a27 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/PushTaskClosure.java @@ -66,6 +66,12 @@ public void run(ProcessingResult processingResult, Task task) { if (result == null) { if (processingResult == ProcessingResult.Success) { tasks.remove(task.getTaskId()); + if (tasks.isEmpty()) { + LOGGER.info("Push all tasks success,dataInfoId={}", dataInfoId); + if (taskClosure != null) { + taskClosure.run(ProcessingResult.Success, null); + } + } } } } @@ -81,12 +87,7 @@ public void start() { pushTaskCheckAsyncHashedWheelTimer.newTimeout(timeout -> { - if (tasks.isEmpty()) { - LOGGER.info("Push all tasks success,dataInfoId={}",dataInfoId); - if (taskClosure != null) { - taskClosure.run(ProcessingResult.Success, null); - } - } else { + if (!tasks.isEmpty()) { LOGGER.warn("Push tasks found error tasks {},dataInfoId={}!", tasks.size(),dataInfoId); if (taskClosure != null) { taskClosure.run(ProcessingResult.PermanentError, null); diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java index 2c40d7fb9..66fc6a40f 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/bootstrap/RaftServer.java @@ -183,19 +183,19 @@ private NodeOptions initNodeOptions(RaftServerConfig raftServerConfig) { // See https://github.com/sofastack/sofa-jraft/pull/156 final BlockBasedTableConfig conf = new BlockBasedTableConfig() // - // Begin to use partitioned index filters - // https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters#how-to-use-it - .setIndexType(IndexType.kTwoLevelIndexSearch) // - .setFilter(new BloomFilter(16, false)) // - .setPartitionFilters(true) // - .setMetadataBlockSize(8 * SizeUnit.KB) // - .setCacheIndexAndFilterBlocks(false) // - .setCacheIndexAndFilterBlocksWithHighPriority(true) // - .setPinL0FilterAndIndexBlocksInCache(true) // - // End of partitioned index filters settings. - .setBlockSize(4 * SizeUnit.KB)// - .setBlockCacheSize(raftServerConfig.getRockDBCacheSize() * SizeUnit.MB) // - .setCacheNumShardBits(8); + // Begin to use partitioned index filters + // https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters#how-to-use-it + .setIndexType(IndexType.kTwoLevelIndexSearch) // + .setFilter(new BloomFilter(16, false)) // + .setPartitionFilters(true) // + .setMetadataBlockSize(8 * SizeUnit.KB) // + .setCacheIndexAndFilterBlocks(false) // + .setCacheIndexAndFilterBlocksWithHighPriority(true) // + .setPinL0FilterAndIndexBlocksInCache(true) // + // End of partitioned index filters settings. + .setBlockSize(4 * SizeUnit.KB)// + .setBlockCacheSize(raftServerConfig.getRockDBCacheSize() * SizeUnit.MB) // + .setCacheNumShardBits(8); StorageOptionsFactory.registerRocksDBTableFormatConfig(RocksDBLogStorage.class, conf); From 081971441631c0349bbfefe82ecde4b7d26aaf4c Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 21 Nov 2019 18:10:01 +0800 Subject: [PATCH 140/161] Change the communication between session and data to multi connection --- .../sofa/registry/remoting/Channel.java | 5 +- .../alipay/sofa/registry/remoting/Client.java | 49 ++- .../sofa/registry/remoting/Endpoint.java | 44 +-- .../alipay/sofa/registry/remoting/Server.java | 28 ++ .../registry/remoting/exchange/Exchange.java | 12 + .../registry/remoting/bolt/BoltChannel.java | 17 +- .../registry/remoting/bolt/BoltClient.java | 359 +++++++----------- .../registry/remoting/bolt/BoltServer.java | 52 +-- .../remoting/bolt/exchange/BoltExchange.java | 29 +- .../remoting/bolt/BoltServerTest.java | 14 +- .../registry/remoting/bolt/MockChannel.java | 10 +- .../remoting/jersey/JerseyChannel.java | 14 +- .../remoting/jersey/JerseyClient.java | 90 ++--- .../remoting/jersey/JerseyJettyServer.java | 16 +- .../jersey/exchange/JerseyExchange.java | 18 +- .../remoting/jersey/JerseyExchangeTest.java | 37 +- .../change/notify/SessionServerNotifier.java | 20 +- .../change/notify/TempPublisherNotifier.java | 15 +- .../data/remoting/DataNodeExchanger.java | 5 +- .../data/remoting/MetaNodeExchanger.java | 9 +- .../SessionServerConnectionFactory.java | 163 ++++---- .../disconnect/DisconnectEventHandler.java | 2 +- .../handler/DataServerConnectionHandler.java | 5 +- .../handler/SessionServerRegisterHandler.java | 2 +- .../data/resource/DataDigestResource.java | 2 +- .../meta/remoting/MetaClientExchanger.java | 28 +- .../bootstrap/SessionServerBootstrap.java | 9 +- .../bootstrap/SessionServerConfig.java | 3 + .../bootstrap/SessionServerConfigBean.java | 29 +- .../SessionRegisterDataTaskListener.java | 12 +- .../session/node/service/DataNodeService.java | 10 - .../node/service/DataNodeServiceImpl.java | 43 +-- .../session/remoting/DataNodeExchanger.java | 14 +- .../session/remoting/MetaNodeExchanger.java | 23 +- .../handler/DataNodeConnectionHandler.java | 10 +- .../scheduler/task/AbstractSessionTask.java | 11 +- .../task/SessionRegisterDataTask.java | 42 +- 37 files changed, 573 insertions(+), 678 deletions(-) diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Channel.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Channel.java index 4f51ffed2..162c59ca2 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Channel.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Channel.java @@ -16,9 +16,10 @@ */ package com.alipay.sofa.registry.remoting; -import javax.ws.rs.client.WebTarget; import java.net.InetSocketAddress; +import javax.ws.rs.client.WebTarget; + /** * * @author shangyu.wh @@ -68,4 +69,6 @@ public interface Channel { * @return */ WebTarget getWebTarget(); + + void close(); } \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java index f19aba5a6..aa08d9c3e 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java @@ -18,9 +18,6 @@ import com.alipay.sofa.registry.common.model.store.URL; -import java.net.InetSocketAddress; -import java.util.Collection; - /** * * @author shangyu.wh @@ -28,21 +25,6 @@ */ public interface Client extends Endpoint { - /** - * get channels. - * - * @return channels - */ - Collection getChannels(); - - /** - * get channel. - * - * @param remoteAddress - * @return channel - */ - Channel getChannel(InetSocketAddress remoteAddress); - /** * get channel by url. * @@ -57,4 +39,35 @@ public interface Client extends Endpoint { * @return */ Channel connect(URL url); + + /** + * Sync send + * + * @param url the url + * @param message the message + * @param timeoutMillis the timeout millis + * @return object + */ + Object sendSync(final URL url, final Object message, final int timeoutMillis); + + /** + * Sync send + * + * @param channel the channel + * @param message the message + * @param timeoutMillis the timeout millis + * @return object + */ + Object sendSync(final Channel channel, final Object message, final int timeoutMillis); + + /** + * send with callback handler + * + * @param url the url + * @param message the message + * @param callbackHandler the callback handler + * @param timeoutMillis the timeout millis + */ + void sendCallback(final URL url, final Object message, CallbackHandler callbackHandler, + final int timeoutMillis); } \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Endpoint.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Endpoint.java index 10cff4f22..d1b23ab5f 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Endpoint.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Endpoint.java @@ -17,22 +17,16 @@ package com.alipay.sofa.registry.remoting; import java.net.InetSocketAddress; -import java.util.List; /** * The interface Endpoint. + * * @author shangyu.wh + * @author kezhu.wukz * @version $Id : Endpoint.java, v 0.1 2017-11-20 20:03 shangyu.wh Exp $ */ public interface Endpoint { - /** - * get channel handlers. - * - * @return channel handlers - */ - List getChannelHandlers(); - /** * get local address. * @@ -45,13 +39,6 @@ public interface Endpoint { */ void close(); - /** - * Close. - * - * @param channel the channel - */ - void close(final Channel channel); - /** * is closed. * @@ -59,31 +46,4 @@ public interface Endpoint { */ boolean isClosed(); - /** - * oneway send - * @param channel the channel - * @param message the message - */ - void sendOneway(final Channel channel, final Object message); - - /** - * Sync send - * - * @param channel the channel - * @param message the message - * @param timeoutMillis the timeout millis - * @return object - */ - Object sendSync(final Channel channel, final Object message, final int timeoutMillis); - - /** - * send with callback handler - * - * @param channel the channel - * @param message the message - * @param callbackHandler the callback handler - * @param timeoutMillis the timeout millis - */ - void sendCallback(final Channel channel, final Object message, CallbackHandler callbackHandler, - final int timeoutMillis); } \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java index 900bedbcd..5b3de39d7 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Server.java @@ -58,5 +58,33 @@ public interface Server extends Endpoint { */ Channel getChannel(URL url); + /** + * close the channel. + * + * @param channel + */ + void close(Channel channel); + int getChannelCount(); + + /** + * Sync send + * + * @param channel the channel + * @param message the message + * @param timeoutMillis the timeout millis + * @return object + */ + Object sendSync(final Channel channel, final Object message, final int timeoutMillis); + + /** + * send with callback handler + * + * @param channel the channel + * @param message the message + * @param callbackHandler the callback handler + * @param timeoutMillis the timeout millis + */ + void sendCallback(final Channel channel, final Object message, CallbackHandler callbackHandler, + final int timeoutMillis); } \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/Exchange.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/Exchange.java index 961167107..f0f286413 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/Exchange.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/exchange/Exchange.java @@ -41,6 +41,18 @@ public interface Exchange { */ Client connect(String serverType, URL serverUrl, T... channelHandlers); + /** + * connect same type server,one server ip one connection + * such as different server on data server,serverOne and serverTwo,different type server must match different channelHandlers, + * so we must connect by serverType,and get Client instance by serverType + * @param serverType + * @param connNum connection number per serverUrl + * @param serverUrl + * @param channelHandlers + * @return + */ + Client connect(String serverType, int connNum, URL serverUrl, T... channelHandlers); + /** * bind server by server port in url parameter,one port must by same server type * @param url diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltChannel.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltChannel.java index 0e857268d..9a4ddd334 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltChannel.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltChannel.java @@ -16,19 +16,21 @@ */ package com.alipay.sofa.registry.remoting.bolt; +import java.net.InetSocketAddress; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.ws.rs.client.WebTarget; + import com.alipay.remoting.AsyncContext; import com.alipay.remoting.BizContext; import com.alipay.remoting.Connection; import com.alipay.sofa.registry.remoting.Channel; -import javax.ws.rs.client.WebTarget; -import java.net.InetSocketAddress; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * * @author shangyu.wh + * @author kezhu.wukz * @version $Id: BoltChannel.java, v 0.1 2017-11-24 16:46 shangyu.wh Exp $ */ public class BoltChannel implements Channel { @@ -84,6 +86,11 @@ public WebTarget getWebTarget() { return null; } + @Override + public void close() { + this.connection.close(); + } + /** * Getter method for property connection. * diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index ad09d9b31..9104b73b2 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -16,11 +16,19 @@ */ package com.alipay.sofa.registry.remoting.bolt; +import java.net.InetSocketAddress; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventType; import com.alipay.remoting.InvokeCallback; +import com.alipay.remoting.Url; import com.alipay.remoting.exception.RemotingException; import com.alipay.remoting.rpc.RpcClient; +import com.alipay.remoting.rpc.protocol.RpcProtocol; +import com.alipay.remoting.rpc.protocol.RpcProtocolV2; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -32,16 +40,6 @@ import com.alipay.sofa.registry.remoting.ChannelHandler.InvokeType; import com.alipay.sofa.registry.remoting.Client; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; - /** * The type Bolt client. * @author shangyu.wh @@ -49,134 +47,118 @@ */ public class BoltClient implements Client { - private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); - private RpcClient boltClient; - private List channelHandlers = new ArrayList<>(); - private Map channels = new HashMap<>(); - private AtomicBoolean initHandler = new AtomicBoolean(false); + private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); + + /** + * RpcTaskScanner: remove closed connections every 10 seconds + * HealConnectionRunner: Ensure that the number of connections reaches connNum every 1 second + */ + private RpcClient rpcClient; + + private AtomicBoolean closed = new AtomicBoolean(false); + + protected final int connNum; + protected int connectTimeout = 2000; /** * Instantiates a new Bolt client. */ - public BoltClient() { - boltClient = new RpcClient(); - boltClient.init(); + public BoltClient(int connNum) { + rpcClient = new RpcClient(); + rpcClient.enableReconnectSwitch(); + rpcClient.enableConnectionMonitorSwitch(); + rpcClient.init(); + this.connNum = connNum; + } + + /** + * Setter method for property channelHandlers. + * + * @param channelHandlers value to be assigned to property channelHandlers + */ + public void initHandlers(List channelHandlers) { + ChannelHandler connectionEventHandler = null; + for (ChannelHandler channelHandler : channelHandlers) { + if (HandlerType.LISENTER.equals(channelHandler.getType())) { + connectionEventHandler = channelHandler; + break; + } + } + + rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, + new ConnectionEventAdapter(ConnectionEventType.CONNECT, connectionEventHandler, null)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, + new ConnectionEventAdapter(ConnectionEventType.CLOSE, connectionEventHandler, null)); + rpcClient + .addConnectionEventProcessor(ConnectionEventType.EXCEPTION, new ConnectionEventAdapter( + ConnectionEventType.EXCEPTION, connectionEventHandler, null)); + + for (ChannelHandler channelHandler : channelHandlers) { + if (HandlerType.PROCESSER.equals(channelHandler.getType())) { + if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { + rpcClient.registerUserProcessor(getSyncProcessor(channelHandler)); + } else { + rpcClient.registerUserProcessor(getAsyncProcessor(channelHandler)); + } + } + } + } + + protected AsyncUserProcessorAdapter getAsyncProcessor(ChannelHandler channelHandler) { + return new AsyncUserProcessorAdapter(channelHandler); + } + + protected SyncUserProcessorAdapter getSyncProcessor(ChannelHandler channelHandler) { + return new SyncUserProcessorAdapter(channelHandler); } @Override public Channel connect(URL targetUrl) { - if (targetUrl == null) { throw new IllegalArgumentException("Create connection targetUrl can not be null!"); } - InetSocketAddress address = URL.toInetSocketAddress(targetUrl); - Channel c = getChannel(address); - if (c != null && c.isConnected()) { - LOGGER.info("Target url:" + targetUrl + " has been connected!", targetUrl); - return c; - } - - initHandler(); - try { - Connection connection = boltClient - .getConnection(NetUtil.toAddressString(address), 1000); - if (connection != null) { - BoltChannel channel = new BoltChannel(); - channel.setConnection(connection); - channels.put(connection.getUrl().getOriginUrl(), channel); - return channel; - } else { - throw new RuntimeException("Bolt client connect server get none connection!"); - } + Connection connection = getBoltConnection(targetUrl); + BoltChannel channel = new BoltChannel(); + channel.setConnection(connection); + return channel; } catch (RemotingException e) { LOGGER.error("Bolt client connect server got a RemotingException! target url:" + targetUrl, e); throw new RuntimeException("Bolt client connect server got a RemotingException!", e); - } catch (InterruptedException e) { - LOGGER.error("Bolt client connect server has been Interrupted!", e); - throw new RuntimeException("Bolt client connect server has been Interrupted!", e); } } - private void initHandler() { - - if (initHandler.compareAndSet(false, true)) { - boltClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, - new ConnectionEventAdapter(ConnectionEventType.CONNECT, - getConnectionEventHandler(), null)); - boltClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, - new ConnectionEventAdapter(ConnectionEventType.CLOSE, getConnectionEventHandler(), - null)); - boltClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, - new ConnectionEventAdapter(ConnectionEventType.EXCEPTION, - getConnectionEventHandler(), null)); - - registerUserProcessorHandler(); - } - } - - private void registerUserProcessorHandler() { - if (channelHandlers != null) { - for (ChannelHandler channelHandler : channelHandlers) { - if (HandlerType.PROCESSER.equals(channelHandler.getType())) { - if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { - boltClient.registerUserProcessor(new SyncUserProcessorAdapter( - channelHandler)); - } else { - boltClient.registerUserProcessor(new AsyncUserProcessorAdapter( - channelHandler)); - } + protected Connection getBoltConnection(URL targetUrl) throws RemotingException { + Url url = getBoltUrl(targetUrl); + try { + Connection connection = rpcClient.getConnection(url, connectTimeout); + if (connection == null || !connection.isFine()) { + if (connection != null) { + connection.close(); } + throw new RemotingException("Get bolt connection failed for url: " + url); } + return connection; + } catch (InterruptedException e) { + throw new RuntimeException( + "BoltClient rpcClient.getConnection InterruptedException! target url:" + url, e); } } - @Override - public Collection getChannels() { - - Collection chs = new HashSet<>(); - for (Channel channel : this.channels.values()) { - if (channel.isConnected()) { - chs.add(channel); - } else { - channels.remove(NetUtil.toAddressString(channel.getRemoteAddress())); - } - } - return chs; - } - - @Override - public Channel getChannel(InetSocketAddress remoteAddress) { - Channel c = channels.get(NetUtil.toAddressString(remoteAddress)); - if (c == null || !c.isConnected()) { - return null; - } - return c; + protected Url getBoltUrl(URL targetUrl) { + Url url = new Url(targetUrl.getIpAddress(), targetUrl.getPort()); + url.setProtocol(RpcProtocol.PROTOCOL_CODE); + url.setVersion(RpcProtocolV2.PROTOCOL_VERSION_1); + url.setConnNum(connNum); + url.setConnWarmup(true); + return url; } @Override public Channel getChannel(URL url) { - Channel c = channels.get(url.getAddressString()); - if (c == null || !c.isConnected()) { - return null; - } - return c; - } - - @Override - public List getChannelHandlers() { - return channelHandlers; - } - - /** - * Setter method for property channelHandlers. - * - * @param channelHandlers value to be assigned to property channelHandlers - */ - public void setChannelHandlers(List channelHandlers) { - this.channelHandlers = channelHandlers; + return this.connect(url); } @Override @@ -184,100 +166,46 @@ public InetSocketAddress getLocalAddress() { return NetUtil.getLocalSocketAddress(); } - /** - * Gets connection event handler. - * - * @return the connection event handler - */ - public ChannelHandler getConnectionEventHandler() { - if (channelHandlers != null) { - for (ChannelHandler channelHandler : channelHandlers) { - if (HandlerType.LISENTER.equals(channelHandler.getType())) { - return channelHandler; - } - } - } - return null; - } - @Override public void close() { - Collection chs = getChannels(); - if (chs != null && chs.size() > 0) { - for (Channel ch : chs) { - if (ch != null) { - boltClient.closeStandaloneConnection(((BoltChannel) ch).getConnection()); - } - } - } - } - - @Override - public void close(Channel channel) { - if (channel != null) { - Connection connection = ((BoltChannel) channel).getConnection(); - if (null != connection.getUrl() && null != connection.getUrl().getOriginUrl()) { - channels.remove(connection.getUrl().getOriginUrl()); - } - boltClient.closeStandaloneConnection(connection); + if (closed.compareAndSet(false, true)) { + rpcClient.shutdown(); } } @Override public boolean isClosed() { - boolean ret = false; - Collection chs = getChannels(); - if (chs != null && chs.size() > 0) { - for (Channel ch : chs) { - if (ch != null && !ch.isConnected()) { - ret = true; - break; - } - } - } else { - //has no channels - return true; - } - return ret; + return closed.get(); } @Override - public void sendOneway(Channel channel, Object message) { - if (channel != null && channel.isConnected()) { - if (channel instanceof BoltChannel) { - BoltChannel boltChannel = (BoltChannel) channel; - try { - boltClient.oneway(boltChannel.getConnection(), message); - } catch (RemotingException e) { - LOGGER.error("Bolt Client oneway request RemotingException! target url: {}", - boltChannel.getRemoteAddress(), e); - } - } + public Object sendSync(URL url, Object message, int timeoutMillis) { + try { + return rpcClient.invokeSync(getBoltUrl(url), message, timeoutMillis); + } catch (RemotingException e) { + String msg = "Bolt Client sendSync message RemotingException! target url:" + url; + LOGGER.error(msg, e); + throw new RuntimeException(msg, e); + } catch (InterruptedException e) { + throw new RuntimeException( + "Bolt Client sendSync message InterruptedException! target url:" + url, e); } } @Override public Object sendSync(Channel channel, Object message, int timeoutMillis) { - if (channel != null && channel.isConnected()) { - if (channel instanceof BoltChannel) { - BoltChannel boltChannel = (BoltChannel) channel; - try { - return boltClient.invokeSync(boltChannel.getConnection(), message, - timeoutMillis); - } catch (RemotingException e) { - LOGGER.error("Bolt Client sendSync message RemotingException! target url:" - + boltChannel.getRemoteAddress(), e); - throw new RuntimeException("Bolt Client sendSync message RemotingException!", e); - } catch (InterruptedException e) { - LOGGER.error("Bolt Client sendSync message InterruptedException! target url:" - + boltChannel.getRemoteAddress(), e); - throw new RuntimeException( - "Bolt Client sendSync message InterruptedException!", e); - } - } else { - throw new IllegalArgumentException("Input channel instance error! instance class:" - + channel.getClass().getName()); + BoltChannel boltChannel = (BoltChannel) channel; + try { + return rpcClient.invokeSync(boltChannel.getConnection(), message, timeoutMillis); + } catch (RemotingException e) { + LOGGER.error("Bolt Client sendSync message RemotingException! target url:" + + boltChannel.getRemoteAddress(), e); + throw new RuntimeException("Bolt Client sendSync message RemotingException!", e); + } catch (InterruptedException e) { + LOGGER.error("Bolt Client sendSync message InterruptedException! target url:" + + boltChannel.getRemoteAddress(), e); + throw new RuntimeException("Bolt Client sendSync message InterruptedException!", e); } } throw new IllegalArgumentException( @@ -286,44 +214,35 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { } @Override - public void sendCallback(Channel channel, Object message, CallbackHandler callbackHandler, + public void sendCallback(URL url, Object message, CallbackHandler callbackHandler, int timeoutMillis) { - if (channel != null && channel.isConnected()) { - if (channel instanceof BoltChannel) { - BoltChannel boltChannel = (BoltChannel) channel; - try { - boltClient.invokeWithCallback(boltChannel.getConnection(), message, - new InvokeCallback() { - - @Override - public void onResponse(Object result) { - callbackHandler.onCallback(channel, result); - } + try { + Connection connection = getBoltConnection(url); + BoltChannel channel = new BoltChannel(); + channel.setConnection(connection); + rpcClient.invokeWithCallback(connection, message, new InvokeCallback() { + + @Override + public void onResponse(Object result) { + callbackHandler.onCallback(channel, result); + } - @Override - public void onException(Throwable e) { - callbackHandler.onException(channel, e); - } + @Override + public void onException(Throwable e) { + callbackHandler.onException(channel, e); + } - @Override - public Executor getExecutor() { - return null; - } - }, timeoutMillis); - return; - } catch (RemotingException e) { - LOGGER.error("Bolt Client sendSync message RemotingException! target url:" - + boltChannel.getRemoteAddress(), e); - throw new RuntimeException("Bolt Client sendSync message RemotingException!", e); + @Override + public Executor getExecutor() { + return null; } - } else { - throw new IllegalArgumentException("Input channel instance error! instance class:" - + channel.getClass().getName()); - } + }, timeoutMillis); + return; + } catch (RemotingException e) { + String msg = "Bolt Client sendSync message RemotingException! target url:" + url; + LOGGER.error(msg, e); + throw new RuntimeException(msg, e); } - throw new IllegalArgumentException( - "Input channel: " + channel - + " error! channel cannot be null,or channel must be connected!"); } } \ No newline at end of file diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java index 1118a6e1c..6cabdc1ac 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltServer.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.remoting.bolt; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; + import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventType; import com.alipay.remoting.InvokeCallback; @@ -33,16 +43,6 @@ import com.alipay.sofa.registry.remoting.ChannelHandler.InvokeType; import com.alipay.sofa.registry.remoting.Server; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; - /** * * @author shangyu.wh @@ -206,11 +206,6 @@ public Channel getChannel(URL url) { return null; } - @Override - public List getChannelHandlers() { - return channelHandlers; - } - @Override public InetSocketAddress getLocalAddress() { return new InetSocketAddress(url.getPort()); @@ -240,33 +235,6 @@ public boolean isClosed() { return !isStarted.get(); } - @Override - public void sendOneway(Channel channel, Object message) { - if (channel != null && channel.isConnected()) { - Url boltUrl = null; - try { - boltUrl = new Url(channel.getRemoteAddress().getAddress().getHostAddress(), channel - .getRemoteAddress().getPort()); - - if (LOGGER.isDebugEnabled()) { - LOGGER - .debug("Bolt Server one way message:{} , target url:{}", message, boltUrl); - } - boltServer.oneway(boltUrl, message); - } catch (RemotingException e) { - LOGGER.error( - "Bolt Server one way message RemotingException! target url:" + boltUrl, e); - throw new RuntimeException("Bolt Server one way message RemotingException!", e); - } catch (InterruptedException e) { - LOGGER.error("Bolt Server one way message InterruptedException! target url:" - + boltUrl, e); - throw new RuntimeException("Bolt Server one way message InterruptedException!", e); - } - } - throw new IllegalArgumentException( - "Send message connection can not be null or connection not be connected!"); - } - @Override public Object sendSync(Channel channel, Object message, int timeoutMillis) { if (channel != null && channel.isConnected()) { diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java index 701729786..bf50d432b 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.remoting.bolt.exchange; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.ChannelHandler; @@ -25,10 +29,6 @@ import com.alipay.sofa.registry.remoting.bolt.BoltServer; import com.alipay.sofa.registry.remoting.exchange.Exchange; -import java.util.Arrays; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * * @author shangyu.wh @@ -42,14 +42,19 @@ public class BoltExchange implements Exchange { @Override public Client connect(String serverType, URL serverUrl, ChannelHandler... channelHandlers) { + return this.connect(serverType, 1, serverUrl, channelHandlers); + } + @Override + public Client connect(String serverType, int connNum, URL serverUrl, + ChannelHandler... channelHandlers) { if (channelHandlers == null) { throw new IllegalArgumentException("channelHandlers cannot be null!"); } Client client = clients.get(serverType); if (client == null) { - BoltClient boltClient = new BoltClient(); - boltClient.setChannelHandlers(Arrays.asList(channelHandlers)); + BoltClient boltClient = createBoltClient(connNum); + boltClient.initHandlers(Arrays.asList(channelHandlers)); boltClient.connect(serverUrl); client = clients.putIfAbsent(serverType, boltClient); if (client == null) { @@ -59,7 +64,6 @@ public Client connect(String serverType, URL serverUrl, ChannelHandler... channe Channel channel = client.getChannel(serverUrl); if (channel == null) { BoltClient boltClient = (BoltClient) client; - boltClient.setChannelHandlers(Arrays.asList(channelHandlers)); boltClient.connect(serverUrl); } } @@ -68,12 +72,11 @@ public Client connect(String serverType, URL serverUrl, ChannelHandler... channe @Override public Server open(URL url, ChannelHandler... channelHandlers) { - if (channelHandlers == null) { throw new IllegalArgumentException("channelHandlers cannot be null!"); } - BoltServer server = new BoltServer(url, Arrays.asList(channelHandlers)); + BoltServer server = createBoltServer(url, channelHandlers); setServer(server, url); server.startServer(); return server; @@ -97,4 +100,12 @@ public Server getServer(Integer port) { public void setServer(Server server, URL url) { serverMap.putIfAbsent(url.getPort(), server); } + + protected BoltClient createBoltClient(int connNum) { + return new BoltClient(connNum); + } + + protected BoltServer createBoltServer(URL url, ChannelHandler[] channelHandlers) { + return new BoltServer(url, Arrays.asList(channelHandlers)); + } } \ No newline at end of file diff --git a/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/BoltServerTest.java b/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/BoltServerTest.java index 36e8e3830..cfb25f7c8 100644 --- a/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/BoltServerTest.java +++ b/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/BoltServerTest.java @@ -16,13 +16,14 @@ */ package com.alipay.sofa.registry.remoting.bolt; -import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.bolt.BoltServer; +import java.net.InetSocketAddress; + +import javax.ws.rs.client.WebTarget; + import org.junit.Assert; import org.junit.Test; -import javax.ws.rs.client.WebTarget; -import java.net.InetSocketAddress; +import com.alipay.sofa.registry.remoting.Channel; /** * @@ -67,6 +68,11 @@ public void setAttribute(String key, Object value) { public WebTarget getWebTarget() { return null; } + + @Override + public void close() { + + } }); } sessionServer.getChannels(); diff --git a/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/MockChannel.java b/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/MockChannel.java index b36f74838..d00c5d5b9 100644 --- a/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/MockChannel.java +++ b/server/remoting/bolt/src/test/java/com/alipay/sofa/registry/remoting/bolt/MockChannel.java @@ -16,10 +16,11 @@ */ package com.alipay.sofa.registry.remoting.bolt; -import com.alipay.sofa.registry.remoting.Channel; +import java.net.InetSocketAddress; import javax.ws.rs.client.WebTarget; -import java.net.InetSocketAddress; + +import com.alipay.sofa.registry.remoting.Channel; /** * @author xuanbei @@ -55,4 +56,9 @@ public void setAttribute(String key, Object value) { public WebTarget getWebTarget() { return null; } + + @Override + public void close() { + + } } diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyChannel.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyChannel.java index 54154d40f..5a061273a 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyChannel.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyChannel.java @@ -16,13 +16,14 @@ */ package com.alipay.sofa.registry.remoting.jersey; -import com.alipay.sofa.registry.net.NetUtil; -import com.alipay.sofa.registry.remoting.Channel; +import java.net.InetSocketAddress; +import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.WebTarget; -import java.net.InetSocketAddress; -import java.net.URI; + +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.remoting.Channel; /** * @@ -77,6 +78,11 @@ public WebTarget getWebTarget() { return webTarget; } + @Override + public void close() { + client.close(); + } + /** * Setter method for property webTarget. * diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java index 825a7dd51..c682a8cf0 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java @@ -16,28 +16,27 @@ */ package com.alipay.sofa.registry.remoting.jersey; +import java.net.InetSocketAddress; +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.UriBuilder; + +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.HttpUrlConnectorProvider; +import org.glassfish.jersey.jackson.JacksonFeature; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.net.NetUtil; import com.alipay.sofa.registry.remoting.CallbackHandler; import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Client; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.client.HttpUrlConnectorProvider; -import org.glassfish.jersey.jackson.JacksonFeature; - -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.UriBuilder; -import java.net.InetSocketAddress; -import java.net.URI; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; /** * @@ -49,7 +48,9 @@ public class JerseyClient implements Client { private static final Logger LOGGER = LoggerFactory .getLogger(JerseyClient.class); private volatile static JerseyClient instance; + private final AtomicReference client = new AtomicReference<>(null); + private Map channels = new HashMap<>(); /** @@ -89,6 +90,22 @@ public Channel connect(URL url) { } } + @Override + public Object sendSync(URL url, Object message, int timeoutMillis) { + return null; + } + + @Override + public Object sendSync(Channel channel, Object message, int timeoutMillis) { + return null; + } + + @Override + public void sendCallback(URL url, Object message, CallbackHandler callbackHandler, + int timeoutMillis) { + + } + private WebTarget getTarget(URL targetUrl) { return getClient().target(getBaseUri(targetUrl)); } @@ -125,24 +142,6 @@ public URI getBaseUri(URL targetUrl) { return uri; } - @Override - public Collection getChannels() { - return null; - } - - @Override - public Channel getChannel(InetSocketAddress remoteAddress) { - Channel c = channels.get(NetUtil.toAddressString(remoteAddress)); - if (c == null) { - return null; - } else { - if (!c.isConnected()) { - connect(new URL(remoteAddress)); - } - } - return c; - } - @Override public Channel getChannel(URL url) { Channel c = channels.get(url.getAddressString()); @@ -156,11 +155,6 @@ public Channel getChannel(URL url) { return c; } - @Override - public List getChannelHandlers() { - return null; - } - @Override public InetSocketAddress getLocalAddress() { return NetUtil.getLocalSocketAddress(); @@ -171,29 +165,9 @@ public void close() { } - @Override - public void close(Channel channel) { - - } - @Override public boolean isClosed() { return false; } - @Override - public void sendOneway(Channel channel, Object message) { - - } - - @Override - public Object sendSync(Channel channel, Object message, int timeoutMillis) { - return null; - } - - @Override - public void sendCallback(Channel channel, Object message, CallbackHandler callbackHandler, - int timeoutMillis) { - - } } \ No newline at end of file diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java index 9907c2f31..0e08653fa 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyJettyServer.java @@ -19,7 +19,6 @@ import java.net.InetSocketAddress; import java.net.URI; import java.util.Collection; -import java.util.List; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicBoolean; @@ -41,7 +40,6 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.CallbackHandler; import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Server; import com.alipay.sofa.registry.remoting.jersey.jetty.server.HttpConnectionCustomFactory; @@ -165,8 +163,8 @@ public Channel getChannel(URL url) { } @Override - public List getChannelHandlers() { - return null; + public void close(Channel channel) { + throw new UnsupportedOperationException("Jersey Server don't support close Channel."); } @Override @@ -188,11 +186,6 @@ public void close() { throw new RuntimeException("Jersey Server has not started!Server Channel has not created!"); } - @Override - public void close(Channel channel) { - throw new UnsupportedOperationException("Jersey Server don't support close Channel."); - } - @Override public boolean isClosed() { if (server != null) { @@ -201,11 +194,6 @@ public boolean isClosed() { return true; } - @Override - public void sendOneway(Channel channel, Object message) { - - } - @Override public Object sendSync(Channel channel, Object message, int timeoutMillis) { return null; diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/exchange/JerseyExchange.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/exchange/JerseyExchange.java index be001a92b..f73c8b05f 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/exchange/JerseyExchange.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/exchange/JerseyExchange.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.remoting.jersey.exchange; +import java.net.URI; +import java.util.concurrent.ConcurrentHashMap; + +import javax.ws.rs.core.UriBuilder; + +import org.glassfish.jersey.server.ResourceConfig; + import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -24,11 +31,6 @@ import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.remoting.jersey.JerseyClient; import com.alipay.sofa.registry.remoting.jersey.JerseyJettyServer; -import org.glassfish.jersey.server.ResourceConfig; - -import javax.ws.rs.core.UriBuilder; -import java.net.URI; -import java.util.concurrent.ConcurrentHashMap; /** * @@ -51,6 +53,12 @@ public Client connect(String serverType, URL serverUrl, ResourceConfig... channe return jerseyClient; } + @Override + public Client connect(String serverType, int connNum, URL serverUrl, + ResourceConfig... channelHandlers) { + throw new UnsupportedOperationException(); + } + @Override public Server open(URL url, ResourceConfig... resources) { diff --git a/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java b/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java index 4e587d8ec..ee005fc98 100644 --- a/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java +++ b/server/remoting/http/src/test/java/com/alipay/sofa/registry/remoting/jersey/JerseyExchangeTest.java @@ -16,20 +16,21 @@ */ package com.alipay.sofa.registry.remoting.jersey; -import com.alipay.sofa.registry.common.model.store.URL; -import com.alipay.sofa.registry.net.NetUtil; -import com.alipay.sofa.registry.remoting.CallbackHandler; -import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.remoting.jersey.exchange.JerseyExchange; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; + +import java.net.InetSocketAddress; +import java.util.concurrent.Executor; + import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Assert; import org.junit.Test; -import java.net.InetSocketAddress; -import java.util.concurrent.Executor; - -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import com.alipay.sofa.registry.common.model.store.URL; +import com.alipay.sofa.registry.net.NetUtil; +import com.alipay.sofa.registry.remoting.CallbackHandler; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.jersey.exchange.JerseyExchange; /** * @author xuanbei @@ -86,20 +87,11 @@ private void testJerseyJettyServer(URL url, JerseyJettyServer jerseyJettyServer, Assert.assertNull(jerseyJettyServer.getChannels()); Assert.assertNull(jerseyJettyServer.getChannel(new InetSocketAddress(9663))); Assert.assertNull(jerseyJettyServer.getChannel(url)); - Assert.assertNull(jerseyJettyServer.getChannelHandlers()); Assert.assertEquals(new InetSocketAddress(JERSEY_TEST_PORT), jerseyJettyServer.getLocalAddress()); Assert.assertFalse(jerseyJettyServer.isClosed()); - boolean isException = false; - try { - jerseyJettyServer.close(new JerseyChannel()); - } catch (Throwable t) { - isException = true; - } - Assert.assertTrue(isException); jerseyJettyServer.sendCallback(new JerseyChannel(), new Object(), callbackHandler, 1000); - jerseyJettyServer.sendOneway(new JerseyChannel(), new Object()); Assert.assertNull(jerseyJettyServer.sendSync(new JerseyChannel(), new Object(), 1000)); } @@ -107,15 +99,10 @@ private void testJerseyClient(URL url, JerseyClient jerseyClient, CallbackHandler callbackHandler) { Assert.assertEquals(NetUtil.getLocalSocketAddress(), jerseyClient.getLocalAddress()); Assert.assertFalse(jerseyClient.isClosed()); - Assert.assertNull(jerseyClient.getChannels()); - Assert.assertNull(jerseyClient.getChannel(new InetSocketAddress(9663))); Assert.assertNull(jerseyClient.getChannel(url)); - Assert.assertNull(jerseyClient.getChannelHandlers()); - Assert.assertNull(jerseyClient.sendSync(new JerseyChannel(), new Object(), 1000)); + Assert.assertNull(jerseyClient.sendSync(new URL(), new Object(), 1000)); jerseyClient.close(); - jerseyClient.close(new JerseyChannel()); - jerseyClient.sendOneway(new JerseyChannel(), new Object()); - jerseyClient.sendCallback(new JerseyChannel(), new Object(), callbackHandler, 1000); + jerseyClient.sendCallback(new URL(), new Object(), callbackHandler, 1000); } private void testJerseyChannel(JerseyChannel jerseyChannel) { diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index 956b6e828..cf1b5a627 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -16,6 +16,16 @@ */ package com.alipay.sofa.registry.server.data.change.notify; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.dataserver.Datum; @@ -33,14 +43,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; /** * Notify session DataChangeRequest,if fail get result callback retry @@ -102,7 +104,7 @@ public Set getSuitableSource() { public void notify(Datum datum, Long lastVersion) { DataChangeRequest request = new DataChangeRequest(datum.getDataInfoId(), datum.getDataCenter(), datum.getVersion()); - List connections = sessionServerConnectionFactory.getConnections(); + List connections = sessionServerConnectionFactory.getSessionConnections(); for (Connection connection : connections) { doNotify(new NotifyCallback(connection, request)); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java index 742b66e05..38096aa96 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/TempPublisherNotifier.java @@ -16,6 +16,13 @@ */ package com.alipay.sofa.registry.server.data.change.notify; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.remoting.Connection; import com.alipay.remoting.InvokeCallback; import com.alipay.sofa.registry.common.model.CommonResponse; @@ -31,12 +38,6 @@ import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Executor; /** * @@ -72,7 +73,7 @@ public Set getSuitableSource() { @Override public void notify(Datum datum, Long lastVersion) { DataPushRequest request = new DataPushRequest(datum); - List connections = sessionServerConnectionFactory.getConnections(); + List connections = sessionServerConnectionFactory.getSessionConnections(); for (Connection connection : connections) { doNotify(new NotifyPushDataCallback(connection, request)); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/DataNodeExchanger.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/DataNodeExchanger.java index 69a4dc7e4..42c368099 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/DataNodeExchanger.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/DataNodeExchanger.java @@ -54,18 +54,17 @@ public class DataNodeExchanger implements NodeExchanger { @Override public Response request(Request request) { - Channel channel = this.connect(request.getRequestUrl()); Client client = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); LOGGER.info("DataNode Exchanger request={},url={},callbackHandler={}", request.getRequestBody(), request.getRequestUrl(), request.getCallBackHandler()); if (null != request.getCallBackHandler()) { - client.sendCallback(channel, request.getRequestBody(), + client.sendCallback(request.getRequestUrl(), request.getRequestBody(), request.getCallBackHandler(), dataServerConfig.getRpcTimeout()); return () -> Response.ResultStatus.SUCCESSFUL; } else { - final Object result = client.sendSync(channel, request.getRequestBody(), + final Object result = client.sendSync(request.getRequestUrl(), request.getRequestBody(), dataServerConfig.getRpcTimeout()); return () -> result; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java index c79b8dabf..0648c78cf 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/MetaNodeExchanger.java @@ -58,26 +58,21 @@ public class MetaNodeExchanger implements NodeExchanger { @Override public Response request(Request request) { - Channel channel = connect(request.getRequestUrl()); Client client = boltExchange.getClient(Exchange.META_SERVER_TYPE); LOGGER.info("MetaNode Exchanger request={},url={},callbackHandler={}", request.getRequestBody(), request.getRequestUrl(), request.getCallBackHandler()); try { - final Object result = client.sendSync(channel, request.getRequestBody(), + final Object result = client.sendSync(request.getRequestUrl(), request.getRequestBody(), dataServerConfig.getRpcTimeout()); return () -> result; } catch (Exception e) { //retry URL url = new URL(metaServerService.refreshLeader().getIp(), dataServerConfig.getMetaServerPort()); - channel = client.getChannel(url); - if (channel == null) { - channel = client.connect(url); - } LOGGER.warn("MetaNode Exchanger request send error!It will be retry once!Request url:{}", url); - final Object result = client.sendSync(channel, request.getRequestBody(), + final Object result = client.sendSync(url, request.getRequestBody(), dataServerConfig.getRpcTimeout()); return () -> result; } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java index 0ee31edf1..1c3520a1d 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java @@ -16,13 +16,14 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver; -import java.util.Collections; -import java.util.HashSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicInteger; import org.springframework.beans.factory.annotation.Autowired; @@ -34,35 +35,36 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.disconnect.SessionServerDisconnectEvent; /** - * the factory to hold sesseionserver connections + * the factory to hold SessionServer connections * * @author qian.lqlq + * @author kezhu.wukz * @version $Id: SessionServerConnectionFactory.java, v 0.1 2017-12-06 15:48 qian.lqlq Exp $ */ public class SessionServerConnectionFactory { - private static final Logger LOGGER = LoggerFactory - .getLogger(SessionServerConnectionFactory.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(SessionServerConnectionFactory.class); - private static final int DELAY = 30 * 1000; + private static final int DELAY = 30 * 1000; + private static final Map EMPTY_MAP = new HashMap(0); /** - * collection of connections - * key : processId - * value : connection + * key : SessionServer address + * value: SessionServer processId */ - private final Map MAP = new ConcurrentHashMap<>(); + private final Map SESSION_CONN_PROCESS_ID_MAP = new ConcurrentHashMap<>(); /** - * key : sessionserver host - * value: sesseionserver processId + * key : SessionServer processId + * value: ip:port of clients */ - private final Map PROCESS_ID_MAP = new ConcurrentHashMap<>(); + private final Map> PROCESS_ID_CONNECT_ID_MAP = new ConcurrentHashMap<>(); /** - * key : sessionserver processId - * value: ip:port of clients + * key : SessionServer processId + * value: pair(SessionServer address, SessionServer connection) */ - private final Map> PROCESS_ID_CONNECT_ID_MAP = new ConcurrentHashMap<>(); + private final Map PROCESS_ID_SESSION_CONN_MAP = new ConcurrentHashMap<>(); @Autowired private DisconnectEventHandler disconnectEventHandler; @@ -74,18 +76,21 @@ public class SessionServerConnectionFactory { * @param connectIds * @param connection */ - public void register(String processId, Set connectIds, Connection connection) { - String serverHost = NetUtil.toAddressString(connection.getRemoteAddress()); + public void registerSession(String processId, Set connectIds, Connection connection) { + String sessionConnAddress = NetUtil.toAddressString(connection.getRemoteAddress()); if (LOGGER.isInfoEnabled()) { - LOGGER.info("session({}, processId={}) registered", serverHost, processId); - } - MAP.put(processId, new Pair(serverHost, connection)); - Set ret = PROCESS_ID_CONNECT_ID_MAP.getOrDefault(processId, null); - if (ret == null) { - PROCESS_ID_CONNECT_ID_MAP.putIfAbsent(processId, new HashSet<>()); + LOGGER.info("session({}, processId={}) registered", sessionConnAddress, processId); } - PROCESS_ID_CONNECT_ID_MAP.get(processId).addAll(connectIds); - PROCESS_ID_MAP.put(serverHost, processId); + + SESSION_CONN_PROCESS_ID_MAP.put(sessionConnAddress, processId); + + Set connectIdSet = PROCESS_ID_CONNECT_ID_MAP + .computeIfAbsent(processId, k -> ConcurrentHashMap.newKeySet()); + connectIdSet.addAll(connectIds); + + Pair pair = PROCESS_ID_SESSION_CONN_MAP.computeIfAbsent(processId, k -> new Pair(new ConcurrentHashMap<>())); + pair.getConnections().put(sessionConnAddress, connection); + } /** @@ -94,24 +99,33 @@ public void register(String processId, Set connectIds, Connection connec * @param connectId */ public void registerConnectId(String processId, String connectId) { - Set ret = PROCESS_ID_CONNECT_ID_MAP.getOrDefault(processId, null); - if (ret == null) { - PROCESS_ID_CONNECT_ID_MAP.putIfAbsent(processId, new HashSet<>()); - } - PROCESS_ID_CONNECT_ID_MAP.get(processId).add(connectId); + Set connectIdSet = PROCESS_ID_CONNECT_ID_MAP + .computeIfAbsent(processId, k -> ConcurrentHashMap.newKeySet()); + connectIdSet.add(connectId); } /** - * remove connection by specific host + * session disconnected, The SessionServerDisconnectEvent is triggered only when the last connections is removed */ - public void removeProcess(String sessionServerHost) { - String processId = PROCESS_ID_MAP.remove(sessionServerHost); + public void sessionDisconnected(String sessionConnAddress) { + String processId = SESSION_CONN_PROCESS_ID_MAP.remove(sessionConnAddress); if (LOGGER.isInfoEnabled()) { - LOGGER.info("session({}, processId={}) unregistered", sessionServerHost, processId); + LOGGER.info("session({}, processId={}) unregistered", sessionConnAddress, processId); } if (processId != null) { - disconnectEventHandler.receive(new SessionServerDisconnectEvent(processId, - sessionServerHost, DELAY)); + Pair pair = PROCESS_ID_SESSION_CONN_MAP.get(processId); + + // remove connection + if (pair != null) { + pair.getConnections().remove(sessionConnAddress); + pair.lastDisconnectedSession = sessionConnAddress; + } + + // The SessionServerDisconnectEvent is triggered only when the last connection is broken + if (pair == null || pair.getConnections().isEmpty()) { + disconnectEventHandler.receive(new SessionServerDisconnectEvent(processId, + sessionConnAddress, DELAY)); + } } } @@ -124,63 +138,62 @@ public Set removeConnectIds(String processId) { } /** - * - * @param processId - * @return + * If the number of connections is 0, and lastDisconnectedSession matched, he ProcessId can be deleted */ - public boolean removeProcessIfMatch(String processId, String sessionServerHost) { - return MAP.remove(processId, new Pair(sessionServerHost, null)); + public boolean removeProcessIfMatch(String processId, String sessionConnAddress) { + Pair emptyPair = new Pair(EMPTY_MAP); + emptyPair.lastDisconnectedSession = sessionConnAddress; + return PROCESS_ID_SESSION_CONN_MAP.remove(processId, emptyPair); } /** - * get all connections - * - * @return + * get connections of SessionServer ( Randomly select a connection for each session ) */ - public List getConnections() { - return MAP.size() <= 0 ? - Collections.EMPTY_LIST : - MAP.values().stream().map(Pair::getConnection).collect(Collectors.toList()); + public List getSessionConnections() { + List list = new ArrayList<>(PROCESS_ID_SESSION_CONN_MAP.size()); + Collection pairs = PROCESS_ID_SESSION_CONN_MAP.values(); + if (pairs != null) { + for (Pair pair : pairs) { + Object[] conns = pair.getConnections().values().toArray(); + if (conns.length > 0) { + int n = pair.roundRobin.incrementAndGet(); + if (n < 0) { + pair.roundRobin.compareAndSet(n, 0); + n = (n == Integer.MIN_VALUE) ? 0 : Math.abs(n); + } + n = n % conns.length; + list.add((Connection) conns[n]); + } + } + } + return list; } /** - * convenient class to store sessionServerHost and connection + * convenient class to store sessionConnAddress and connection */ private static class Pair { - private String sessionServerHost; - private Connection connection; + private AtomicInteger roundRobin = new AtomicInteger(-1); + private Map connections; + private String lastDisconnectedSession; - private Pair(String sessionServerHost, Connection connection) { - this.sessionServerHost = sessionServerHost; - this.connection = connection; + private Pair(Map connections) { + this.connections = connections; } @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Pair pair = (Pair) o; - - return sessionServerHost.equals(pair.sessionServerHost); - } - - @Override - public int hashCode() { - return sessionServerHost.hashCode(); + return connections.equals(((Pair) o).getConnections()) + && (((Pair) o).lastDisconnectedSession.equals(lastDisconnectedSession)); } /** - * Getter method for property connection. + * Getter method for property connections. * - * @return property value of connection + * @return property value of connections */ - private Connection getConnection() { - return connection; + private Map getConnections() { + return connections; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java index d386f21f0..8d5333d26 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/disconnect/DisconnectEventHandler.java @@ -134,7 +134,7 @@ public void afterPropertiesSet() { //check processId confirm remove,and not be registered again when delay time String sessionServerHost = event.getSessionServerHost(); if (sessionServerConnectionFactory - .removeProcessIfMatch(processId, sessionServerHost)) { + .removeProcessIfMatch(processId,sessionServerHost)) { Set connectIds = sessionServerConnectionFactory .removeConnectIds(processId); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java index 2340fa18d..02316aee8 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/DataServerConnectionHandler.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node; import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.net.NetUtil; @@ -24,7 +26,6 @@ import com.alipay.sofa.registry.remoting.RemotingException; import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -51,7 +52,7 @@ public void connected(Channel channel) throws RemotingException { @Override public void disconnected(Channel channel) throws RemotingException { super.disconnected(channel); - sessionServerConnectionFactory.removeProcess(NetUtil.toAddressString(channel + sessionServerConnectionFactory.sessionDisconnected(NetUtil.toAddressString(channel .getRemoteAddress())); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java index d4ff45166..3f61dba3a 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/SessionServerRegisterHandler.java @@ -52,7 +52,7 @@ public Object doHandle(Channel channel, SessionServerRegisterRequest request) { if (connectIds == null) { connectIds = new HashSet<>(); } - sessionServerConnectionFactory.register(request.getProcessId(), connectIds, + sessionServerConnectionFactory.registerSession(request.getProcessId(), connectIds, ((BoltChannel) channel).getConnection()); return CommonResponse.buildSuccessResponse(); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java index de514156e..6671dad81 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/resource/DataDigestResource.java @@ -175,7 +175,7 @@ public Map> getServerListAll(@PathParam("type") String type } public List getSessionServerList() { - List connections = sessionServerConnectionFactory.getConnections().stream() + List connections = sessionServerConnectionFactory.getSessionConnections().stream() .filter(connection -> connection != null && connection.isFine()) .map(connection -> connection.getRemoteIP() + ":" + connection.getRemotePort()) .collect(Collectors.toList()); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/MetaClientExchanger.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/MetaClientExchanger.java index 4c48f713e..f326ec153 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/MetaClientExchanger.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/remoting/MetaClientExchanger.java @@ -16,13 +16,22 @@ */ package com.alipay.sofa.registry.server.meta.remoting; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Client; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -34,15 +43,6 @@ import com.alipay.sofa.registry.server.meta.bootstrap.NodeConfig; import com.alipay.sofa.registry.server.meta.bootstrap.ServiceFactory; import com.alipay.sofa.registry.server.meta.store.StoreService; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; /** * @@ -82,13 +82,7 @@ public Response request(Request request) throws RequestException { metaClient = boltExchange.connect(Exchange.META_SERVER_TYPE, url, new ChannelHandler[0]); } - Channel channel = metaClient.getChannel(url); - if (channel == null) { - LOGGER.warn("MetaClient Exchanger get channel {} error or disconnected!", url); - channel = metaClient.connect(url); - } - - final Object result = metaClient.sendSync(channel, request.getRequestBody(), + final Object result = metaClient.sendSync(url, request.getRequestBody(), metaServerConfig.getMetaNodeExchangeTimeout()); response = () -> result; } catch (Exception e) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 3ed3279cd..6f6ab355b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -235,6 +235,7 @@ private void connectDataServer() { } dataClient = boltExchange.connect( Exchange.DATA_SERVER_TYPE, + sessionServerConfig.getDataClientConnNum(), new URL(dataNode.getNodeUrl().getIpAddress(), sessionServerConfig .getDataServerPort()), dataClientHandlers .toArray(new ChannelHandler[dataClientHandlers.size()])); @@ -261,8 +262,6 @@ private void connectMetaServer() { if (metaStart.compareAndSet(false, true)) { metaClient = metaNodeExchanger.connectServer(); - int size = metaClient.getChannels().size(); - URL leaderUrl = new URL(raftClientManager.getLeader().getIp(), sessionServerConfig.getMetaServerPort()); @@ -276,7 +275,7 @@ private void connectMetaServer() { fetchBlackList(); - LOGGER.info("MetaServer connected {} server! Port:{}", size, + LOGGER.info("MetaServer connected meta server! Port:{}", sessionServerConfig.getMetaServerPort()); } } catch (Exception e) { @@ -354,13 +353,13 @@ private void fetchBlackList() { private Object sendMetaRequest(Object request, URL leaderUrl) { Object ret; try { - ret = metaClient.sendSync(metaClient.getChannel(leaderUrl), request, + ret = metaClient.sendSync(leaderUrl, request, sessionServerConfig.getMetaNodeExchangeTimeOut()); } catch (Exception e) { URL leaderUrlNew = new URL(raftClientManager.refreshLeader().getIp(), sessionServerConfig.getMetaServerPort()); LOGGER.warn("request send error!It will be retry once to new leader {}!", leaderUrlNew); - ret = metaClient.sendSync(metaClient.getChannel(leaderUrlNew), request, + ret = metaClient.sendSync(leaderUrlNew, request, sessionServerConfig.getMetaNodeExchangeTimeOut()); } return ret; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java index d0c5277a4..4bc1db130 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfig.java @@ -214,4 +214,7 @@ public interface SessionServerConfig { long getPublishDataExecutorKeepAliveTime(); double getAccessLimitRate(); + + int getDataClientConnNum(); + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index aba075070..77ff68300 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -16,14 +16,14 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * The type Session server config bean. * @author shangyu.wh @@ -238,6 +238,8 @@ public class SessionServerConfigBean implements SessionServerConfig { private int dataNodeRetryExecutorThreadSize = 100; + private int dataClientConnNum = 10; + //end config for enterprise version private CommonConfig commonConfig; @@ -2029,6 +2031,25 @@ public void setAccessLimitRate(double accessLimitRate) { this.accessLimitRate = accessLimitRate; } + /** + * Getter method for property dataClientConnNum. + * + * @return property value of dataClientConnNum + */ + @Override + public int getDataClientConnNum() { + return dataClientConnNum; + } + + /** + * Setter method for property dataClientConnNum . + * + * @param dataClientConnNum value to be assigned to property dataClientConnNum + */ + public void setDataClientConnNum(int dataClientConnNum) { + this.dataClientConnNum = dataClientConnNum; + } + @Override public boolean isInvalidForeverZone(String zoneId) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java index 38563b430..717e365cf 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java @@ -16,9 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.SessionRegisterDataTask; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.task.batcher.TaskDispatcher; @@ -27,7 +28,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -36,12 +36,6 @@ */ public class SessionRegisterDataTaskListener implements TaskListener { - /** - * DataNode service - */ - @Autowired - private DataNodeService dataNodeService; - @Autowired private Exchange boltExchange; @@ -74,7 +68,7 @@ public boolean support(TaskEvent event) { @Override public void handleEvent(TaskEvent event) { SessionTask sessionRegisterDataTask = new SessionRegisterDataTask(boltExchange, - dataNodeService, sessionServerConfig); + sessionServerConfig); sessionRegisterDataTask.setTaskEvent(event); getSingleTaskDispatcher().dispatch(sessionRegisterDataTask.getTaskId(), sessionRegisterDataTask, sessionRegisterDataTask.getExpiryTime()); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java index 544c88010..030265299 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeService.java @@ -23,7 +23,6 @@ import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.RenewDatumRequest; import com.alipay.sofa.registry.common.model.dataserver.Datum; -import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.URL; @@ -90,15 +89,6 @@ public interface DataNodeService { */ Map getDatumMap(String dataInfoId, String dataCenterId); - /** - * register session process id when connect to data node - * process id see SessionProcessIdGenerator - * @param sessionServerRegisterRequest - * @param dataUrl - */ - void registerSessionProcessId(SessionServerRegisterRequest sessionServerRegisterRequest, - URL dataUrl); - /** * check publisher digest same as session current store,and renew the lastUpdateTime of this connectId */ diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java index d883ab441..bb16a7550 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/node/service/DataNodeServiceImpl.java @@ -16,6 +16,17 @@ */ package com.alipay.sofa.registry.server.session.node.service; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.DatumSnapshotRequest; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -26,7 +37,6 @@ import com.alipay.sofa.registry.common.model.dataserver.GetDataRequest; import com.alipay.sofa.registry.common.model.dataserver.GetDataVersionRequest; import com.alipay.sofa.registry.common.model.dataserver.PublishDataRequest; -import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; import com.alipay.sofa.registry.common.model.dataserver.UnPublishDataRequest; import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.URL; @@ -42,15 +52,6 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * @@ -220,28 +221,6 @@ public AtomicInteger getRetryTimes() { }; } - @Override - public void registerSessionProcessId(final SessionServerRegisterRequest sessionServerRegisterRequest, - final URL dataUrl) { - try { - Request request = new Request() { - @Override - public SessionServerRegisterRequest getRequestBody() { - return sessionServerRegisterRequest; - } - - @Override - public URL getRequestUrl() { - return dataUrl; - } - }; - dataNodeExchanger.request(request); - } catch (RequestException e) { - throw new RuntimeException("DataNodeService register processId error! " - + e.getMessage(), e); - } - } - @Override public Map> fetchDataVersion(URL dataNodeUrl, Collection dataInfoIdList) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index c3b2e2aef..706afa4f1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -27,7 +27,6 @@ import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Client; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -82,11 +81,6 @@ public Response request(Request request) throws RequestException { sessionClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, url, dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); } - //try to connect data - Channel channel = sessionClient.getChannel(url); - if (channel == null) { - channel = sessionClient.connect(url); - } // print but ignore if from renew module, cause renew request is too much if (!(request.getRequestBody() instanceof RenewDatumRequest)) { @@ -94,7 +88,7 @@ public Response request(Request request) throws RequestException { } final Object result = sessionClient - .sendSync(channel, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); + .sendSync(url, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); if (result == null) { throw new RequestException("DataNode Exchanger request data get null result!", request); } @@ -138,10 +132,8 @@ public Client connectServer() { } try { - Channel channel = dataClient.getChannel(url); - if (channel == null) { - dataClient.connect(url); - } + // make sure there are connections to DataServer + dataClient.connect(url); } catch (Exception e) { LOGGER.error("DataNode Exchanger connect channel error!url:" + url, e); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java index 5f66bf863..6b6553e81 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.server.session.remoting; +import java.util.Collection; + +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; @@ -32,10 +38,6 @@ import com.alipay.sofa.registry.server.session.node.NodeManager; import com.alipay.sofa.registry.server.session.node.RaftClientManager; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractClientHandler; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.Resource; -import java.util.Collection; /** * The type Data node exchanger. @@ -80,14 +82,9 @@ public Response request(Request request) throws RequestException { sessionClient = boltExchange.connect(Exchange.META_SERVER_TYPE, url, metaClientHandlers.toArray(new ChannelHandler[metaClientHandlers.size()])); } - //try to connect data - Channel channel = sessionClient.getChannel(url); - if (channel == null) { - channel = sessionClient.connect(url); - } try { - final Object result = sessionClient.sendSync(channel, request.getRequestBody(), + final Object result = sessionClient.sendSync(url, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); response = () -> result; @@ -95,13 +92,9 @@ public Response request(Request request) throws RequestException { //retry url = new URL(raftClientManager.refreshLeader().getIp(), sessionServerConfig.getMetaServerPort()); - channel = sessionClient.getChannel(url); - if (channel == null) { - channel = sessionClient.connect(url); - } LOGGER.warn("MetaNode Exchanger request send error!It will be retry once!Request url:{}", url); - final Object result = sessionClient.sendSync(channel, request.getRequestBody(), + final Object result = sessionClient.sendSync(url, request.getRequestBody(), sessionServerConfig.getDataNodeExchangeTimeOut()); response = () -> result; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataNodeConnectionHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataNodeConnectionHandler.java index e5f29820a..3e1ed841c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataNodeConnectionHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataNodeConnectionHandler.java @@ -16,8 +16,9 @@ */ package com.alipay.sofa.registry.server.session.remoting.handler; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; -import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; @@ -26,7 +27,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -52,7 +52,7 @@ public HandlerType getType() { @Override public void connected(Channel channel) throws RemotingException { super.connected(channel); - fireRegisterProcessIdTask(new URL(channel.getRemoteAddress())); + fireRegisterProcessIdTask(channel); } @Override @@ -60,8 +60,8 @@ protected NodeType getConnectNodeType() { return NodeType.DATA; } - private void fireRegisterProcessIdTask(URL dataURL) { - TaskEvent taskEvent = new TaskEvent(dataURL, TaskType.SESSION_REGISTER_DATA_TASK); + private void fireRegisterProcessIdTask(Channel boltChannel) { + TaskEvent taskEvent = new TaskEvent(boltChannel, TaskType.SESSION_REGISTER_DATA_TASK); taskLogger.info("send " + taskEvent.getTaskType() + " taskEvent:{}", taskEvent); taskListenerManager.sendTaskEvent(taskEvent); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java index 47d9e853b..ae41f743e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/AbstractSessionTask.java @@ -16,16 +16,17 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.task.Retryable; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; - /** * * @author shangyu.wh + * @author kezhu.wukz * @version $Id: AbstractSessionTask.java, v 0.1 2018-01-15 14:35 shangyu.wh Exp $ */ public abstract class AbstractSessionTask implements SessionTask, Retryable { @@ -62,6 +63,10 @@ protected boolean checkRetryTimes(int configTimes) { return false; } + protected int getExecCount() { + return execCount.get(); + } + @Override public long getExpiryTime() { return -1; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java index 732d3fb64..f08508aaa 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java @@ -21,21 +21,22 @@ import java.util.Set; import com.alipay.sofa.registry.common.model.dataserver.SessionServerRegisterRequest; -import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.net.NetUtil; import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.remoting.Client; import com.alipay.sofa.registry.remoting.Server; +import com.alipay.sofa.registry.remoting.bolt.BoltChannel; import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.SessionProcessIdGenerator; -import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.task.listener.TaskEvent; /** * * @author shangyu.wh + * @author kezhu.wukz * @version $Id: SessionRegisterDataTask.java, v 0.1 2018-04-16 16:07 shangyu.wh Exp $ */ public class SessionRegisterDataTask extends AbstractSessionTask { @@ -44,16 +45,13 @@ public class SessionRegisterDataTask extends AbstractSessionTask { SessionRegisterDataTask.class, "[Task]"); private final Exchange boltExchange; - private final DataNodeService dataNodeService; private final SessionServerConfig sessionServerConfig; private SessionServerRegisterRequest sessionServerRegisterRequest; - private URL dataUrl; + private BoltChannel channel; - public SessionRegisterDataTask(Exchange boltExchange, DataNodeService dataNodeService, - SessionServerConfig sessionServerConfig) { + public SessionRegisterDataTask(Exchange boltExchange, SessionServerConfig sessionServerConfig) { this.boltExchange = boltExchange; - this.dataNodeService = dataNodeService; this.sessionServerConfig = sessionServerConfig; } @@ -72,9 +70,8 @@ public void setTaskEvent(TaskEvent taskEvent) { Object obj = taskEvent.getEventObj(); - if (obj instanceof URL) { - - this.dataUrl = (URL) obj; + if (obj instanceof BoltChannel) { + this.channel = (BoltChannel) obj; } else { throw new IllegalArgumentException("Input task event object error!"); @@ -99,7 +96,26 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public void execute() { - dataNodeService.registerSessionProcessId(sessionServerRegisterRequest, dataUrl); + Client sessionClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); + try { + sessionClient.sendSync(channel, sessionServerRegisterRequest, + sessionServerConfig.getDataNodeExchangeTimeOut()); + } catch (Exception e) { + if (isLastRetry()) { + LOGGER + .error( + "Register to DataServer({}/{}:{}) error for multiple times, so close this channel (let bolt reconnect it)", + channel.getLocalAddress(), channel.getRemoteAddress().getHostString(), + channel.getRemoteAddress().getPort()); + channel.close(); + } + throw e; + } + + } + + protected boolean isLastRetry() { + return getExecCount() >= sessionServerConfig.getSessionRegisterDataServerTaskRetryTimes(); } @Override @@ -107,6 +123,8 @@ public String toString() { return "SESSION_REGISTER_DATA_TASK{" + "taskId='" + taskId + '\'' + ", sessionServerRegisterRequest=" + sessionServerRegisterRequest.getProcessId() + ", clientList=" + sessionServerRegisterRequest.getConnectIds().size() - + ", dataUrl=" + dataUrl + '}'; + + ", channel=" + channel.getLocalAddress() + "/" + + channel.getRemoteAddress().getHostString() + ':' + + channel.getRemoteAddress().getPort() + '}'; } } \ No newline at end of file From 5376da959c09788e6a636196e25190724f0faf76 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 21 Nov 2019 19:55:11 +0800 Subject: [PATCH 141/161] resolve compile error --- .../registry/remoting/bolt/BoltClient.java | 2 +- .../registry/jraft/processor/Processor.java | 12 +++--- .../registry/test/sync/SessionNotifyTest.java | 43 ++++++++++--------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index 9104b73b2..a3082ed9f 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -234,7 +234,7 @@ public void onException(Throwable e) { @Override public Executor getExecutor() { - return null; + return callbackHandler.getExecutor(); } }, timeoutMillis); return; diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java index fc584c9a8..3ad489072 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java @@ -16,6 +16,12 @@ */ package com.alipay.sofa.registry.jraft.processor; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; import com.alipay.sofa.registry.jraft.command.ProcessRequest; import com.alipay.sofa.registry.jraft.command.ProcessResponse; @@ -23,12 +29,6 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.store.api.annotation.ReadOnLeader; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - /** * * @author shangyu.wh diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java index 823768af1..4349a808e 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/SessionNotifyTest.java @@ -16,6 +16,27 @@ */ package com.alipay.sofa.registry.test.sync; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_DATA_CENTER; +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + import com.alipay.remoting.Connection; import com.alipay.sofa.registry.common.model.CommonResponse; import com.alipay.sofa.registry.common.model.GenericResponse; @@ -51,26 +72,6 @@ import com.alipay.sofa.registry.util.DatumVersionUtil; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.alipay.sofa.registry.util.ParaCheckUtil; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_DATA_CENTER; -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; /** * @author xuanbei @@ -100,7 +101,7 @@ public class SessionNotifyTest extends BaseIntegrationTest { private static Datum datum; - private static BoltClient boltClientFetch = new BoltClient(); + private static BoltClient boltClientFetch = new BoltClient(1); private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MILLISECONDS, From 41be2a05cc69dac6b97cdc64623fbd5026b1ef89 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 21 Nov 2019 20:34:50 +0800 Subject: [PATCH 142/161] fix processor --- .../registry/jraft/processor/Processor.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java index fc584c9a8..ac52e0903 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java @@ -28,6 +28,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * @@ -43,7 +44,7 @@ public class Processor { private Map workers = new HashMap<>(); - private Map methodHandleMap = new HashMap<>(); + private Map methodHandleMap = new ConcurrentHashMap<>(); private final static String SERVICE_METHOD_SPLIT = "#@#"; @@ -110,10 +111,14 @@ public ProcessResponse process(ProcessRequest request) { } Object[] methodArg = request.getMethodArgs(); String methodHandleKey = getMethodHandleKey(serviceId, methodKey); + MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); if (methodHandle == null) { - methodHandle = methodHandleMap.put(methodHandleKey, MethodHandles.lookup() - .unreflect(appServiceMethod)); + MethodHandle methodHandleNew = MethodHandles.lookup().unreflect(appServiceMethod); + methodHandle = methodHandleMap.putIfAbsent(methodHandleKey, methodHandleNew); + if (methodHandle == null) { + methodHandle = methodHandleNew; + } } Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); @@ -154,8 +159,11 @@ public ProcessResponse process(Method method, ProcessRequest request) { String methodHandleKey = getMethodHandleKey(serviceId, methodKey); MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); if (methodHandle == null) { - methodHandle = methodHandleMap.put(methodHandleKey, MethodHandles.lookup() - .unreflect(method)); + MethodHandle methodHandleNew = MethodHandles.lookup().unreflect(method); + methodHandle = methodHandleMap.putIfAbsent(methodHandleKey, methodHandleNew); + if (methodHandle == null) { + methodHandle = methodHandleNew; + } } Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); From 5a7fce2f4f12f755a8f707a25bdd0cf3738b6598 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 21 Nov 2019 21:31:51 +0800 Subject: [PATCH 143/161] BoltClient: the creation of ConnectionEventAdapter should be inheritable --- .../registry/remoting/bolt/BoltClient.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index a3082ed9f..0240ac10b 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import com.alipay.remoting.Connection; +import com.alipay.remoting.ConnectionEventProcessor; import com.alipay.remoting.ConnectionEventType; import com.alipay.remoting.InvokeCallback; import com.alipay.remoting.Url; @@ -86,29 +87,33 @@ public void initHandlers(List channelHandlers) { } rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, - new ConnectionEventAdapter(ConnectionEventType.CONNECT, connectionEventHandler, null)); + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, - new ConnectionEventAdapter(ConnectionEventType.CLOSE, connectionEventHandler, null)); - rpcClient - .addConnectionEventProcessor(ConnectionEventType.EXCEPTION, new ConnectionEventAdapter( - ConnectionEventType.EXCEPTION, connectionEventHandler, null)); + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); for (ChannelHandler channelHandler : channelHandlers) { if (HandlerType.PROCESSER.equals(channelHandler.getType())) { if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { - rpcClient.registerUserProcessor(getSyncProcessor(channelHandler)); + rpcClient.registerUserProcessor(newSyncProcessor(channelHandler)); } else { - rpcClient.registerUserProcessor(getAsyncProcessor(channelHandler)); + rpcClient.registerUserProcessor(newAsyncProcessor(channelHandler)); } } } } - protected AsyncUserProcessorAdapter getAsyncProcessor(ChannelHandler channelHandler) { + protected ConnectionEventProcessor newConnectionEventAdapter(ChannelHandler connectionEventHandler, + ConnectionEventType connectEventType) { + return new ConnectionEventAdapter(connectEventType, connectionEventHandler, null); + } + + protected AsyncUserProcessorAdapter newAsyncProcessor(ChannelHandler channelHandler) { return new AsyncUserProcessorAdapter(channelHandler); } - protected SyncUserProcessorAdapter getSyncProcessor(ChannelHandler channelHandler) { + protected SyncUserProcessorAdapter newSyncProcessor(ChannelHandler channelHandler) { return new SyncUserProcessorAdapter(channelHandler); } From 26faff7e0eab3c828dff99647e23c778e4577db4 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Wed, 27 Nov 2019 17:03:41 +0800 Subject: [PATCH 144/161] fix currentTimeMillis product from source --- .../meta/repository/RepositoryService.java | 18 ++++++-- .../service/DataRepositoryService.java | 33 +++++++-------- .../service/MetaRepositoryService.java | 35 ++++++++-------- .../service/SessionRepositoryService.java | 23 ++++++----- .../server/meta/store/DataStoreService.java | 41 +++++++------------ 5 files changed, 76 insertions(+), 74 deletions(-) diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/RepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/RepositoryService.java index 414325dd6..396d7a9f2 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/RepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/RepositoryService.java @@ -27,11 +27,23 @@ */ public interface RepositoryService { - V put(K key, V value); + default V put(K key, V value){ + return put(key,value,System.currentTimeMillis()); + } - V remove(Object key); + default V remove(Object key){ + return remove(key,System.currentTimeMillis()); + } - V replace(K key, V value); + default V replace(K key, V value){ + return replace(key,value,System.currentTimeMillis()); + } + + V put(K key, V value,Long currentTimeMillis); + + V remove(Object key,Long currentTimeMillis); + + V replace(K key, V value,Long currentTimeMillis); @ReadOnLeader V get(Object key); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java index 91c02428c..143880b01 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/DataRepositoryService.java @@ -16,16 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -36,6 +26,15 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -85,7 +84,8 @@ public SnapshotProcess copy() { } @Override - public RenewDecorate put(String ipAddress, RenewDecorate dataNode) { + public RenewDecorate put(String ipAddress, RenewDecorate dataNode, + Long currentTimeMillis) { write.lock(); try { @@ -94,14 +94,14 @@ public RenewDecorate put(String ipAddress, RenewDecorate dat NodeRepository dataNodeRepository = registry.get(dataCenter); if (dataNodeRepository == null) { NodeRepository nodeRepository = new NodeRepository<>(dataCenter, - new ConcurrentHashMap<>(), System.currentTimeMillis()); + new ConcurrentHashMap<>(), currentTimeMillis); dataNodeRepository = registry.put(dataCenter, nodeRepository); if (dataNodeRepository == null) { dataNodeRepository = nodeRepository; } } - dataNodeRepository.setVersion(System.currentTimeMillis()); + dataNodeRepository.setVersion(currentTimeMillis); Map> dataNodes = dataNodeRepository .getNodeMap(); @@ -123,7 +123,7 @@ public RenewDecorate put(String ipAddress, RenewDecorate dat } @Override - public RenewDecorate remove(Object key) { + public RenewDecorate remove(Object key, Long currentTimeMillis) { write.lock(); try { @@ -142,7 +142,7 @@ public RenewDecorate remove(Object key) { return null; } - dataNodeRepository.setVersion(System.currentTimeMillis()); + dataNodeRepository.setVersion(currentTimeMillis); return oldRenewDecorate; } } @@ -156,7 +156,8 @@ public RenewDecorate remove(Object key) { } @Override - public RenewDecorate replace(String ipAddress, RenewDecorate dataNode) { + public RenewDecorate replace(String ipAddress, RenewDecorate dataNode, + Long currentTimeMillis) { write.lock(); try { diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java index a7f5bcdd2..cace4a9df 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/MetaRepositoryService.java @@ -16,16 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.metaserver.MetaNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -36,6 +26,15 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @@ -85,7 +84,8 @@ public SnapshotProcess copy() { } @Override - public RenewDecorate put(String ipAddress, RenewDecorate metaNode) { + public RenewDecorate put(String ipAddress, RenewDecorate metaNode, + Long currentTimeMillis) { write.lock(); try { String dataCenter = metaNode.getRenewal().getDataCenter(); @@ -93,14 +93,14 @@ public RenewDecorate put(String ipAddress, RenewDecorate met NodeRepository metaNodeRepository = registry.get(dataCenter); if (metaNodeRepository == null) { NodeRepository nodeRepository = new NodeRepository<>(dataCenter, - new ConcurrentHashMap<>(), System.currentTimeMillis()); + new ConcurrentHashMap<>(), currentTimeMillis); metaNodeRepository = registry.put(dataCenter, nodeRepository); if (metaNodeRepository == null) { metaNodeRepository = nodeRepository; } } - metaNodeRepository.setVersion(System.currentTimeMillis()); + metaNodeRepository.setVersion(currentTimeMillis); Map> metaNodes = metaNodeRepository .getNodeMap(); @@ -122,7 +122,7 @@ public RenewDecorate put(String ipAddress, RenewDecorate met } @Override - public RenewDecorate remove(Object key) { + public RenewDecorate remove(Object key, Long currentTimeMillis) { write.lock(); try { String ipAddress = (String) key; @@ -140,7 +140,7 @@ public RenewDecorate remove(Object key) { return null; } - metaNodeRepository.setVersion(System.currentTimeMillis()); + metaNodeRepository.setVersion(currentTimeMillis); return oldRenewDecorate; } } @@ -154,7 +154,8 @@ public RenewDecorate remove(Object key) { } @Override - public RenewDecorate replace(String ipAddress, RenewDecorate metaNode) { + public RenewDecorate replace(String ipAddress, RenewDecorate metaNode, + Long currentTimeMillis) { write.lock(); try { String dataCenter = metaNode.getRenewal().getDataCenter(); @@ -171,7 +172,7 @@ public RenewDecorate replace(String ipAddress, RenewDecorate oldRenewDecorate.setRenewal(metaNode.getRenewal()); oldRenewDecorate.renew(); - metaNodeRepository.setVersion(System.currentTimeMillis()); + metaNodeRepository.setVersion(currentTimeMillis); } else { LOGGER.error("Meta node with ipAddress {} has not existed!", ipAddress); throw new RuntimeException(String.format( diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java index 445c194ac..7682d425c 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/repository/service/SessionRepositoryService.java @@ -16,14 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.repository.service; -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.metaserver.SessionNode; import com.alipay.sofa.registry.jraft.processor.AbstractSnapshotProcess; import com.alipay.sofa.registry.jraft.processor.SnapshotProcess; @@ -34,6 +26,13 @@ import com.alipay.sofa.registry.server.meta.repository.RepositoryService; import com.alipay.sofa.registry.server.meta.store.RenewDecorate; import com.alipay.sofa.registry.store.api.annotation.RaftService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * @@ -78,7 +77,8 @@ public SnapshotProcess copy() { } @Override - public RenewDecorate put(String ipAddress, RenewDecorate sessionNode) { + public RenewDecorate put(String ipAddress, RenewDecorate sessionNode, + Long currentTimeMillis) { try { RenewDecorate oldRenewDecorate = registry.get(ipAddress); if (oldRenewDecorate != null && oldRenewDecorate.getRenewal() != null) { @@ -94,7 +94,7 @@ public RenewDecorate put(String ipAddress, RenewDecorate remove(Object key) { + public RenewDecorate remove(Object key, Long currentTimeMillis) { try { String ipAddress = (String) key; RenewDecorate oldRenewDecorate = registry.remove(ipAddress); @@ -112,7 +112,8 @@ public RenewDecorate remove(Object key) { @Override public RenewDecorate replace(String ipAddress, - RenewDecorate sessionNode) { + RenewDecorate sessionNode, + Long currentTimeMillis) { RenewDecorate oldRenewDecorate = registry.get(ipAddress); if (oldRenewDecorate != null && oldRenewDecorate.getRenewal() != null) { oldRenewDecorate.setRenewal(sessionNode.getRenewal()); diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java index cbde82c74..c5cb14609 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/store/DataStoreService.java @@ -16,21 +16,6 @@ */ package com.alipay.sofa.registry.server.meta.store; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataCenterNodes; import com.alipay.sofa.registry.common.model.metaserver.DataNode; @@ -51,6 +36,20 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListenerManager; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; /** * @@ -86,8 +85,6 @@ public class DataStoreService implements StoreService { private AtomicLong localDataCenterInitVersion = new AtomicLong( -1L); - private static final long COMPARE_TIME_COST = 1000L; - @Override public NodeType getNodeType() { return NodeType.DATA; @@ -104,7 +101,6 @@ public NodeChangeResult addNode(DataNode dataNode) { String ipAddress = dataNode.getNodeUrl().getIpAddress(); - long startAll = System.currentTimeMillis(); write.lock(); try { @@ -120,10 +116,6 @@ public NodeChangeResult addNode(DataNode dataNode) { } finally { write.unlock(); } - long cost = System.currentTimeMillis() - startAll; - if (cost >= COMPARE_TIME_COST) { - LOGGER.info("dataRepositoryService.addNode cost:{} ", cost); - } return nodeChangeResult; } @@ -173,7 +165,6 @@ public void removeNodes(Collection nodes) { @Override public void renew(DataNode dataNode, int duration) { - long startAll = System.currentTimeMillis(); write.lock(); try { String ipAddress = dataNode.getNodeUrl().getIpAddress(); @@ -192,10 +183,6 @@ public void renew(DataNode dataNode, int duration) { } } - long cost = System.currentTimeMillis() - startAll; - if (cost >= COMPARE_TIME_COST) { - LOGGER.info("dataRepositoryService.renew.all cost:{} ", cost); - } } finally { write.unlock(); } From 4218e2ac64898cadffc1abf7853ac22b02191544 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Thu, 28 Nov 2019 15:37:26 +0800 Subject: [PATCH 145/161] add client Invalid check task --- .../session/scheduler/ExecutorManager.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java index b5b4851a4..e413330d4 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/ExecutorManager.java @@ -16,19 +16,6 @@ */ package com.alipay.sofa.registry.server.session.scheduler; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import org.springframework.beans.factory.annotation.Autowired; - import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.metrics.TaskMetrics; @@ -41,6 +28,18 @@ import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; import com.alipay.sofa.registry.util.NamedThreadFactory; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @@ -67,6 +66,7 @@ public class ExecutorManager { private final ThreadPoolExecutor pushTaskExecutor; private final ThreadPoolExecutor connectClientExecutor; private final ThreadPoolExecutor publishDataExecutor; + private final ThreadPoolExecutor cleanInvalidClientExecutor; private final AsyncHashedWheelTimer pushTaskCheckAsyncHashedWheelTimer; @@ -110,7 +110,7 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { this.sessionServerConfig = sessionServerConfig; - scheduler = new ScheduledThreadPoolExecutor(7, new NamedThreadFactory("SessionScheduler")); + scheduler = new ScheduledThreadPoolExecutor(8, new NamedThreadFactory("SessionScheduler")); fetchDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-fetchData")); @@ -130,6 +130,9 @@ public ExecutorManager(SessionServerConfig sessionServerConfig) { connectDataExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-connectDataServer")); + cleanInvalidClientExecutor = new ThreadPoolExecutor(1, 2/*CONFIG*/, 0, TimeUnit.SECONDS, + new SynchronousQueue<>(), new NamedThreadFactory("SessionScheduler-cleanInvalidClient")); + accessDataExecutor = reportExecutors.computeIfAbsent(ACCESS_DATA_EXECUTOR, k -> new SessionThreadPoolExecutor(ACCESS_DATA_EXECUTOR, sessionServerConfig.getAccessDataExecutorMinPoolSize(), @@ -227,6 +230,13 @@ public void startScheduler() { sessionServerConfig.getSchedulerConnectDataTimeout(), TimeUnit.SECONDS, sessionServerConfig.getSchedulerConnectDataExpBackOffBound(), () -> dataNodeExchanger.connectServer()), sessionServerConfig.getSchedulerConnectDataFirstDelay(), TimeUnit.SECONDS); + + scheduler.schedule( + new TimedSupervisorTask("CleanInvalidClient", scheduler, cleanInvalidClientExecutor, + sessionServerConfig.getSchedulerCleanInvalidClientTimeOut(), TimeUnit.MINUTES, + sessionServerConfig.getSchedulerCleanInvalidClientBackOffBound(), + () -> sessionRegistry.cleanClientConnect()), + sessionServerConfig.getSchedulerCleanInvalidClientFirstDelay(), TimeUnit.MINUTES); } public void stopScheduler() { From 6a1b56d921f11b88d85a46775d1410e95696dd10 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 28 Nov 2019 22:39:35 +0800 Subject: [PATCH 146/161] =?UTF-8?q?use=20multiple=20RpcClient=20instances?= =?UTF-8?q?=20instead=20of=20one=20RpcClient=20with=20multiple=20connectio?= =?UTF-8?q?ns=EF=BC=8Cand=20start=20a=20heartbeat=20thread=20to=20ensure?= =?UTF-8?q?=20connection=20pool=20because=20bolt=20does=20not=20maintain?= =?UTF-8?q?=20the=20number=20of=20connection=20pools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/dataserver/HeartbeatRequest.java | 36 ++++ .../registry/remoting/bolt/BoltClient.java | 171 +++++++++++++----- .../remoting/bolt/exchange/BoltExchange.java | 28 +-- .../DataServerBeanConfiguration.java | 7 + .../handler/HeartbeatHandler.java | 60 ++++++ 5 files changed, 240 insertions(+), 62 deletions(-) create mode 100644 server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java create mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java new file mode 100644 index 000000000..e77df4c0f --- /dev/null +++ b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.common.model.dataserver; + +import java.io.Serializable; + +/** + * + * @author kezhu.wukz + * @version $Id: HeartbeatRequest.java, v 0.1 2018-04-14 17:31 qian.lqlq Exp $ + */ +public class HeartbeatRequest implements Serializable { + + private static final long serialVersionUID = 4872633119038341583L; + + /** + * constructor + */ + public HeartbeatRequest() { + } + +} \ No newline at end of file diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index 0240ac10b..d76ffd86c 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -18,8 +18,11 @@ import java.net.InetSocketAddress; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventProcessor; @@ -30,6 +33,7 @@ import com.alipay.remoting.rpc.RpcClient; import com.alipay.remoting.rpc.protocol.RpcProtocol; import com.alipay.remoting.rpc.protocol.RpcProtocolV2; +import com.alipay.sofa.registry.common.model.dataserver.HeartbeatRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -43,32 +47,45 @@ /** * The type Bolt client. + * + * @author kezhu.wukz * @author shangyu.wh * @version $Id : BoltClient.java, v 0.1 2017-11-27 14:46 shangyu.wh Exp $ */ public class BoltClient implements Client { - private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); + + private static final int ENSURE_CONN_POOL_INTVL = 15000; /** * RpcTaskScanner: remove closed connections every 10 seconds * HealConnectionRunner: Ensure that the number of connections reaches connNum every 1 second */ - private RpcClient rpcClient; + private RpcClient[] rpcClients; + + private AtomicBoolean closed = new AtomicBoolean(false); + + private AtomicInteger roundRobinNextId = new AtomicInteger(-1); - private AtomicBoolean closed = new AtomicBoolean(false); + private Set connectedUrls = ConcurrentHashMap.newKeySet(); protected final int connNum; - protected int connectTimeout = 2000; + protected int connectTimeout = 2000; /** * Instantiates a new Bolt client. */ public BoltClient(int connNum) { - rpcClient = new RpcClient(); - rpcClient.enableReconnectSwitch(); - rpcClient.enableConnectionMonitorSwitch(); - rpcClient.init(); + rpcClients = new RpcClient[connNum]; + for (int i = 0; i < connNum; i++) { + RpcClient rpcClient = new RpcClient(); + rpcClient.enableReconnectSwitch(); + rpcClient.enableConnectionMonitorSwitch(); + rpcClient.init(); + + rpcClients[i] = rpcClient; + } this.connNum = connNum; } @@ -86,22 +103,56 @@ public void initHandlers(List channelHandlers) { } } - rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); - rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); - rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); + for (int i = 0; i < connNum; i++) { + RpcClient rpcClient = rpcClients[i]; + rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); - for (ChannelHandler channelHandler : channelHandlers) { - if (HandlerType.PROCESSER.equals(channelHandler.getType())) { - if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { - rpcClient.registerUserProcessor(newSyncProcessor(channelHandler)); - } else { - rpcClient.registerUserProcessor(newAsyncProcessor(channelHandler)); + for (ChannelHandler channelHandler : channelHandlers) { + if (HandlerType.PROCESSER.equals(channelHandler.getType())) { + if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { + rpcClient.registerUserProcessor(newSyncProcessor(channelHandler)); + } else { + rpcClient.registerUserProcessor(newAsyncProcessor(channelHandler)); + } } } } + + // start a thread to ensure connection pool (connNum > 1): bolt does not maintain the number of connection + // pools, we need to use heartbeat to make bolt maintain the number of connections + if (connNum > 1) { + Thread t = new Thread(() -> { + while (true) { + try { + Thread.sleep(ENSURE_CONN_POOL_INTVL); + } catch (InterruptedException e) { + LOGGER.error("Interrupted in ConnPoolChecker", e); + break; + } + + for (RpcClient rpcClient : rpcClients) { + try { + for (Url boltUrl : connectedUrls) { + // send something to make connection active + HeartbeatRequest heartbeatRequest = new HeartbeatRequest(); + rpcClient.invokeSync(boltUrl, heartbeatRequest, connectTimeout); + } + } catch (Throwable e) { + LOGGER.error("Error in ConnPoolChecker", e); + } + } + + } + }); + t.setDaemon(true); + t.setName("BoltClient-ConnPoolChecker"); + t.start(); + } } protected ConnectionEventProcessor newConnectionEventAdapter(ChannelHandler connectionEventHandler, @@ -118,52 +169,80 @@ protected SyncUserProcessorAdapter newSyncProcessor(ChannelHandler channelHandle } @Override - public Channel connect(URL targetUrl) { - if (targetUrl == null) { - throw new IllegalArgumentException("Create connection targetUrl can not be null!"); + public Channel connect(URL url) { + if (url == null) { + throw new IllegalArgumentException("Create connection url can not be null!"); } try { - Connection connection = getBoltConnection(targetUrl); + Url boltUrl = getBoltUrl(url); + connectedUrls.add(boltUrl); + + for (int i = 0; i < connNum; i++) { + getBoltConnection(rpcClients[i], url); + } + RpcClient rpcClient = getNextRpcClient(); + Connection connection = getBoltConnection(rpcClient, url); BoltChannel channel = new BoltChannel(); channel.setConnection(connection); return channel; } catch (RemotingException e) { - LOGGER.error("Bolt client connect server got a RemotingException! target url:" - + targetUrl, e); + LOGGER + .error("Bolt client connect server got a RemotingException! target url:" + url, e); throw new RuntimeException("Bolt client connect server got a RemotingException!", e); } } - protected Connection getBoltConnection(URL targetUrl) throws RemotingException { - Url url = getBoltUrl(targetUrl); + protected Connection getBoltConnection(RpcClient rpcClient, URL url) throws RemotingException { + Url boltUrl = getBoltUrl(url); try { - Connection connection = rpcClient.getConnection(url, connectTimeout); + Connection connection = rpcClient.getConnection(boltUrl, connectTimeout); if (connection == null || !connection.isFine()) { if (connection != null) { connection.close(); } - throw new RemotingException("Get bolt connection failed for url: " + url); + throw new RemotingException("Get bolt connection failed for boltUrl: " + boltUrl); } return connection; } catch (InterruptedException e) { throw new RuntimeException( - "BoltClient rpcClient.getConnection InterruptedException! target url:" + url, e); + "BoltClient rpcClient.getConnection InterruptedException! target boltUrl:" + + boltUrl, e); + } + } + + private RpcClient getNextRpcClient() { + int n = roundRobinNextId.incrementAndGet(); + if (n < 0) { + roundRobinNextId.compareAndSet(n, 0); + n = (n == Integer.MIN_VALUE) ? 0 : Math.abs(n); } + n = n % rpcClients.length; + return rpcClients[n]; } - protected Url getBoltUrl(URL targetUrl) { - Url url = new Url(targetUrl.getIpAddress(), targetUrl.getPort()); - url.setProtocol(RpcProtocol.PROTOCOL_CODE); - url.setVersion(RpcProtocolV2.PROTOCOL_VERSION_1); - url.setConnNum(connNum); - url.setConnWarmup(true); - return url; + protected Url getBoltUrl(URL url) { + Url boltUrl = new Url(url.getIpAddress(), url.getPort()); + boltUrl.setProtocol(RpcProtocol.PROTOCOL_CODE); + boltUrl.setVersion(RpcProtocolV2.PROTOCOL_VERSION_1); + boltUrl.setConnNum(1); + boltUrl.setConnWarmup(true); + return boltUrl; } @Override public Channel getChannel(URL url) { - return this.connect(url); + try { + RpcClient rpcClient = getNextRpcClient(); + Connection connection = getBoltConnection(rpcClient, url); + BoltChannel channel = new BoltChannel(); + channel.setConnection(connection); + return channel; + } catch (RemotingException e) { + LOGGER + .error("Bolt client connect server got a RemotingException! target url:" + url, e); + throw new RuntimeException("Bolt client connect server got a RemotingException!", e); + } } @Override @@ -174,7 +253,10 @@ public InetSocketAddress getLocalAddress() { @Override public void close() { if (closed.compareAndSet(false, true)) { - rpcClient.shutdown(); + for (int i = 0; i < connNum; i++) { + RpcClient rpcClient = rpcClients[i]; + rpcClient.shutdown(); + } } } @@ -186,6 +268,7 @@ public boolean isClosed() { @Override public Object sendSync(URL url, Object message, int timeoutMillis) { try { + RpcClient rpcClient = getNextRpcClient(); return rpcClient.invokeSync(getBoltUrl(url), message, timeoutMillis); } catch (RemotingException e) { String msg = "Bolt Client sendSync message RemotingException! target url:" + url; @@ -202,13 +285,14 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { if (channel != null && channel.isConnected()) { BoltChannel boltChannel = (BoltChannel) channel; try { + RpcClient rpcClient = getNextRpcClient(); return rpcClient.invokeSync(boltChannel.getConnection(), message, timeoutMillis); } catch (RemotingException e) { - LOGGER.error("Bolt Client sendSync message RemotingException! target url:" + LOGGER.error("Bolt Client sendSync message RemotingException! target boltUrl:" + boltChannel.getRemoteAddress(), e); throw new RuntimeException("Bolt Client sendSync message RemotingException!", e); } catch (InterruptedException e) { - LOGGER.error("Bolt Client sendSync message InterruptedException! target url:" + LOGGER.error("Bolt Client sendSync message InterruptedException! target boltUrl:" + boltChannel.getRemoteAddress(), e); throw new RuntimeException("Bolt Client sendSync message InterruptedException!", e); } @@ -222,7 +306,8 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { public void sendCallback(URL url, Object message, CallbackHandler callbackHandler, int timeoutMillis) { try { - Connection connection = getBoltConnection(url); + RpcClient rpcClient = getNextRpcClient(); + Connection connection = getBoltConnection(rpcClient, url); BoltChannel channel = new BoltChannel(); channel.setConnection(connection); rpcClient.invokeWithCallback(connection, message, new InvokeCallback() { diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java index bf50d432b..52627f664 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/exchange/BoltExchange.java @@ -21,7 +21,6 @@ import java.util.concurrent.ConcurrentHashMap; import com.alipay.sofa.registry.common.model.store.URL; -import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.remoting.ChannelHandler; import com.alipay.sofa.registry.remoting.Client; import com.alipay.sofa.registry.remoting.Server; @@ -46,27 +45,12 @@ public Client connect(String serverType, URL serverUrl, ChannelHandler... channe } @Override - public Client connect(String serverType, int connNum, URL serverUrl, - ChannelHandler... channelHandlers) { + public Client connect(String serverType, int connNum, URL serverUrl, ChannelHandler... channelHandlers) { if (channelHandlers == null) { throw new IllegalArgumentException("channelHandlers cannot be null!"); } - Client client = clients.get(serverType); - if (client == null) { - BoltClient boltClient = createBoltClient(connNum); - boltClient.initHandlers(Arrays.asList(channelHandlers)); - boltClient.connect(serverUrl); - client = clients.putIfAbsent(serverType, boltClient); - if (client == null) { - client = boltClient; - } - } else { - Channel channel = client.getChannel(serverUrl); - if (channel == null) { - BoltClient boltClient = (BoltClient) client; - boltClient.connect(serverUrl); - } - } + Client client = clients.computeIfAbsent(serverType, key -> newBoltClient(connNum, channelHandlers)); + client.connect(serverUrl); return client; } @@ -101,6 +85,12 @@ public void setServer(Server server, URL url) { serverMap.putIfAbsent(url.getPort(), server); } + private BoltClient newBoltClient(int connNum, ChannelHandler[] channelHandlers) { + BoltClient boltClient = createBoltClient(connNum); + boltClient.initHandlers(Arrays.asList(channelHandlers)); + return boltClient; + } + protected BoltClient createBoltClient(int connNum) { return new BoltClient(connNum); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index 7b8a2d590..b783003f4 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -90,6 +90,7 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.DatumSnapshotHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataVersionsHandler; +import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.HeartbeatHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.PublishDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.RenewDatumHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.SessionServerRegisterHandler; @@ -218,6 +219,7 @@ public Collection serverHandlers() { list.add(dataServerConnectionHandler()); list.add(renewDatumHandler()); list.add(datumSnapshotHandler()); + list.add(heartbeatHandler()); return list; } @@ -296,6 +298,11 @@ public AbstractServerHandler sessionServerRegisterHandler() { return new SessionServerRegisterHandler(); } + @Bean + public AbstractServerHandler heartbeatHandler() { + return new HeartbeatHandler(); + } + @Bean public AbstractServerHandler unPublishDataHandler() { return new UnPublishDataHandler(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java new file mode 100644 index 000000000..f12ba3a25 --- /dev/null +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; + +import com.alipay.sofa.registry.common.model.CommonResponse; +import com.alipay.sofa.registry.common.model.Node; +import com.alipay.sofa.registry.common.model.dataserver.HeartbeatRequest; +import com.alipay.sofa.registry.remoting.Channel; +import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; + +/** + * + * @author kezhu.wukz + * @version $Id: HeartbeatHandler.java, v 0.1 2019年11月24日 17:32 kezhu.wukz Exp $ + */ +public class HeartbeatHandler extends AbstractServerHandler { + + @Override + public void checkParam(HeartbeatRequest request) throws RuntimeException { + } + + @Override + public Object doHandle(Channel channel, HeartbeatRequest request) { + return CommonResponse.buildSuccessResponse(); + } + + @Override + public CommonResponse buildFailedResponse(String msg) { + return CommonResponse.buildFailedResponse(msg); + } + + @Override + public HandlerType getType() { + return HandlerType.PROCESSER; + } + + @Override + public Class interest() { + return HeartbeatRequest.class; + } + + @Override + protected Node.NodeType getConnectNodeType() { + return Node.NodeType.DATA; + } +} \ No newline at end of file From 28201d33597b4591393cc08a9ce860f612d0d2ec Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 28 Nov 2019 22:44:28 +0800 Subject: [PATCH 147/161] refactor TaskListener and use map instead of list in DefaultTaskListenerManager; refactor getSingleTaskDispatcher() --- .../listener/DefaultTaskListenerManager.java | 18 +++--- .../registry/task/listener/TaskEvent.java | 64 ++++++++++--------- .../registry/task/listener/TaskListener.java | 7 +- .../task/listener/TaskListenerManager.java | 5 +- .../task/listener/TaskListenerTest.java | 20 +++--- .../DataNodeChangePushTaskListener.java | 7 +- ...rsistenceDataChangeNotifyTaskListener.java | 7 +- ...eceiveStatusConfirmNotifyTaskListener.java | 7 +- .../SessionNodeChangePushTaskListener.java | 7 +- .../DataNodeChangePushTaskListenerMock.java | 14 ++-- .../ReceiveStatusConfirmNotifyTaskMock.java | 4 +- .../SessionNodeChangePushTaskMock.java | 14 ++-- .../listener/CancelDataTaskListener.java | 24 +++---- .../DataChangeFetchCloudTaskListener.java | 36 ++++++----- .../listener/DataChangeFetchTaskListener.java | 43 ++++++++----- .../listener/DataPushTaskListener.java | 27 ++++---- .../listener/DatumSnapshotTaskListener.java | 4 +- .../ProvideDataChangeFetchTaskListener.java | 21 +++--- .../listener/PublishDataTaskListener.java | 7 +- .../ReceivedConfigDataPushTaskListener.java | 26 +++++--- .../ReceivedDataMultiPushTaskListener.java | 4 +- .../listener/RenewDatumTaskListener.java | 11 ++-- .../SessionRegisterDataTaskListener.java | 22 +++---- .../SubscriberMultiFetchTaskListener.java | 23 +++---- .../SubscriberPushEmptyTaskListener.java | 23 +++---- .../SubscriberRegisterFetchTaskListener.java | 23 +++---- .../listener/UnPublishDataTaskListener.java | 27 +------- .../WatcherRegisterFetchTaskListener.java | 27 +++++--- 28 files changed, 278 insertions(+), 244 deletions(-) diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/DefaultTaskListenerManager.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/DefaultTaskListenerManager.java index 8e6b23077..a0aa07b2f 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/DefaultTaskListenerManager.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/DefaultTaskListenerManager.java @@ -16,33 +16,35 @@ */ package com.alipay.sofa.registry.task.listener; -import java.util.ArrayList; import java.util.Collection; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; + /** * @author xuanbei * @since 2018/12/28 */ public class DefaultTaskListenerManager implements TaskListenerManager { - private Collection taskListeners = new ArrayList<>(); + + private Multimap taskListeners = ArrayListMultimap.create(); @Override - public Collection getTaskListeners() { + public Multimap getTaskListeners() { return taskListeners; } @Override public void addTaskListener(TaskListener taskListener) { - taskListeners.add(taskListener); + taskListeners.put(taskListener.support(), taskListener); } @Override public void sendTaskEvent(TaskEvent taskEvent) { - + Collection taskListeners = this.taskListeners.get(taskEvent.getTaskType()); for (TaskListener taskListener : taskListeners) { - if (taskListener.support(taskEvent)) { - taskListener.handleEvent(taskEvent); - } + taskListener.handleEvent(taskEvent); } } } diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java index d081446b9..7b505d878 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskEvent.java @@ -17,8 +17,8 @@ package com.alipay.sofa.registry.task.listener; import java.util.Map; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import com.alipay.sofa.registry.task.TaskClosure; @@ -31,36 +31,39 @@ public class TaskEvent { public enum TaskType { //Session task - SUBSCRIBER_REGISTER_FETCH_TASK("SubscriberRegisterFetchTask"), SUBSCRIBER_PUSH_EMPTY_TASK( - "SubscriberPushEmptyTask"), WATCHER_REGISTER_FETCH_TASK( - "WatcherRegisterFetchTask"), DATA_CHANGE_FETCH_TASK( - "DataChangeFetchTask"), DATA_PUSH_TASK( - "DataPushTask"), DATA_CHANGE_FETCH_CLOUD_TASK( - "DataChangeFetchCloudTask"), RECEIVED_DATA_MULTI_PUSH_TASK( - "ReceivedDataMultiPushTask"), RECEIVED_DATA_CONFIG_PUSH_TASK( - "ReceivedDataConfigPushTask"), CANCEL_DATA_TASK( - "CancelDataTask"), SYNC_PUBLISHER_TASK( - "SyncPublisherTask"), SYNC_SUBSCRIBER_TASK( - "SyncSubscriberTask"), SESSION_REGISTER_DATA_TASK( - "SessionRegisterDataTask"), PROVIDE_DATA_CHANGE_FETCH_TASK( - "ProvideDataChangeFetchTask"), SUBSCRIBER_MULTI_FETCH_TASK( - "SubscriberMultiFetchTask"), PUBLISH_DATA_TASK( - "PublishDataTask"), UN_PUBLISH_DATA_TASK( - "UnPublishDataTask"), RENEW_DATUM_TASK( - "RenewDatumTask"), DATUM_SNAPSHOT_TASK( - "DatumSnapshotTask"), + SUBSCRIBER_REGISTER_FETCH_TASK("SubscriberRegisterFetchTask"), // + SUBSCRIBER_PUSH_EMPTY_TASK("SubscriberPushEmptyTask"), // + WATCHER_REGISTER_FETCH_TASK("WatcherRegisterFetchTask"), // + DATA_CHANGE_FETCH_TASK("DataChangeFetchTask"), // + DATA_PUSH_TASK("DataPushTask"), // + DATA_CHANGE_FETCH_CLOUD_TASK("DataChangeFetchCloudTask"), // + RECEIVED_DATA_MULTI_PUSH_TASK("ReceivedDataMultiPushTask"), // + RECEIVED_DATA_CONFIG_PUSH_TASK("ReceivedDataConfigPushTask"), // + CANCEL_DATA_TASK("CancelDataTask"), // + SYNC_PUBLISHER_TASK("SyncPublisherTask"), // + SYNC_SUBSCRIBER_TASK("SyncSubscriberTask"), // + SESSION_REGISTER_DATA_TASK("SessionRegisterDataTask"), // + PROVIDE_DATA_CHANGE_FETCH_TASK("ProvideDataChangeFetchTask"), // + SUBSCRIBER_MULTI_FETCH_TASK("SubscriberMultiFetchTask"), // + PUBLISH_DATA_TASK("PublishDataTask"), // + UN_PUBLISH_DATA_TASK("UnPublishDataTask"), // + RENEW_DATUM_TASK("RenewDatumTask"), // + DATUM_SNAPSHOT_TASK("DatumSnapshotTask"), // //Session Adapter task - USER_DATA_ELEMENT_PUSH_TASK("UserDataElementPushTask"), USER_DATA_ELEMENT_MULTI_PUSH_TASK( - "UserDataElementMultiPushTask"), + USER_DATA_ELEMENT_PUSH_TASK("UserDataElementPushTask"), // + USER_DATA_ELEMENT_MULTI_PUSH_TASK("UserDataElementMultiPushTask"), // //MetaServer task - SESSION_NODE_CHANGE_PUSH_TASK("SessionNodeChangePushTask"), DATA_NODE_CHANGE_PUSH_TASK( - "DataNodeChangePushTask"), RECEIVE_STATUS_CONFIRM_NOTIFY_TASK( - "ReceiveStatusConfirmNotifyTask"), PERSISTENCE_DATA_CHANGE_NOTIFY_TASK( - "PersistenceDataChangeNotifyTask"), ; + SESSION_NODE_CHANGE_PUSH_TASK("SessionNodeChangePushTask"), // + DATA_NODE_CHANGE_PUSH_TASK("DataNodeChangePushTask"), // + RECEIVE_STATUS_CONFIRM_NOTIFY_TASK("ReceiveStatusConfirmNotifyTask"), // + PERSISTENCE_DATA_CHANGE_NOTIFY_TASK("PersistenceDataChangeNotifyTask"), // + ; - private String name; + private String name; + + private AtomicInteger nextId = new AtomicInteger(0); TaskType(String name) { this.name = name; @@ -83,7 +86,7 @@ public String getName() { private final String taskId; - private final Map attributes = new ConcurrentHashMap(); + private final Map attributes = new ConcurrentHashMap(); /** * constructor @@ -92,7 +95,8 @@ public String getName() { public TaskEvent(TaskType taskType) { this.taskType = taskType; this.createTime = System.currentTimeMillis(); - taskId = UUID.randomUUID().toString(); + this.taskId = String.format("%s-%s-%s", taskType.name, this.createTime, + taskType.nextId.getAndIncrement()); } /** @@ -101,10 +105,8 @@ public TaskEvent(TaskType taskType) { * @param taskType */ public TaskEvent(Object eventObj, TaskType taskType) { + this(taskType); this.eventObj = eventObj; - this.taskType = taskType; - this.createTime = System.currentTimeMillis(); - taskId = UUID.randomUUID().toString(); } /** diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListener.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListener.java index 547d3b154..5601031eb 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListener.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.task.listener; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; + /** * * @author shangyu.wh @@ -26,10 +28,9 @@ public interface TaskListener { /** * com.alipay.sofa.registry.server.meta.listener type check * - * @param event - * @return true or false。 + * @return type */ - boolean support(TaskEvent event); + TaskType support(); /** * event execute diff --git a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListenerManager.java b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListenerManager.java index dc19c661d..58be148f8 100644 --- a/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListenerManager.java +++ b/server/common/util/src/main/java/com/alipay/sofa/registry/task/listener/TaskListenerManager.java @@ -16,7 +16,8 @@ */ package com.alipay.sofa.registry.task.listener; -import java.util.Collection; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; +import com.google.common.collect.Multimap; /** * @@ -29,7 +30,7 @@ public interface TaskListenerManager { * * @return */ - Collection getTaskListeners(); + Multimap getTaskListeners(); /** * diff --git a/server/common/util/src/test/java/com/alipay/sofa/registry/task/listener/TaskListenerTest.java b/server/common/util/src/test/java/com/alipay/sofa/registry/task/listener/TaskListenerTest.java index 9443f5d44..1e7d0acd5 100644 --- a/server/common/util/src/test/java/com/alipay/sofa/registry/task/listener/TaskListenerTest.java +++ b/server/common/util/src/test/java/com/alipay/sofa/registry/task/listener/TaskListenerTest.java @@ -16,13 +16,15 @@ */ package com.alipay.sofa.registry.task.listener; +import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.CANCEL_DATA_TASK; +import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.DATA_PUSH_TASK; +import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.WATCHER_REGISTER_FETCH_TASK; + import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.CANCEL_DATA_TASK; -import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.DATA_PUSH_TASK; -import static com.alipay.sofa.registry.task.listener.TaskEvent.TaskType.WATCHER_REGISTER_FETCH_TASK; +import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; /** * @author xuanbei @@ -65,8 +67,8 @@ public void doTest() { private static class DataPushTaskListener implements TaskListener { @Override - public boolean support(TaskEvent event) { - return DATA_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return DATA_PUSH_TASK; } @Override @@ -77,8 +79,8 @@ public void handleEvent(TaskEvent event) { private static class CancelDataTaskListener implements TaskListener { @Override - public boolean support(TaskEvent event) { - return TaskEvent.TaskType.CANCEL_DATA_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.CANCEL_DATA_TASK; } @Override @@ -89,8 +91,8 @@ public void handleEvent(TaskEvent event) { private static class WatcherRegisterFetchTaskListener implements TaskListener { @Override - public boolean support(TaskEvent event) { - return TaskEvent.TaskType.WATCHER_REGISTER_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.WATCHER_REGISTER_FETCH_TASK; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/DataNodeChangePushTaskListener.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/DataNodeChangePushTaskListener.java index a146d7721..de336874f 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/DataNodeChangePushTaskListener.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/DataNodeChangePushTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.meta.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerConfig; import com.alipay.sofa.registry.server.meta.task.Constant; @@ -27,7 +29,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -57,8 +58,8 @@ public DataNodeChangePushTaskListener(TaskProcessor dataNodeSingleTaskProcessor) } @Override - public boolean support(TaskEvent event) { - return TaskType.DATA_NODE_CHANGE_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATA_NODE_CHANGE_PUSH_TASK; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/PersistenceDataChangeNotifyTaskListener.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/PersistenceDataChangeNotifyTaskListener.java index f2e5714ed..b72725e4f 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/PersistenceDataChangeNotifyTaskListener.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/PersistenceDataChangeNotifyTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.meta.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerConfig; import com.alipay.sofa.registry.server.meta.task.MetaServerTask; import com.alipay.sofa.registry.server.meta.task.PersistenceDataChangeNotifyTask; @@ -25,7 +27,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -49,8 +50,8 @@ public PersistenceDataChangeNotifyTaskListener(TaskProcessor sessionNodeSingleTa } @Override - public boolean support(TaskEvent event) { - return TaskType.PERSISTENCE_DATA_CHANGE_NOTIFY_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.PERSISTENCE_DATA_CHANGE_NOTIFY_TASK; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/ReceiveStatusConfirmNotifyTaskListener.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/ReceiveStatusConfirmNotifyTaskListener.java index 66b8dbe6b..d910d247f 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/ReceiveStatusConfirmNotifyTaskListener.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/ReceiveStatusConfirmNotifyTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.meta.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerConfig; import com.alipay.sofa.registry.server.meta.node.DataNodeService; import com.alipay.sofa.registry.server.meta.node.NodeService; @@ -27,7 +29,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -53,8 +54,8 @@ public ReceiveStatusConfirmNotifyTaskListener(TaskProcessor dataNodeSingleTaskPr } @Override - public boolean support(TaskEvent event) { - return TaskType.RECEIVE_STATUS_CONFIRM_NOTIFY_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.RECEIVE_STATUS_CONFIRM_NOTIFY_TASK; } @Override diff --git a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/SessionNodeChangePushTaskListener.java b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/SessionNodeChangePushTaskListener.java index 24dd13e3a..fb7edd296 100644 --- a/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/SessionNodeChangePushTaskListener.java +++ b/server/server/meta/src/main/java/com/alipay/sofa/registry/server/meta/listener/SessionNodeChangePushTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.meta.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.meta.bootstrap.MetaServerConfig; import com.alipay.sofa.registry.server.meta.task.MetaServerTask; import com.alipay.sofa.registry.server.meta.task.SessionNodeChangePushTask; @@ -25,7 +27,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -49,8 +50,8 @@ public SessionNodeChangePushTaskListener(TaskProcessor sessionNodeSingleTaskProc } @Override - public boolean support(TaskEvent event) { - return TaskType.SESSION_NODE_CHANGE_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SESSION_NODE_CHANGE_PUSH_TASK; } @Override diff --git a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/DataNodeChangePushTaskListenerMock.java b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/DataNodeChangePushTaskListenerMock.java index 162df86cd..609415090 100644 --- a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/DataNodeChangePushTaskListenerMock.java +++ b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/DataNodeChangePushTaskListenerMock.java @@ -16,6 +16,11 @@ */ package com.alipay.sofa.registry.server.meta.test.confirm; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.metaserver.DataNode; import com.alipay.sofa.registry.server.meta.store.DataStoreService; @@ -24,11 +29,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - /** * * @author shangyu.wh @@ -47,8 +47,8 @@ public DataNodeChangePushTaskListenerMock(DataStoreService dataStoreService, } @Override - public boolean support(TaskEvent event) { - return TaskType.DATA_NODE_CHANGE_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATA_NODE_CHANGE_PUSH_TASK; } @Override diff --git a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/ReceiveStatusConfirmNotifyTaskMock.java b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/ReceiveStatusConfirmNotifyTaskMock.java index bbdf33c62..5d2dcc302 100644 --- a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/ReceiveStatusConfirmNotifyTaskMock.java +++ b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/ReceiveStatusConfirmNotifyTaskMock.java @@ -34,8 +34,8 @@ public class ReceiveStatusConfirmNotifyTaskMock implements TaskListener { ReceiveStatusConfirmNotifyTaskMock.class, "[Task]"); @Override - public boolean support(TaskEvent event) { - return TaskType.RECEIVE_STATUS_CONFIRM_NOTIFY_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.RECEIVE_STATUS_CONFIRM_NOTIFY_TASK; } @Override diff --git a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/SessionNodeChangePushTaskMock.java b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/SessionNodeChangePushTaskMock.java index 8861c623a..35f5e4840 100644 --- a/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/SessionNodeChangePushTaskMock.java +++ b/server/server/meta/src/test/java/com/alipay/sofa/registry/server/meta/test/confirm/SessionNodeChangePushTaskMock.java @@ -16,6 +16,11 @@ */ package com.alipay.sofa.registry.server.meta.test.confirm; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import com.alipay.sofa.registry.common.model.metaserver.SessionNode; import com.alipay.sofa.registry.server.meta.store.SessionStoreService; import com.alipay.sofa.registry.server.meta.task.Constant; @@ -23,11 +28,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - /** * * @author shangyu.wh @@ -46,8 +46,8 @@ public SessionNodeChangePushTaskMock(SessionStoreService sessionStoreService, } @Override - public boolean support(TaskEvent event) { - return TaskType.SESSION_NODE_CHANGE_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SESSION_NODE_CHANGE_PUSH_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/CancelDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/CancelDataTaskListener.java index 0bae12a2e..0197fd8b5 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/CancelDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/CancelDataTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.CancelDataTask; @@ -29,7 +33,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -67,18 +70,16 @@ public class CancelDataTaskListener implements TaskListener { @Autowired private TaskProcessor dataNodeSingleTaskProcessor; - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.CANCEL_DATA_TASK.getName()), 10000, 80, - 1000, 100, dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.CANCEL_DATA_TASK.getName()), 10000, 80, + 1000, 100, dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.CANCEL_DATA_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.CANCEL_DATA_TASK; } @Override @@ -88,7 +89,8 @@ public void handleEvent(TaskEvent event) { sessionWatchers, dataNodeService, sessionServerConfig); cancelDataTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(cancelDataTask.getTaskId(), cancelDataTask, + singleTaskDispatcher.dispatch(cancelDataTask.getTaskId(), cancelDataTask, cancelDataTask.getExpiryTime()); } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchCloudTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchCloudTaskListener.java index e558c98f5..65674b062 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchCloudTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchCloudTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; @@ -29,7 +31,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -39,26 +40,26 @@ public class DataChangeFetchCloudTaskListener implements TaskListener { @Autowired - private Interests sessionInterests; + private Interests sessionInterests; @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; @Autowired - private ExecutorManager executorManager; + private ExecutorManager executorManager; @Autowired - private CacheService sessionCacheService; + private CacheService sessionCacheService; - private TaskDispatcher singleTaskDispatcher; + private volatile TaskDispatcher singleTaskDispatcher; - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; public DataChangeFetchCloudTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; @@ -66,18 +67,22 @@ public DataChangeFetchCloudTaskListener(TaskProcessor dataNodeSingleTaskProcesso public TaskDispatcher getSingleTaskDispatcher() { if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.DATA_CHANGE_FETCH_CLOUD_TASK.getName()), - sessionServerConfig.getDataChangeFetchTaskMaxBufferSize(), - sessionServerConfig.getDataChangeFetchTaskWorkerSize(), 1000, 100, - dataNodeSingleTaskProcessor); + synchronized (this) { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.DATA_CHANGE_FETCH_CLOUD_TASK + .getName()), sessionServerConfig.getDataChangeFetchTaskMaxBufferSize(), + sessionServerConfig.getDataChangeFetchTaskWorkerSize(), 1000, 100, + dataNodeSingleTaskProcessor); + } + } } return singleTaskDispatcher; } @Override - public boolean support(TaskEvent event) { - return TaskType.DATA_CHANGE_FETCH_CLOUD_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATA_CHANGE_FETCH_CLOUD_TASK; } @Override @@ -88,4 +93,5 @@ public void handleEvent(TaskEvent event) { getSingleTaskDispatcher().dispatch(dataChangeFetchTask.getTaskId(), dataChangeFetchTask, dataChangeFetchTask.getExpiryTime()); } + } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchTaskListener.java index 434e6a61c..a2517509a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataChangeFetchTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; @@ -29,7 +33,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -38,27 +41,30 @@ */ public class DataChangeFetchTaskListener implements TaskListener { + private final static Logger LOGGER = LoggerFactory + .getLogger(DataChangeFetchTaskListener.class); + @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Interests sessionInterests; + private Interests sessionInterests; @Autowired - private ExecutorManager executorManager; + private ExecutorManager executorManager; @Autowired - private CacheService sessionCacheService; + private CacheService sessionCacheService; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; - private TaskDispatcher singleTaskDispatcher; + private volatile TaskDispatcher singleTaskDispatcher; - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; public DataChangeFetchTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; @@ -66,18 +72,23 @@ public DataChangeFetchTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { public TaskDispatcher getSingleTaskDispatcher() { if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.DATA_CHANGE_FETCH_TASK.getName()), - sessionServerConfig.getDataChangeFetchTaskMaxBufferSize(), - sessionServerConfig.getDataChangeFetchTaskWorkerSize(), 1000, 100, - dataNodeSingleTaskProcessor); + synchronized (this) { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers + .createSingleTaskDispatcher(TaskDispatchers + .getDispatcherName(TaskType.DATA_CHANGE_FETCH_TASK.getName()), + sessionServerConfig.getDataChangeFetchTaskMaxBufferSize(), + sessionServerConfig.getDataChangeFetchTaskWorkerSize(), 1000, 100, + dataNodeSingleTaskProcessor); + } + } } return singleTaskDispatcher; } @Override - public boolean support(TaskEvent event) { - return TaskType.DATA_CHANGE_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATA_CHANGE_FETCH_TASK; } @Override @@ -85,8 +96,10 @@ public void handleEvent(TaskEvent event) { SessionTask dataChangeFetchTask = new DataChangeFetchTask(sessionServerConfig, taskListenerManager, executorManager, sessionInterests, sessionCacheService); dataChangeFetchTask.setTaskEvent(event); + getSingleTaskDispatcher().dispatch(dataChangeFetchTask.getTaskId(), dataChangeFetchTask, dataChangeFetchTask.getExpiryTime()); + } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataPushTaskListener.java index c1afe3314..f27db140e 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DataPushTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.task.DataPushTask; @@ -28,7 +30,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -38,23 +39,23 @@ public class DataPushTaskListener implements TaskListener { @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private Interests sessionInterests; + private Interests sessionInterests; /** * trigger task com.alipay.sofa.registry.server.meta.listener process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; @Autowired - private ExecutorManager executorManager; + private ExecutorManager executorManager; - private TaskDispatcher singleTaskDispatcher; + private volatile TaskDispatcher singleTaskDispatcher; - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; public DataPushTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { @@ -63,15 +64,19 @@ public DataPushTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { public TaskDispatcher getSingleTaskDispatcher() { if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( - TaskType.DATA_PUSH_TASK.getName(), dataNodeSingleTaskProcessor); + synchronized (this) { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( + TaskType.DATA_PUSH_TASK.getName(), dataNodeSingleTaskProcessor); + } + } } return singleTaskDispatcher; } @Override - public boolean support(TaskEvent event) { - return TaskType.DATA_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATA_PUSH_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java index be81dc7d0..b86795cba 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/DatumSnapshotTaskListener.java @@ -53,8 +53,8 @@ public void init() { } @Override - public boolean support(TaskEvent event) { - return TaskType.DATUM_SNAPSHOT_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.DATUM_SNAPSHOT_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java index 91fa6127a..234030672 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ProvideDataChangeFetchTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.remoting.exchange.Exchange; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; @@ -30,7 +34,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -71,17 +74,15 @@ public ProvideDataChangeFetchTaskListener(TaskProcessor dataNodeSingleTaskProces this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; } - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( - TaskType.PROVIDE_DATA_CHANGE_FETCH_TASK.getName(), dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( + TaskType.PROVIDE_DATA_CHANGE_FETCH_TASK.getName(), dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.PROVIDE_DATA_CHANGE_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.PROVIDE_DATA_CHANGE_FETCH_TASK; } @Override @@ -93,7 +94,7 @@ public void handleEvent(TaskEvent event) { provideDataChangeFetchTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(provideDataChangeFetchTask.getTaskId(), + singleTaskDispatcher.dispatch(provideDataChangeFetchTask.getTaskId(), provideDataChangeFetchTask, provideDataChangeFetchTask.getExpiryTime()); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java index e2d0f7ef8..5b5d8be7d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/PublishDataTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.scheduler.task.PublishDataTask; @@ -24,7 +26,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -43,8 +44,8 @@ public class PublishDataTaskListener implements TaskListener { private ExecutorManager executorManager; @Override - public boolean support(TaskEvent event) { - return TaskType.PUBLISH_DATA_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.PUBLISH_DATA_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedConfigDataPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedConfigDataPushTaskListener.java index 17cc54b5e..5103ae201 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedConfigDataPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedConfigDataPushTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.ClientNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.ReceivedConfigDataPushTask; @@ -27,7 +29,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -37,17 +38,17 @@ public class ReceivedConfigDataPushTaskListener implements TaskListener { @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; @Autowired - private ClientNodeService clientNodeService; + private ClientNodeService clientNodeService; @Autowired - private ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy; + private ReceivedConfigDataPushTaskStrategy receivedConfigDataPushTaskStrategy; - private TaskDispatcher singleTaskDispatcher; + private volatile TaskDispatcher singleTaskDispatcher; - private TaskProcessor clientNodeSingleTaskProcessor; + private TaskProcessor clientNodeSingleTaskProcessor; public ReceivedConfigDataPushTaskListener(TaskProcessor clientNodeSingleTaskProcessor) { @@ -56,15 +57,20 @@ public ReceivedConfigDataPushTaskListener(TaskProcessor clientNodeSingleTaskProc public TaskDispatcher getSingleTaskDispatcher() { if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( - TaskType.RECEIVED_DATA_CONFIG_PUSH_TASK.getName(), clientNodeSingleTaskProcessor); + synchronized (this) { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( + TaskType.RECEIVED_DATA_CONFIG_PUSH_TASK.getName(), + clientNodeSingleTaskProcessor); + } + } } return singleTaskDispatcher; } @Override - public boolean support(TaskEvent event) { - return TaskType.RECEIVED_DATA_CONFIG_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.RECEIVED_DATA_CONFIG_PUSH_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java index 93a706bc5..3d036f647 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/ReceivedDataMultiPushTaskListener.java @@ -106,8 +106,8 @@ public void executionFailed(Throwable e) { } @Override - public boolean support(TaskEvent event) { - return TaskType.RECEIVED_DATA_MULTI_PUSH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.RECEIVED_DATA_MULTI_PUSH_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java index a5f497090..d1624659d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/RenewDatumTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.registry.SessionRegistry; @@ -27,9 +31,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; /** * @@ -60,8 +61,8 @@ public void init() { } @Override - public boolean support(TaskEvent event) { - return TaskType.RENEW_DATUM_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.RENEW_DATUM_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java index 717e365cf..2cec75755 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SessionRegisterDataTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Autowired; import com.alipay.sofa.registry.remoting.exchange.Exchange; @@ -51,18 +53,16 @@ public SessionRegisterDataTaskListener(TaskProcessor dataNodeSingleTaskProcessor this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; } - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.SESSION_REGISTER_DATA_TASK.getName()), - 60, 5, 1000, 100, dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.SESSION_REGISTER_DATA_TASK.getName()), 60, + 5, 1000, 100, dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.SESSION_REGISTER_DATA_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SESSION_REGISTER_DATA_TASK; } @Override @@ -70,7 +70,7 @@ public void handleEvent(TaskEvent event) { SessionTask sessionRegisterDataTask = new SessionRegisterDataTask(boltExchange, sessionServerConfig); sessionRegisterDataTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(sessionRegisterDataTask.getTaskId(), - sessionRegisterDataTask, sessionRegisterDataTask.getExpiryTime()); + singleTaskDispatcher.dispatch(sessionRegisterDataTask.getTaskId(), sessionRegisterDataTask, + sessionRegisterDataTask.getExpiryTime()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberMultiFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberMultiFetchTaskListener.java index 773e5e367..827f20fab 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberMultiFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberMultiFetchTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; @@ -28,7 +32,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -61,18 +64,16 @@ public SubscriberMultiFetchTaskListener(TaskProcessor dataNodeSingleTaskProcesso this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; } - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( - TaskDispatchers.getDispatcherName(TaskType.SUBSCRIBER_MULTI_FETCH_TASK.getName()), - 100000, 80, 0, 0, dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.SUBSCRIBER_MULTI_FETCH_TASK.getName()), + 100000, 80, 0, 0, dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.SUBSCRIBER_MULTI_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SUBSCRIBER_MULTI_FETCH_TASK; } @Override @@ -83,7 +84,7 @@ public void handleEvent(TaskEvent event) { subscriberMultiFetchTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(subscriberMultiFetchTask.getTaskId(), + singleTaskDispatcher.dispatch(subscriberMultiFetchTask.getTaskId(), subscriberMultiFetchTask, subscriberMultiFetchTask.getExpiryTime()); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java index 955af4062..d3b36e119 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberPushEmptyTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.server.session.scheduler.task.SubscriberPushEmptyTask; @@ -26,7 +30,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -49,17 +52,15 @@ public class SubscriberPushEmptyTaskListener implements TaskListener { @Autowired private TaskProcessor dataNodeSingleTaskProcessor; - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( - TaskType.SUBSCRIBER_PUSH_EMPTY_TASK.getName(), dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( + TaskType.SUBSCRIBER_PUSH_EMPTY_TASK.getName(), dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.SUBSCRIBER_PUSH_EMPTY_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SUBSCRIBER_PUSH_EMPTY_TASK; } @Override @@ -70,8 +71,8 @@ public void handleEvent(TaskEvent event) { subscriberPushEmptyTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(subscriberPushEmptyTask.getTaskId(), - subscriberPushEmptyTask, subscriberPushEmptyTask.getExpiryTime()); + singleTaskDispatcher.dispatch(subscriberPushEmptyTask.getTaskId(), subscriberPushEmptyTask, + subscriberPushEmptyTask.getExpiryTime()); } } \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberRegisterFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberRegisterFetchTaskListener.java index 68b66cf63..6feb653a2 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberRegisterFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/SubscriberRegisterFetchTaskListener.java @@ -16,6 +16,10 @@ */ package com.alipay.sofa.registry.server.session.listener; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.cache.CacheService; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; @@ -29,7 +33,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -67,18 +70,16 @@ public SubscriberRegisterFetchTaskListener(TaskProcessor dataNodeSingleTaskProce this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; } - public TaskDispatcher getSingleTaskDispatcher() { - if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher(TaskDispatchers - .getDispatcherName(TaskType.SUBSCRIBER_REGISTER_FETCH_TASK.getName()), 200000, 80, - 1000, 100, dataNodeSingleTaskProcessor); - } - return singleTaskDispatcher; + @PostConstruct + public void init() { + singleTaskDispatcher = TaskDispatchers.createSingleTaskDispatcher( + TaskDispatchers.getDispatcherName(TaskType.SUBSCRIBER_REGISTER_FETCH_TASK.getName()), + 200000, 80, 1000, 100, dataNodeSingleTaskProcessor); } @Override - public boolean support(TaskEvent event) { - return TaskType.SUBSCRIBER_REGISTER_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.SUBSCRIBER_REGISTER_FETCH_TASK; } @Override @@ -90,7 +91,7 @@ public void handleEvent(TaskEvent event) { subscriberRegisterFetchTask.setTaskEvent(event); - getSingleTaskDispatcher().dispatch(subscriberRegisterFetchTask.getTaskId(), + singleTaskDispatcher.dispatch(subscriberRegisterFetchTask.getTaskId(), subscriberRegisterFetchTask, subscriberRegisterFetchTask.getExpiryTime()); } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java index 566910f07..d8a4fa35d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/UnPublishDataTaskListener.java @@ -20,13 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired; -import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; import com.alipay.sofa.registry.server.session.scheduler.task.UnPublishDataTask; -import com.alipay.sofa.registry.server.session.store.DataStore; -import com.alipay.sofa.registry.server.session.store.Interests; -import com.alipay.sofa.registry.server.session.store.Watchers; import com.alipay.sofa.registry.task.batcher.TaskDispatcher; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; import com.alipay.sofa.registry.task.batcher.TaskProcessor; @@ -40,31 +36,12 @@ * @version $Id: UnPublishDataTaskListener.java, v 0.1 2019-06-17 12:02 kezhu.wukz Exp $ */ public class UnPublishDataTaskListener implements TaskListener { - - /** - * store subscribers - */ - @Autowired - private Interests sessionInterests; - - /** - * store publishers - */ - @Autowired - private DataStore sessionDataStore; - - @Autowired - private Watchers sessionWatchers; - /** * transfer data to DataNode */ @Autowired private DataNodeService dataNodeService; - @Autowired - private SessionServerConfig sessionServerConfig; - private TaskDispatcher singleTaskDispatcher; @Autowired @@ -78,8 +55,8 @@ public void init() { } @Override - public boolean support(TaskEvent event) { - return TaskType.UN_PUBLISH_DATA_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.UN_PUBLISH_DATA_TASK; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/WatcherRegisterFetchTaskListener.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/WatcherRegisterFetchTaskListener.java index 68e4cd6f9..45e14542c 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/WatcherRegisterFetchTaskListener.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/listener/WatcherRegisterFetchTaskListener.java @@ -16,6 +16,8 @@ */ package com.alipay.sofa.registry.server.session.listener; +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; import com.alipay.sofa.registry.server.session.node.service.MetaNodeService; import com.alipay.sofa.registry.server.session.scheduler.task.SessionTask; @@ -27,7 +29,6 @@ import com.alipay.sofa.registry.task.listener.TaskEvent.TaskType; import com.alipay.sofa.registry.task.listener.TaskListener; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; /** * @@ -37,23 +38,23 @@ public class WatcherRegisterFetchTaskListener implements TaskListener { @Autowired - private SessionServerConfig sessionServerConfig; + private SessionServerConfig sessionServerConfig; /** * trigger push client process */ @Autowired - private TaskListenerManager taskListenerManager; + private TaskListenerManager taskListenerManager; /** * MetaNode service */ @Autowired - private MetaNodeService metaNodeService; + private MetaNodeService metaNodeService; - private TaskDispatcher singleTaskDispatcher; + private volatile TaskDispatcher singleTaskDispatcher; - private TaskProcessor dataNodeSingleTaskProcessor; + private TaskProcessor dataNodeSingleTaskProcessor; public WatcherRegisterFetchTaskListener(TaskProcessor dataNodeSingleTaskProcessor) { this.dataNodeSingleTaskProcessor = dataNodeSingleTaskProcessor; @@ -61,15 +62,21 @@ public WatcherRegisterFetchTaskListener(TaskProcessor dataNodeSingleTaskProcesso public TaskDispatcher getSingleTaskDispatcher() { if (singleTaskDispatcher == null) { - singleTaskDispatcher = TaskDispatchers.createDefaultSingleTaskDispatcher( - TaskType.WATCHER_REGISTER_FETCH_TASK.getName(), dataNodeSingleTaskProcessor); + synchronized (this) { + if (singleTaskDispatcher == null) { + singleTaskDispatcher = TaskDispatchers + .createDefaultSingleTaskDispatcher( + TaskType.WATCHER_REGISTER_FETCH_TASK.getName(), + dataNodeSingleTaskProcessor); + } + } } return singleTaskDispatcher; } @Override - public boolean support(TaskEvent event) { - return TaskType.WATCHER_REGISTER_FETCH_TASK.equals(event.getTaskType()); + public TaskType support() { + return TaskType.WATCHER_REGISTER_FETCH_TASK; } @Override From a65ffb93d607d4555980000ec8834ffa44675325 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Thu, 28 Nov 2019 22:45:25 +0800 Subject: [PATCH 148/161] =?UTF-8?q?DataChangeRequestHandler=EF=BC=9Aoptimi?= =?UTF-8?q?ze=20performance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootstrap/SessionServerBootstrap.java | 75 +++++-------------- .../bootstrap/SessionServerConfigBean.java | 10 +-- .../session/remoting/DataNodeExchanger.java | 26 ++++--- .../session/remoting/MetaNodeExchanger.java | 2 +- .../handler/DataChangeRequestHandler.java | 30 +++----- .../task/DataChangeFetchCloudTask.java | 3 + .../scheduler/task/DataChangeFetchTask.java | 26 ++++--- .../session/store/SessionDataStore.java | 7 +- .../session/store/SessionInterests.java | 2 - .../impl/DefaultSessionRegistryStrategy.java | 23 ++---- 10 files changed, 78 insertions(+), 126 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java index 6e4031539..0b2057bd9 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerBootstrap.java @@ -16,7 +16,20 @@ */ package com.alipay.sofa.registry.server.session.bootstrap; -import com.alipay.sofa.registry.common.model.Node; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Resource; +import javax.ws.rs.Path; +import javax.ws.rs.ext.Provider; + +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + import com.alipay.sofa.registry.common.model.constants.ValueConstants; import com.alipay.sofa.registry.common.model.metaserver.FetchProvideDataRequest; import com.alipay.sofa.registry.common.model.metaserver.NodeChangeResult; @@ -37,24 +50,9 @@ import com.alipay.sofa.registry.server.session.node.RaftClientManager; import com.alipay.sofa.registry.server.session.node.SessionProcessIdGenerator; import com.alipay.sofa.registry.server.session.provideData.ProvideDataProcessor; -import com.alipay.sofa.registry.server.session.registry.Registry; -import com.alipay.sofa.registry.server.session.remoting.handler.AbstractClientHandler; import com.alipay.sofa.registry.server.session.remoting.handler.AbstractServerHandler; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.task.batcher.TaskDispatchers; -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.util.CollectionUtils; - -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.ext.Provider; -import java.lang.annotation.Annotation; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * The type Session server bootstrap. @@ -81,18 +79,15 @@ public class SessionServerBootstrap { @Resource(name = "serverHandlers") private Collection serverHandlers; - @Resource(name = "dataClientHandlers") - private Collection dataClientHandlers; - - @Autowired - private NodeManager dataNodeManager; - @Autowired private NodeManager metaNodeManager; @Autowired protected NodeExchanger metaNodeExchanger; + @Autowired + private NodeExchanger dataNodeExchanger; + @Autowired private ResourceConfig jerseyResourceConfig; @@ -105,9 +100,6 @@ public class SessionServerBootstrap { @Autowired private BlacklistManager blacklistManager; - @Autowired - private Registry sessionRegistry; - @Autowired private ProvideDataProcessor provideDataProcessorManager; @@ -115,8 +107,6 @@ public class SessionServerBootstrap { private Server httpServer; - private Client dataClient; - private Client metaClient; private AtomicBoolean metaStart = new AtomicBoolean(false); @@ -172,7 +162,6 @@ private void doStop() { executorManager.stopScheduler(); TaskDispatchers.stopDefaultSingleTaskDispatcher(); - closeClients(); stopHttpServer(); stopServer(); } catch (Throwable e) { @@ -222,29 +211,7 @@ private void openSessionServer() { private void connectDataServer() { try { if (dataStart.compareAndSet(false, true)) { - Collection dataNodes = dataNodeManager.getDataCenterNodes(); - if (CollectionUtils.isEmpty(dataNodes)) { - dataNodeManager.getAllDataCenterNodes(); - dataNodes = dataNodeManager.getDataCenterNodes(); - } - if (!CollectionUtils.isEmpty(dataNodes)) { - for (Node dataNode : dataNodes) { - if (dataNode.getNodeUrl() == null - || dataNode.getNodeUrl().getIpAddress() == null) { - LOGGER - .error("get data node address error!url{}", dataNode.getNodeUrl()); - continue; - } - dataClient = boltExchange.connect( - Exchange.DATA_SERVER_TYPE, - sessionServerConfig.getDataClientConnNum(), - new URL(dataNode.getNodeUrl().getIpAddress(), sessionServerConfig - .getDataServerPort()), dataClientHandlers - .toArray(new ChannelHandler[dataClientHandlers.size()])); - } - LOGGER.info("Data server connected {} server! port:{}", dataNodes.size(), - sessionServerConfig.getDataServerPort()); - } + dataNodeExchanger.connectServer(); } } catch (Exception e) { dataStart.set(false); @@ -390,12 +357,6 @@ private void stopServer() { } } - private void closeClients() { - if (dataClient != null && !dataClient.isClosed()) { - dataClient.close(); - } - } - private void stopHttpServer() { if (httpServer != null && httpServer.isOpen()) { httpServer.close(); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 77ff68300..5f7430ebb 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -67,13 +67,13 @@ public class SessionServerConfigBean implements SessionServerConfig { private int schedulerConnectMetaFirstDelay = 5; - private int schedulerConnectMetaExpBackOffBound = 10; + private int schedulerConnectMetaExpBackOffBound = 5; - private int schedulerConnectDataTimeout = 3; + private int schedulerConnectDataTimeout = 10; - private int schedulerConnectDataFirstDelay = 3; + private int schedulerConnectDataFirstDelay = 10; - private int schedulerConnectDataExpBackOffBound = 10; + private int schedulerConnectDataExpBackOffBound = 5; private int schedulerCleanInvalidClientTimeOut = 3; @@ -137,7 +137,7 @@ public class SessionServerConfigBean implements SessionServerConfig { private long pushTaskExecutorKeepAliveTime = 60; - private int dataChangeExecutorMinPoolSize = 40; + private int dataChangeExecutorMinPoolSize = 100; private int dataChangeExecutorMaxPoolSize = 400; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index 706afa4f1..07675b04d 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.server.session.remoting; import java.util.Collection; +import java.util.StringJoiner; import javax.annotation.Resource; @@ -103,7 +104,7 @@ public Response request(Request request) throws RequestException { } @Override - public Client connectServer() { + public synchronized Client connectServer() { Collection dataNodes = dataNodeManager.getDataCenterNodes(); if (dataNodes == null || dataNodes.isEmpty()) { @@ -111,6 +112,9 @@ public Client connectServer() { dataNodes = dataNodeManager.getDataCenterNodes(); } + boolean connectedAll = true; + StringJoiner errorMsg = new StringJoiner(";"); + Client dataClient = null; for (Node dataNode : dataNodes) { if (dataNode.getNodeUrl() == null || dataNode.getNodeUrl().getIpAddress() == null) { @@ -123,20 +127,24 @@ public Client connectServer() { try { dataClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); if (dataClient == null) { - dataClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, url, + dataClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, + sessionServerConfig.getDataClientConnNum(), url, dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); + } else { + // make sure there are connections to DataServer + dataClient.connect(url); } } catch (Exception e) { - LOGGER.error("DataNode Exchanger connect DataServer error!url:" + url, e); + String msg = "DataNode Exchanger connect DataServer error!url:" + url; + LOGGER.error(msg, e); + connectedAll = false; + errorMsg.add(msg); continue; } + } - try { - // make sure there are connections to DataServer - dataClient.connect(url); - } catch (Exception e) { - LOGGER.error("DataNode Exchanger connect channel error!url:" + url, e); - } + if (!connectedAll) { + throw new RuntimeException("Data server connected server error: " + errorMsg.toString()); } return dataClient; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java index 6b6553e81..1d2274be7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/MetaNodeExchanger.java @@ -108,7 +108,7 @@ public Response request(Request request) throws RequestException { } @Override - public Client connectServer() { + public synchronized Client connectServer() { Collection nodes = metaNodeManager.getDataCenterNodes(); if (nodes == null || nodes.isEmpty()) { diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataChangeRequestHandler.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataChangeRequestHandler.java index bc70a50c9..cc1e4a509 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataChangeRequestHandler.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/handler/DataChangeRequestHandler.java @@ -16,25 +16,23 @@ */ package com.alipay.sofa.registry.server.session.remoting.handler; +import java.util.concurrent.Executor; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.Node.NodeType; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.remoting.Channel; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.cache.CacheService; -import com.alipay.sofa.registry.server.session.cache.DatumKey; -import com.alipay.sofa.registry.server.session.cache.Key; -import com.alipay.sofa.registry.server.session.cache.Key.KeyType; import com.alipay.sofa.registry.server.session.scheduler.ExecutorManager; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.DataChangeRequestHandlerStrategy; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.concurrent.Executor; /** * + * @author kezhu.wukz * @author shangyu.wh * @version $Id: DataChangeRequestHandler.java, v 0.1 2017-12-12 15:09 shangyu.wh Exp $ */ @@ -58,9 +56,6 @@ public class DataChangeRequestHandler extends AbstractClientHandler { @Autowired private ExecutorManager executorManager; - @Autowired - private CacheService sessionCacheService; - @Autowired private DataChangeRequestHandlerStrategy dataChangeRequestHandlerStrategy; @@ -81,24 +76,17 @@ public Executor getExecutor() { @Override public Object reply(Channel channel, Object message) { - - DataChangeRequest dataChangeRequest = (DataChangeRequest) message; - - dataChangeRequest.setDataCenter(dataChangeRequest.getDataCenter()); - dataChangeRequest.setDataInfoId(dataChangeRequest.getDataInfoId()); - - //update cache when change - sessionCacheService.invalidate(new Key(KeyType.OBJ, DatumKey.class.getName(), new DatumKey( - dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter()))); - if (sessionServerConfig.isStopPushSwitch()) { - LOGGER.info("Stop Push data with switch on,dataChangeRequest: {}", dataChangeRequest); return null; } + + DataChangeRequest dataChangeRequest = (DataChangeRequest) message; + try { boolean result = sessionInterests.checkInterestVersions( dataChangeRequest.getDataCenter(), dataChangeRequest.getDataInfoId(), dataChangeRequest.getVersion()); + if (!result) { return null; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java index 65532239a..502190b7b 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchCloudTask.java @@ -206,6 +206,9 @@ private Map getDatumsCache() { new DatumKey(fetchDataInfoId, dataCenter))). collect(Collectors.toList()); + // remove cache + keys.stream().forEach(key -> sessionCacheService.invalidate(key)); + Map values = null; try { values = sessionCacheService.getValues(keys); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 8b1cc633c..587885306 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -42,15 +51,6 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.DatumVersionUtil; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - /** * * @author shangyu.wh @@ -265,10 +265,15 @@ private Map> getCache(ScopeEnum scope } private Datum getDatumCache() { + // build key DatumKey datumKey = new DatumKey(dataChangeRequest.getDataInfoId(), dataChangeRequest.getDataCenter()); - Key key = new Key(KeyType.OBJ, datumKey.getClass().getName(), datumKey); + Key key = new Key(KeyType.OBJ, DatumKey.class.getName(), datumKey); + // remove cache + sessionCacheService.invalidate(key); + + // get from cache (it will fetch from backend server) Value value = null; try { value = sessionCacheService.getValue(key); @@ -326,7 +331,6 @@ public long getExpiryTime() { @Override public void setTaskEvent(TaskEvent taskEvent) { - //taskId create from event if (taskEvent.getTaskId() != null) { setTaskId(taskEvent.getTaskId()); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java index 4273dc622..aab15036a 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionDataStore.java @@ -121,15 +121,14 @@ public boolean deleteById(String registerId, String dataInfoId) { Map publishers = registry.get(dataInfoId); if (publishers == null) { - LOGGER.error( - "Delete failed because publisher is not registered for dataInfoId: {}", + LOGGER.warn("Delete failed because publisher is not registered for dataInfoId: {}", dataInfoId); return false; } else { Publisher publisherTodelete = publishers.remove(registerId); if (publisherTodelete == null) { - LOGGER.error( + LOGGER.warn( "Delete failed because publisher is not registered for registerId: {}", registerId); return false; @@ -191,7 +190,7 @@ public Publisher queryById(String registerId, String dataInfoId) { Map publishers = registry.get(dataInfoId); if (publishers == null) { - LOGGER.error("Publisher is not registered for dataInfoId: {}", dataInfoId); + LOGGER.warn("Publisher is not registered for dataInfoId: {}", dataInfoId); return null; } return publishers.get(registerId); diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java index 0048d35d3..a0ab91844 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/store/SessionInterests.java @@ -209,8 +209,6 @@ public boolean checkInterestVersions(String dataCenter, String dataInfoId, Long Map subscribers = interests.get(dataInfoId); if (subscribers == null || subscribers.isEmpty()) { - LOGGER.info("There are not Subscriber Existed! Who are interest with dataInfoId {} !", - dataInfoId); return false; } diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java index c68889f3e..e7ab95ae3 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/strategy/impl/DefaultSessionRegistryStrategy.java @@ -16,26 +16,25 @@ */ package com.alipay.sofa.registry.server.session.strategy.impl; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + import com.alipay.sofa.registry.common.model.store.Publisher; import com.alipay.sofa.registry.common.model.store.Subscriber; import com.alipay.sofa.registry.common.model.store.Watcher; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.server.session.bootstrap.SessionServerConfig; -import com.alipay.sofa.registry.server.session.cache.CacheService; -import com.alipay.sofa.registry.server.session.cache.DatumKey; -import com.alipay.sofa.registry.server.session.cache.Key; import com.alipay.sofa.registry.server.session.store.Interests; import com.alipay.sofa.registry.server.session.strategy.SessionRegistryStrategy; import com.alipay.sofa.registry.task.listener.TaskEvent; import com.alipay.sofa.registry.task.listener.TaskListenerManager; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; /** + * @author kezhu.wukz * @author xuanbei * @since 2019/2/15 */ @@ -61,9 +60,6 @@ public class DefaultSessionRegistryStrategy implements SessionRegistryStrategy { @Autowired private SessionServerConfig sessionServerConfig; - @Autowired - private CacheService sessionCacheService; - @Override public void doFetchChangDataProcess(Map> dataInfoIdVersions) { //diff dataCenter same dataInfoId sent once fetch on cloud mode @@ -72,11 +68,6 @@ public void doFetchChangDataProcess(Map { if (checkInterestVersions(dataCenter, dataInfoID, version)) { - - //update cache - sessionCacheService.invalidate(new Key( - Key.KeyType.OBJ, DatumKey.class.getName(), new DatumKey(dataInfoID, dataCenter))); - changeDataInfoIds.add(dataInfoID); } }); From f235e52342c9801f03556cfd9a6f8fb4f7265fbb Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 29 Nov 2019 20:12:27 +0800 Subject: [PATCH 149/161] =?UTF-8?q?refactor=EF=BC=9A=20Heartbeat=20between?= =?UTF-8?q?=20session=20and=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alipay/sofa/registry/remoting/Client.java | 8 ++ .../registry/remoting/bolt/BoltClient.java | 75 +++++++------------ .../remoting/jersey/JerseyClient.java | 4 + .../bootstrap/SessionServerConfigBean.java | 4 +- .../session/remoting/DataNodeExchanger.java | 5 +- 5 files changed, 41 insertions(+), 55 deletions(-) diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java index aa08d9c3e..3686eba6c 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java @@ -40,6 +40,14 @@ public interface Client extends Endpoint { */ Channel connect(URL url); + /** + * send heartbeat, for active the connection to this url + * + * @param url the url + * @return object + */ + void heartbeat(final URL url); + /** * Sync send * diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index d76ffd86c..a9f7664df 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -18,8 +18,6 @@ import java.net.InetSocketAddress; import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -54,9 +52,7 @@ */ public class BoltClient implements Client { - private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); - - private static final int ENSURE_CONN_POOL_INTVL = 15000; + private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); /** * RpcTaskScanner: remove closed connections every 10 seconds @@ -64,14 +60,14 @@ public class BoltClient implements Client { */ private RpcClient[] rpcClients; - private AtomicBoolean closed = new AtomicBoolean(false); + private AtomicBoolean closed = new AtomicBoolean(false); - private AtomicInteger roundRobinNextId = new AtomicInteger(-1); + private AtomicInteger roundRobinNextId = new AtomicInteger(-1); - private Set connectedUrls = ConcurrentHashMap.newKeySet(); + private int heartbeatRequestTimeout = 3000; + private int connectTimeout = 2000; - protected final int connNum; - protected int connectTimeout = 2000; + private final int connNum; /** * Instantiates a new Bolt client. @@ -106,11 +102,11 @@ public void initHandlers(List channelHandlers) { for (int i = 0; i < connNum; i++) { RpcClient rpcClient = rpcClients[i]; rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); for (ChannelHandler channelHandler : channelHandlers) { if (HandlerType.PROCESSER.equals(channelHandler.getType())) { @@ -122,37 +118,6 @@ public void initHandlers(List channelHandlers) { } } } - - // start a thread to ensure connection pool (connNum > 1): bolt does not maintain the number of connection - // pools, we need to use heartbeat to make bolt maintain the number of connections - if (connNum > 1) { - Thread t = new Thread(() -> { - while (true) { - try { - Thread.sleep(ENSURE_CONN_POOL_INTVL); - } catch (InterruptedException e) { - LOGGER.error("Interrupted in ConnPoolChecker", e); - break; - } - - for (RpcClient rpcClient : rpcClients) { - try { - for (Url boltUrl : connectedUrls) { - // send something to make connection active - HeartbeatRequest heartbeatRequest = new HeartbeatRequest(); - rpcClient.invokeSync(boltUrl, heartbeatRequest, connectTimeout); - } - } catch (Throwable e) { - LOGGER.error("Error in ConnPoolChecker", e); - } - } - - } - }); - t.setDaemon(true); - t.setName("BoltClient-ConnPoolChecker"); - t.start(); - } } protected ConnectionEventProcessor newConnectionEventAdapter(ChannelHandler connectionEventHandler, @@ -174,9 +139,6 @@ public Channel connect(URL url) { throw new IllegalArgumentException("Create connection url can not be null!"); } try { - Url boltUrl = getBoltUrl(url); - connectedUrls.add(boltUrl); - for (int i = 0; i < connNum; i++) { getBoltConnection(rpcClients[i], url); } @@ -194,7 +156,7 @@ public Channel connect(URL url) { } protected Connection getBoltConnection(RpcClient rpcClient, URL url) throws RemotingException { - Url boltUrl = getBoltUrl(url); + Url boltUrl = createBoltUrl(url); try { Connection connection = rpcClient.getConnection(boltUrl, connectTimeout); if (connection == null || !connection.isFine()) { @@ -221,7 +183,7 @@ private RpcClient getNextRpcClient() { return rpcClients[n]; } - protected Url getBoltUrl(URL url) { + protected Url createBoltUrl(URL url) { Url boltUrl = new Url(url.getIpAddress(), url.getPort()); boltUrl.setProtocol(RpcProtocol.PROTOCOL_CODE); boltUrl.setVersion(RpcProtocolV2.PROTOCOL_VERSION_1); @@ -269,7 +231,7 @@ public boolean isClosed() { public Object sendSync(URL url, Object message, int timeoutMillis) { try { RpcClient rpcClient = getNextRpcClient(); - return rpcClient.invokeSync(getBoltUrl(url), message, timeoutMillis); + return rpcClient.invokeSync(createBoltUrl(url), message, timeoutMillis); } catch (RemotingException e) { String msg = "Bolt Client sendSync message RemotingException! target url:" + url; LOGGER.error(msg, e); @@ -335,4 +297,17 @@ public Executor getExecutor() { } } + @Override + public void heartbeat(URL url) { + for (RpcClient rpcClient : rpcClients) { + try { + // send something to make connection active + HeartbeatRequest heartbeatRequest = new HeartbeatRequest(); + rpcClient.invokeSync(createBoltUrl(url), heartbeatRequest, heartbeatRequestTimeout); + } catch (Throwable e) { + LOGGER.error("Error in heartbeat", e); + } + } + } + } \ No newline at end of file diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java index c682a8cf0..d2390f5e7 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java @@ -90,6 +90,10 @@ public Channel connect(URL url) { } } + @Override + public void heartbeat(URL url) { + } + @Override public Object sendSync(URL url, Object message, int timeoutMillis) { return null; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 5f7430ebb..3015a66f7 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -67,13 +67,13 @@ public class SessionServerConfigBean implements SessionServerConfig { private int schedulerConnectMetaFirstDelay = 5; - private int schedulerConnectMetaExpBackOffBound = 5; + private int schedulerConnectMetaExpBackOffBound = 3; private int schedulerConnectDataTimeout = 10; private int schedulerConnectDataFirstDelay = 10; - private int schedulerConnectDataExpBackOffBound = 5; + private int schedulerConnectDataExpBackOffBound = 3; private int schedulerCleanInvalidClientTimeOut = 3; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index 07675b04d..04d128f48 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -130,10 +130,9 @@ public synchronized Client connectServer() { dataClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, sessionServerConfig.getDataClientConnNum(), url, dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); - } else { - // make sure there are connections to DataServer - dataClient.connect(url); } + // make sure there are connections to DataServer + dataClient.heartbeat(url); } catch (Exception e) { String msg = "DataNode Exchanger connect DataServer error!url:" + url; LOGGER.error(msg, e); From 0e1411bc5af4b1b4cf4af35b9967cbc1c3b425b2 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Fri, 29 Nov 2019 22:36:54 +0800 Subject: [PATCH 150/161] fix: https://github.com/Synex-wh/sofa-registry/pull/20#pullrequestreview-324716028 --- .../session/remoting/DataNodeExchanger.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index 04d128f48..c0f284b64 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -72,16 +72,7 @@ public Response request(Request request) throws RequestException { Response response; URL url = request.getRequestUrl(); try { - Client sessionClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); - - if (sessionClient == null) { - LOGGER.warn( - "DataNode Exchanger get dataServer connection {} error! Connection can not be null or disconnected!", - url); - //first start session maybe case sessionClient null,try to auto connect - sessionClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, url, - dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); - } + Client sessionClient = getClient(url); // print but ignore if from renew module, cause renew request is too much if (!(request.getRequestBody() instanceof RenewDatumRequest)) { @@ -116,6 +107,7 @@ public synchronized Client connectServer() { StringJoiner errorMsg = new StringJoiner(";"); Client dataClient = null; + for (Node dataNode : dataNodes) { if (dataNode.getNodeUrl() == null || dataNode.getNodeUrl().getIpAddress() == null) { LOGGER.error("get data node address error!url{}", dataNode.getNodeUrl()); @@ -125,12 +117,7 @@ public synchronized Client connectServer() { URL url = new URL(dataNode.getNodeUrl().getIpAddress(), sessionServerConfig.getDataServerPort()); try { - dataClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); - if (dataClient == null) { - dataClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, - sessionServerConfig.getDataClientConnNum(), url, - dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); - } + dataClient = getClient(url); // make sure there are connections to DataServer dataClient.heartbeat(url); } catch (Exception e) { @@ -147,4 +134,16 @@ public synchronized Client connectServer() { } return dataClient; } + + protected Client getClient(URL url) { + Client sessionClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); + if (sessionClient == null) { + //first start session maybe case sessionClient null,try to auto connect + sessionClient = boltExchange.connect(Exchange.DATA_SERVER_TYPE, + sessionServerConfig.getDataClientConnNum(), url, + dataClientHandlers.toArray(new ChannelHandler[dataClientHandlers.size()])); + } + return sessionClient; + } + } \ No newline at end of file From 49f73f6f00e48ef9b7380c5a19342a0ba2747043 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sat, 30 Nov 2019 20:17:49 +0800 Subject: [PATCH 151/161] update --- .../registry/remoting/bolt/BoltClient.java | 14 ++++--- .../data/bootstrap/DataServerConfig.java | 8 ++-- .../change/notify/SessionServerNotifier.java | 39 +++++++++++-------- .../server/data/executor/ExecutorFactory.java | 13 +++++-- .../SessionServerConnectionFactory.java | 7 ++-- .../handler/HeartbeatHandler.java | 4 +- .../task/SessionRegisterDataTask.java | 4 ++ 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index a9f7664df..fe0e66613 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -52,7 +52,7 @@ */ public class BoltClient implements Client { - private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); /** * RpcTaskScanner: remove closed connections every 10 seconds @@ -60,12 +60,11 @@ public class BoltClient implements Client { */ private RpcClient[] rpcClients; - private AtomicBoolean closed = new AtomicBoolean(false); + private AtomicBoolean closed = new AtomicBoolean(false); - private AtomicInteger roundRobinNextId = new AtomicInteger(-1); + private AtomicInteger roundRobinNextId = new AtomicInteger(-1); - private int heartbeatRequestTimeout = 3000; - private int connectTimeout = 2000; + private int connectTimeout = 2000; private final int connNum; @@ -174,6 +173,9 @@ protected Connection getBoltConnection(RpcClient rpcClient, URL url) throws Remo } private RpcClient getNextRpcClient() { + if (connNum == 1) { + return rpcClients[0]; + } int n = roundRobinNextId.incrementAndGet(); if (n < 0) { roundRobinNextId.compareAndSet(n, 0); @@ -303,7 +305,7 @@ public void heartbeat(URL url) { try { // send something to make connection active HeartbeatRequest heartbeatRequest = new HeartbeatRequest(); - rpcClient.invokeSync(createBoltUrl(url), heartbeatRequest, heartbeatRequestTimeout); + rpcClient.oneway(createBoltUrl(url), heartbeatRequest); } catch (Throwable e) { LOGGER.error("Error in heartbeat", e); } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 4c70311a3..741bda358 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -89,11 +89,11 @@ public class DataServerConfig { private long notifyDataSyncExecutorKeepAliveTime = 60; - private long notifySessionRetryFirstDelay = 1000; + private long notifySessionRetryFirstDelay = 2000; - private long notifySessionRetryIncrementDelay = 1000; + private long notifySessionRetryIncrementDelay = 2000; - private int notifySessionRetryTimes = 10; + private int notifySessionRetryTimes = 5; private int publishExecutorMinPoolSize = 200; @@ -115,7 +115,7 @@ public class DataServerConfig { private int sessionServerNotifierRetryExecutorThreadSize = 10; - private int sessionServerNotifierRetryExecutorQueueSize = 1000000; + private int sessionServerNotifierRetryExecutorQueueSize = 10000; private int renewEnableDelaySec = 30; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index cf1b5a627..73859c858 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -39,6 +39,7 @@ import com.alipay.sofa.registry.server.data.bootstrap.DataServerConfig; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.data.change.DataSourceTypeEnum; +import com.alipay.sofa.registry.server.data.executor.ExecutorFactory; import com.alipay.sofa.registry.server.data.remoting.sessionserver.SessionServerConnectionFactory; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer; import com.alipay.sofa.registry.timer.AsyncHashedWheelTimer.TaskFailedCallback; @@ -116,13 +117,11 @@ private void doNotify(NotifyCallback notifyCallback) { try { //check connection active if (!connection.isFine()) { - if (LOGGER.isInfoEnabled()) { - LOGGER - .info(String - .format( - "connection from sessionServer(%s) is not fine, so ignore notify, retryTimes=%s,request=%s", - connection.getRemoteAddress(), notifyCallback.retryTimes, request)); - } + LOGGER + .info(String + .format( + "connection from sessionServer(%s) is not fine, so ignore notify, retryTimes=%s,request=%s", + connection.getRemoteAddress(), notifyCallback.retryTimes, request)); return; } Server sessionServer = boltExchange.getServer(dataServerConfig.getPort()); @@ -140,26 +139,32 @@ private void doNotify(NotifyCallback notifyCallback) { * on failed, retry if necessary */ private void onFailed(NotifyCallback notifyCallback) { + DataChangeRequest request = notifyCallback.request; Connection connection = notifyCallback.connection; notifyCallback.retryTimes++; + //check version, if it's fall behind, stop retry + long _currentVersion = datumCache.get(request.getDataCenter(), request.getDataInfoId()).getVersion(); + if (request.getVersion() != _currentVersion) { + LOGGER.info(String.format( + "current version change %s, retry version is %s, stop before retry! retryTimes=%s, request=%s", + _currentVersion, request.getVersion(), notifyCallback.retryTimes, request)); + return; + } + if (notifyCallback.retryTimes <= dataServerConfig.getNotifySessionRetryTimes()) { this.asyncHashedWheelTimer.newTimeout(timeout -> { - if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("retrying notify sessionServer(%s), retryTimes=%s, request=%s", - connection.getRemoteAddress(), notifyCallback.retryTimes, request)); - } + LOGGER.info(String.format("retrying notify sessionServer(%s), retryTimes=%s, request=%s", + connection.getRemoteAddress(), notifyCallback.retryTimes, request)); //check version, if it's fall behind, stop retry long currentVersion = datumCache.get(request.getDataCenter(), request.getDataInfoId()).getVersion(); if (request.getVersion() == currentVersion) { doNotify(notifyCallback); } else { - if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format( - "current version change %s, retry version is %s, stop retry! retryTimes=%s, request=%s", - currentVersion, request.getVersion(), notifyCallback.retryTimes, request)); - } + LOGGER.info(String.format( + "current version change %s, retry version is %s, stop retry! retryTimes=%s, request=%s", + currentVersion, request.getVersion(), notifyCallback.retryTimes, request)); } }, getDelayTimeForRetry(notifyCallback.retryTimes), TimeUnit.MILLISECONDS); } else { @@ -212,7 +217,7 @@ public void onException(Channel channel, Throwable e) { @Override public Executor getExecutor() { - return null; + return ExecutorFactory.NOTIFY_SESSION_CALLBACK_EXECUTOR; } } diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java index 233e6013c..0e78b1801 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java @@ -16,10 +16,6 @@ */ package com.alipay.sofa.registry.server.data.executor; -import com.alipay.sofa.registry.log.Logger; -import com.alipay.sofa.registry.log.LoggerFactory; -import com.alipay.sofa.registry.util.NamedThreadFactory; - import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; @@ -29,6 +25,10 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import com.alipay.sofa.registry.log.Logger; +import com.alipay.sofa.registry.log.LoggerFactory; +import com.alipay.sofa.registry.util.NamedThreadFactory; + /** * the factory to create executor * @@ -38,6 +38,7 @@ public class ExecutorFactory { public static final ThreadPoolExecutor EXECUTOR; + public static final ThreadPoolExecutor NOTIFY_SESSION_CALLBACK_EXECUTOR; private static final Logger LOGGER = LoggerFactory.getLogger(ExecutorFactory.class); static { @@ -57,6 +58,10 @@ protected void afterExecute(Runnable r, Throwable t) { } } }; + + NOTIFY_SESSION_CALLBACK_EXECUTOR = new ThreadPoolExecutor(50, 100, 300, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(10000), new NamedThreadFactory( + "NotifySessionCallback-executor", true)); } /** diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java index 1c3520a1d..7c8a76901 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/SessionServerConnectionFactory.java @@ -77,10 +77,11 @@ public class SessionServerConnectionFactory { * @param connection */ public void registerSession(String processId, Set connectIds, Connection connection) { - String sessionConnAddress = NetUtil.toAddressString(connection.getRemoteAddress()); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("session({}, processId={}) registered", sessionConnAddress, processId); + if (!connection.isFine()) { + return; } + String sessionConnAddress = NetUtil.toAddressString(connection.getRemoteAddress()); + LOGGER.info("session({}, processId={}) registered", sessionConnAddress, processId); SESSION_CONN_PROCESS_ID_MAP.put(sessionConnAddress, processId); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java index f12ba3a25..537d3b90f 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java @@ -35,12 +35,12 @@ public void checkParam(HeartbeatRequest request) throws RuntimeException { @Override public Object doHandle(Channel channel, HeartbeatRequest request) { - return CommonResponse.buildSuccessResponse(); + return null; } @Override public CommonResponse buildFailedResponse(String msg) { - return CommonResponse.buildFailedResponse(msg); + return null; } @Override diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java index f08508aaa..0521144f1 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/SessionRegisterDataTask.java @@ -96,6 +96,10 @@ public void setTaskEvent(TaskEvent taskEvent) { @Override public void execute() { + if (!channel.isConnected()) { + return; + } + Client sessionClient = boltExchange.getClient(Exchange.DATA_SERVER_TYPE); try { sessionClient.sendSync(channel, sessionServerRegisterRequest, From 9da0d6997ea2fe273db93b3fd0ecada0760b07c0 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sun, 1 Dec 2019 11:37:47 +0800 Subject: [PATCH 152/161] BoltClient use just one RpcClient; remove heartbeat between session and data; --- .../model/dataserver/HeartbeatRequest.java | 36 ------- .../alipay/sofa/registry/remoting/Client.java | 8 -- .../registry/remoting/bolt/BoltClient.java | 97 ++++--------------- .../remoting/jersey/JerseyClient.java | 4 - .../DataServerBeanConfiguration.java | 7 -- .../data/bootstrap/DataServerConfig.java | 4 +- .../change/notify/SessionServerNotifier.java | 2 +- .../handler/HeartbeatHandler.java | 60 ------------ .../bootstrap/SessionServerConfigBean.java | 2 +- .../session/remoting/DataNodeExchanger.java | 2 +- 10 files changed, 26 insertions(+), 196 deletions(-) delete mode 100644 server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java delete mode 100644 server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java diff --git a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java b/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java deleted file mode 100644 index e77df4c0f..000000000 --- a/server/common/model/src/main/java/com/alipay/sofa/registry/common/model/dataserver/HeartbeatRequest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.common.model.dataserver; - -import java.io.Serializable; - -/** - * - * @author kezhu.wukz - * @version $Id: HeartbeatRequest.java, v 0.1 2018-04-14 17:31 qian.lqlq Exp $ - */ -public class HeartbeatRequest implements Serializable { - - private static final long serialVersionUID = 4872633119038341583L; - - /** - * constructor - */ - public HeartbeatRequest() { - } - -} \ No newline at end of file diff --git a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java index 3686eba6c..aa08d9c3e 100644 --- a/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java +++ b/server/remoting/api/src/main/java/com/alipay/sofa/registry/remoting/Client.java @@ -40,14 +40,6 @@ public interface Client extends Endpoint { */ Channel connect(URL url); - /** - * send heartbeat, for active the connection to this url - * - * @param url the url - * @return object - */ - void heartbeat(final URL url); - /** * Sync send * diff --git a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java index fe0e66613..cb206d35c 100644 --- a/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java +++ b/server/remoting/bolt/src/main/java/com/alipay/sofa/registry/remoting/bolt/BoltClient.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import com.alipay.remoting.Connection; import com.alipay.remoting.ConnectionEventProcessor; @@ -30,8 +29,6 @@ import com.alipay.remoting.exception.RemotingException; import com.alipay.remoting.rpc.RpcClient; import com.alipay.remoting.rpc.protocol.RpcProtocol; -import com.alipay.remoting.rpc.protocol.RpcProtocolV2; -import com.alipay.sofa.registry.common.model.dataserver.HeartbeatRequest; import com.alipay.sofa.registry.common.model.store.URL; import com.alipay.sofa.registry.log.Logger; import com.alipay.sofa.registry.log.LoggerFactory; @@ -52,19 +49,13 @@ */ public class BoltClient implements Client { - private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BoltClient.class); - /** - * RpcTaskScanner: remove closed connections every 10 seconds - * HealConnectionRunner: Ensure that the number of connections reaches connNum every 1 second - */ - private RpcClient[] rpcClients; - - private AtomicBoolean closed = new AtomicBoolean(false); + private RpcClient rpcClient; - private AtomicInteger roundRobinNextId = new AtomicInteger(-1); + private AtomicBoolean closed = new AtomicBoolean(false); - private int connectTimeout = 2000; + private int connectTimeout = 2000; private final int connNum; @@ -72,15 +63,9 @@ public class BoltClient implements Client { * Instantiates a new Bolt client. */ public BoltClient(int connNum) { - rpcClients = new RpcClient[connNum]; - for (int i = 0; i < connNum; i++) { - RpcClient rpcClient = new RpcClient(); - rpcClient.enableReconnectSwitch(); - rpcClient.enableConnectionMonitorSwitch(); - rpcClient.init(); + rpcClient = new RpcClient(); + rpcClient.init(); - rpcClients[i] = rpcClient; - } this.connNum = connNum; } @@ -98,22 +83,19 @@ public void initHandlers(List channelHandlers) { } } - for (int i = 0; i < connNum; i++) { - RpcClient rpcClient = rpcClients[i]; - rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); - rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); - rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, - newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.CONNECT, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CONNECT)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.CLOSE, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.CLOSE)); + rpcClient.addConnectionEventProcessor(ConnectionEventType.EXCEPTION, + newConnectionEventAdapter(connectionEventHandler, ConnectionEventType.EXCEPTION)); - for (ChannelHandler channelHandler : channelHandlers) { - if (HandlerType.PROCESSER.equals(channelHandler.getType())) { - if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { - rpcClient.registerUserProcessor(newSyncProcessor(channelHandler)); - } else { - rpcClient.registerUserProcessor(newAsyncProcessor(channelHandler)); - } + for (ChannelHandler channelHandler : channelHandlers) { + if (HandlerType.PROCESSER.equals(channelHandler.getType())) { + if (InvokeType.SYNC.equals(channelHandler.getInvokeType())) { + rpcClient.registerUserProcessor(newSyncProcessor(channelHandler)); + } else { + rpcClient.registerUserProcessor(newAsyncProcessor(channelHandler)); } } } @@ -138,10 +120,7 @@ public Channel connect(URL url) { throw new IllegalArgumentException("Create connection url can not be null!"); } try { - for (int i = 0; i < connNum; i++) { - getBoltConnection(rpcClients[i], url); - } - RpcClient rpcClient = getNextRpcClient(); + getBoltConnection(rpcClient, url); Connection connection = getBoltConnection(rpcClient, url); BoltChannel channel = new BoltChannel(); channel.setConnection(connection); @@ -172,24 +151,10 @@ protected Connection getBoltConnection(RpcClient rpcClient, URL url) throws Remo } } - private RpcClient getNextRpcClient() { - if (connNum == 1) { - return rpcClients[0]; - } - int n = roundRobinNextId.incrementAndGet(); - if (n < 0) { - roundRobinNextId.compareAndSet(n, 0); - n = (n == Integer.MIN_VALUE) ? 0 : Math.abs(n); - } - n = n % rpcClients.length; - return rpcClients[n]; - } - protected Url createBoltUrl(URL url) { Url boltUrl = new Url(url.getIpAddress(), url.getPort()); boltUrl.setProtocol(RpcProtocol.PROTOCOL_CODE); - boltUrl.setVersion(RpcProtocolV2.PROTOCOL_VERSION_1); - boltUrl.setConnNum(1); + boltUrl.setConnNum(connNum); boltUrl.setConnWarmup(true); return boltUrl; } @@ -197,7 +162,6 @@ protected Url createBoltUrl(URL url) { @Override public Channel getChannel(URL url) { try { - RpcClient rpcClient = getNextRpcClient(); Connection connection = getBoltConnection(rpcClient, url); BoltChannel channel = new BoltChannel(); channel.setConnection(connection); @@ -217,10 +181,7 @@ public InetSocketAddress getLocalAddress() { @Override public void close() { if (closed.compareAndSet(false, true)) { - for (int i = 0; i < connNum; i++) { - RpcClient rpcClient = rpcClients[i]; - rpcClient.shutdown(); - } + rpcClient.shutdown(); } } @@ -232,7 +193,6 @@ public boolean isClosed() { @Override public Object sendSync(URL url, Object message, int timeoutMillis) { try { - RpcClient rpcClient = getNextRpcClient(); return rpcClient.invokeSync(createBoltUrl(url), message, timeoutMillis); } catch (RemotingException e) { String msg = "Bolt Client sendSync message RemotingException! target url:" + url; @@ -249,7 +209,6 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { if (channel != null && channel.isConnected()) { BoltChannel boltChannel = (BoltChannel) channel; try { - RpcClient rpcClient = getNextRpcClient(); return rpcClient.invokeSync(boltChannel.getConnection(), message, timeoutMillis); } catch (RemotingException e) { LOGGER.error("Bolt Client sendSync message RemotingException! target boltUrl:" @@ -270,7 +229,6 @@ public Object sendSync(Channel channel, Object message, int timeoutMillis) { public void sendCallback(URL url, Object message, CallbackHandler callbackHandler, int timeoutMillis) { try { - RpcClient rpcClient = getNextRpcClient(); Connection connection = getBoltConnection(rpcClient, url); BoltChannel channel = new BoltChannel(); channel.setConnection(connection); @@ -299,17 +257,4 @@ public Executor getExecutor() { } } - @Override - public void heartbeat(URL url) { - for (RpcClient rpcClient : rpcClients) { - try { - // send something to make connection active - HeartbeatRequest heartbeatRequest = new HeartbeatRequest(); - rpcClient.oneway(createBoltUrl(url), heartbeatRequest); - } catch (Throwable e) { - LOGGER.error("Error in heartbeat", e); - } - } - } - } \ No newline at end of file diff --git a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java index d2390f5e7..c682a8cf0 100644 --- a/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java +++ b/server/remoting/http/src/main/java/com/alipay/sofa/registry/remoting/jersey/JerseyClient.java @@ -90,10 +90,6 @@ public Channel connect(URL url) { } } - @Override - public void heartbeat(URL url) { - } - @Override public Object sendSync(URL url, Object message, int timeoutMillis) { return null; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java index b783003f4..7b8a2d590 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerBeanConfiguration.java @@ -90,7 +90,6 @@ import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.DatumSnapshotHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.GetDataVersionsHandler; -import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.HeartbeatHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.PublishDataHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.RenewDatumHandler; import com.alipay.sofa.registry.server.data.remoting.sessionserver.handler.SessionServerRegisterHandler; @@ -219,7 +218,6 @@ public Collection serverHandlers() { list.add(dataServerConnectionHandler()); list.add(renewDatumHandler()); list.add(datumSnapshotHandler()); - list.add(heartbeatHandler()); return list; } @@ -298,11 +296,6 @@ public AbstractServerHandler sessionServerRegisterHandler() { return new SessionServerRegisterHandler(); } - @Bean - public AbstractServerHandler heartbeatHandler() { - return new HeartbeatHandler(); - } - @Bean public AbstractServerHandler unPublishDataHandler() { return new UnPublishDataHandler(); diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java index 741bda358..a18810be7 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/bootstrap/DataServerConfig.java @@ -89,9 +89,9 @@ public class DataServerConfig { private long notifyDataSyncExecutorKeepAliveTime = 60; - private long notifySessionRetryFirstDelay = 2000; + private long notifySessionRetryFirstDelay = 3000; - private long notifySessionRetryIncrementDelay = 2000; + private long notifySessionRetryIncrementDelay = 3000; private int notifySessionRetryTimes = 5; diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java index 73859c858..f66fb747e 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/change/notify/SessionServerNotifier.java @@ -75,7 +75,7 @@ public void init() { ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setDaemon(true); asyncHashedWheelTimer = new AsyncHashedWheelTimer(threadFactoryBuilder.setNameFormat( - "Registry-SessionServerNotifier-WheelTimer").build(), 100, TimeUnit.MILLISECONDS, 1024, + "Registry-SessionServerNotifier-WheelTimer").build(), 500, TimeUnit.MILLISECONDS, 1024, dataServerConfig.getSessionServerNotifierRetryExecutorThreadSize(), dataServerConfig.getSessionServerNotifierRetryExecutorQueueSize(), threadFactoryBuilder .setNameFormat("Registry-SessionServerNotifier-WheelExecutor-%d").build(), diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java deleted file mode 100644 index 537d3b90f..000000000 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/sessionserver/handler/HeartbeatHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alipay.sofa.registry.server.data.remoting.sessionserver.handler; - -import com.alipay.sofa.registry.common.model.CommonResponse; -import com.alipay.sofa.registry.common.model.Node; -import com.alipay.sofa.registry.common.model.dataserver.HeartbeatRequest; -import com.alipay.sofa.registry.remoting.Channel; -import com.alipay.sofa.registry.server.data.remoting.handler.AbstractServerHandler; - -/** - * - * @author kezhu.wukz - * @version $Id: HeartbeatHandler.java, v 0.1 2019年11月24日 17:32 kezhu.wukz Exp $ - */ -public class HeartbeatHandler extends AbstractServerHandler { - - @Override - public void checkParam(HeartbeatRequest request) throws RuntimeException { - } - - @Override - public Object doHandle(Channel channel, HeartbeatRequest request) { - return null; - } - - @Override - public CommonResponse buildFailedResponse(String msg) { - return null; - } - - @Override - public HandlerType getType() { - return HandlerType.PROCESSER; - } - - @Override - public Class interest() { - return HeartbeatRequest.class; - } - - @Override - protected Node.NodeType getConnectNodeType() { - return Node.NodeType.DATA; - } -} \ No newline at end of file diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java index 3015a66f7..47890eb73 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/bootstrap/SessionServerConfigBean.java @@ -137,7 +137,7 @@ public class SessionServerConfigBean implements SessionServerConfig { private long pushTaskExecutorKeepAliveTime = 60; - private int dataChangeExecutorMinPoolSize = 100; + private int dataChangeExecutorMinPoolSize = 40; private int dataChangeExecutorMaxPoolSize = 400; diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java index c0f284b64..30e17ab97 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/remoting/DataNodeExchanger.java @@ -119,7 +119,7 @@ public synchronized Client connectServer() { try { dataClient = getClient(url); // make sure there are connections to DataServer - dataClient.heartbeat(url); + dataClient.connect(url); } catch (Exception e) { String msg = "DataNode Exchanger connect DataServer error!url:" + url; LOGGER.error(msg, e); From aaa0bd483e6e02f3cd4adeb6490292d188d41c89 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sun, 1 Dec 2019 11:43:14 +0800 Subject: [PATCH 153/161] SyncDataCallback reduce ThreadSize for saving cpu --- .../server/data/remoting/dataserver/SyncDataCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java index a721ee718..5f673218c 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/remoting/dataserver/SyncDataCallback.java @@ -43,7 +43,7 @@ public class SyncDataCallback implements InvokeCallback { private static final Logger LOGGER = LoggerFactory.getLogger(SyncDataCallback.class); - private static final Executor EXECUTOR = ExecutorFactory.newFixedThreadPool(20, + private static final Executor EXECUTOR = ExecutorFactory.newFixedThreadPool(5, SyncDataCallback.class.getSimpleName()); private static final int RETRY_COUNT = 3; From 045203c06113ac124cf732316bc03692ce423665 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Sun, 1 Dec 2019 11:50:21 +0800 Subject: [PATCH 154/161] reduce NOTIFY_SESSION_CALLBACK_EXECUTOR threadSize --- .../sofa/registry/server/data/executor/ExecutorFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java index 0e78b1801..af08f25b1 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/executor/ExecutorFactory.java @@ -59,8 +59,8 @@ protected void afterExecute(Runnable r, Throwable t) { } }; - NOTIFY_SESSION_CALLBACK_EXECUTOR = new ThreadPoolExecutor(50, 100, 300, TimeUnit.SECONDS, - new LinkedBlockingQueue<>(10000), new NamedThreadFactory( + NOTIFY_SESSION_CALLBACK_EXECUTOR = new ThreadPoolExecutor(10, 20, 300, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(100000), new NamedThreadFactory( "NotifySessionCallback-executor", true)); } From 4aa559ad7d0dec8786262bf3ddb82ea618253079 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Mon, 2 Dec 2019 21:00:54 +0800 Subject: [PATCH 155/161] fix version in DataChangeFetchTask --- .../scheduler/task/DataChangeFetchTask.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java index 8b1cc633c..3f2559865 100644 --- a/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java +++ b/server/server/session/src/main/java/com/alipay/sofa/registry/server/session/scheduler/task/DataChangeFetchTask.java @@ -16,6 +16,15 @@ */ package com.alipay.sofa.registry.server.session.scheduler.task; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Predicate; + import com.alipay.sofa.registry.common.model.dataserver.Datum; import com.alipay.sofa.registry.common.model.sessionserver.DataChangeRequest; import com.alipay.sofa.registry.common.model.store.BaseInfo.ClientVersion; @@ -42,15 +51,6 @@ import com.alipay.sofa.registry.task.listener.TaskListenerManager; import com.alipay.sofa.registry.util.DatumVersionUtil; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Predicate; - /** * * @author shangyu.wh @@ -100,7 +100,7 @@ public void execute() { Datum datum = getDatumCache(); if (datum != null) { - PushTaskClosure pushTaskClosure = getTaskClosure(); + PushTaskClosure pushTaskClosure = getTaskClosure(datum.getVersion()); for (ScopeEnum scopeEnum : ScopeEnum.values()) { Map> map = getCache(scopeEnum); @@ -188,33 +188,33 @@ private Collection subscribersVersionCheck(Collection su return subscribersSend; } - public PushTaskClosure getTaskClosure() { + public PushTaskClosure getTaskClosure(Long version) { //this for all this dataInfoId push result get and call back to change version PushTaskClosure pushTaskClosure = new PushTaskClosure(executorManager.getPushTaskCheckAsyncHashedWheelTimer(), sessionServerConfig, dataChangeRequest.getDataInfoId()); pushTaskClosure.setTaskClosure((status, task) -> { String dataCenter = dataChangeRequest.getDataCenter(); String dataInfoId = dataChangeRequest.getDataInfoId(); - Long version = dataChangeRequest.getVersion(); + Long changeVersion = dataChangeRequest.getVersion(); if (status == ProcessingResult.Success) { if (sessionServerConfig.isStopPushSwitch()) { - LOGGER.info("Stop Push switch on,dataCenter {} dataInfoId {} version {} can not be update!", - dataCenter, dataInfoId, version); + LOGGER.info("Stop Push switch on, dataCenter:{}, dataInfoId:{}, changeVersion:{}, pushVersion:{}, can not be update!", + dataCenter, dataInfoId, changeVersion, version); return; } boolean result = sessionInterests.checkAndUpdateInterestVersions(dataCenter, dataInfoId, version); if (result) { - LOGGER.info("Push all tasks success,dataCenter:{} dataInfoId:{} version:{} update!", dataCenter, - dataInfoId, version); + LOGGER.info("Push all tasks success, dataCenter:{}, dataInfoId:{}, changeVersion:{}, pushVersion:{}, update!", dataCenter, + dataInfoId, changeVersion, version); } else { - LOGGER.info("Push all tasks success,but dataCenter:{} dataInfoId:{} version:{} need not update!", - dataCenter, dataInfoId, version); + LOGGER.info("Push all tasks success, but dataCenter:{}, dataInfoId:{}, changeVersion:{}, pushVersion:{}, need not update!", + dataCenter, dataInfoId, changeVersion, version); } } else { LOGGER.warn( - "Push tasks found error,subscribers version can not be update!dataCenter:{} dataInfoId:{} version:{}", - dataCenter, dataInfoId, version); + "Push tasks found error, subscribers version can not be update! dataCenter:{}, dataInfoId:{}, changeVersion:{}, pushVersion:{}", + dataCenter, dataInfoId, changeVersion, version); } }); return pushTaskClosure; From a58e630d0d0501e37e479de5e766c08163da6dc6 Mon Sep 17 00:00:00 2001 From: "kezhu.wukz" Date: Tue, 3 Dec 2019 16:51:01 +0800 Subject: [PATCH 156/161] 1. filter out the unPubs of datum when first put, Otherwise, "syncData" or "fetchData" get Datum may contains unPubs, which will result something error 2. add jul-to-slf4j for some lib which use jul log, e.g. hessian --- pom.xml | 5 +++ .../server/data/cache/DatumCache.java | 39 ++++++++++++------- server/server/session/pom.xml | 4 ++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index d0964942d..5a9d33168 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,11 @@ + + org.slf4j + jul-to-slf4j + 1.7.9 + org.springframework.boot spring-boot-starter-parent diff --git a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java index 09f824387..278e4b096 100644 --- a/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java +++ b/server/server/data/src/main/java/com/alipay/sofa/registry/server/data/cache/DatumCache.java @@ -174,24 +174,21 @@ public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { return mergeResult; } - Datum ret = map.putIfAbsent(dataInfoId, datum); - if (ret == null) { - Set> entries = datum.getPubMap().entrySet(); - Iterator> iterator = entries.iterator(); + // filter out the unPubs of datum when first put. + // Otherwise, "syncData" or "fetchData" when get Datum with unPubs, which will result something error + boolean[] exists = { true }; + Datum cacheDatum = map.computeIfAbsent(dataInfoId, k -> filterUnPubs(exists, datum)); + if (!exists[0]) { + Iterator> iterator = datum.getPubMap().entrySet().iterator(); while (iterator.hasNext()) { Entry entry = iterator.next(); Publisher publisher = entry.getValue(); - if (!(publisher instanceof UnPublisher)) { - addToIndex(publisher); - } else { - //first put to cache,UnPublisher data must remove,not so got error pub data exist - iterator.remove(); - } + addToIndex(publisher); } mergeResult = new MergeResult(null, true); } else { if (changeType == DataChangeTypeEnum.MERGE) { - mergeResult = mergeDatum(datum); + mergeResult = mergeDatum(cacheDatum, datum); } else { Long lastVersion = coverDatum(datum); mergeResult = new MergeResult(lastVersion, true); @@ -200,6 +197,23 @@ public MergeResult putDatum(DataChangeTypeEnum changeType, Datum datum) { return mergeResult; } + /** + * remove unPubs from datum + */ + private Datum filterUnPubs(boolean[] exists, Datum datum) { + Iterator> iterator = datum.getPubMap().entrySet().iterator(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + Publisher publisher = entry.getValue(); + if (publisher instanceof UnPublisher) { + //first put to cache,UnPublisher data must remove,not so got error pub data exist + iterator.remove(); + } + } + exists[0] = false; + return datum; + } + private Map getDatumMapByDataCenter(String dataCenter) { Map map = DATUM_MAP.get(dataCenter); if (map == null) { @@ -247,9 +261,8 @@ public boolean cleanDatum(String dataCenter, String dataInfoId) { * @param datum * @return */ - private MergeResult mergeDatum(Datum datum) { + private MergeResult mergeDatum(Datum cacheDatum, Datum datum) { boolean isChanged = false; - Datum cacheDatum = DATUM_MAP.get(datum.getDataCenter()).get(datum.getDataInfoId()); Map cachePubMap = cacheDatum.getPubMap(); Map pubMap = datum.getPubMap(); for (Entry pubEntry : pubMap.entrySet()) { diff --git a/server/server/session/pom.xml b/server/server/session/pom.xml index 14eaa23a7..fa371394d 100644 --- a/server/server/session/pom.xml +++ b/server/server/session/pom.xml @@ -17,6 +17,10 @@ + + org.slf4j + jul-to-slf4j + org.springframework.boot spring-boot-starter From 63f3fe3ca391799d40b2c9511850988e374a91f4 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 Jan 2020 11:33:39 +0800 Subject: [PATCH 157/161] fix meta mem --- .../registry/jraft/processor/Processor.java | 73 ++++++++++++++----- .../jraft/processor/ProxyHandler.java | 5 +- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java index 6e59e1556..fab3c1cd1 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/Processor.java @@ -16,12 +16,6 @@ */ package com.alipay.sofa.registry.jraft.processor; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - import com.alipay.sofa.registry.jraft.bootstrap.ServiceStateMachine; import com.alipay.sofa.registry.jraft.command.ProcessRequest; import com.alipay.sofa.registry.jraft.command.ProcessResponse; @@ -29,6 +23,11 @@ import com.alipay.sofa.registry.log.LoggerFactory; import com.alipay.sofa.registry.store.api.annotation.ReadOnLeader; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -113,14 +112,13 @@ public ProcessResponse process(ProcessRequest request) { Object[] methodArg = request.getMethodArgs(); String methodHandleKey = getMethodHandleKey(serviceId, methodKey); - MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); - if (methodHandle == null) { - MethodHandle methodHandleNew = MethodHandles.lookup().unreflect(appServiceMethod); - methodHandle = methodHandleMap.putIfAbsent(methodHandleKey, methodHandleNew); - if (methodHandle == null) { - methodHandle = methodHandleNew; + MethodHandle methodHandle = methodHandleMap.computeIfAbsent(methodHandleKey,k-> { + try { + return MethodHandles.lookup().unreflect(appServiceMethod); + } catch (IllegalAccessException e) { + throw new RuntimeException("Process service request lookup method error!",e); } - } + }); Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); if (ret != null) { @@ -158,14 +156,13 @@ public ProcessResponse process(Method method, ProcessRequest request) { } String methodKey = methodKeyBuffer.toString(); String methodHandleKey = getMethodHandleKey(serviceId, methodKey); - MethodHandle methodHandle = methodHandleMap.get(methodHandleKey); - if (methodHandle == null) { - MethodHandle methodHandleNew = MethodHandles.lookup().unreflect(method); - methodHandle = methodHandleMap.putIfAbsent(methodHandleKey, methodHandleNew); - if (methodHandle == null) { - methodHandle = methodHandleNew; + MethodHandle methodHandle = methodHandleMap.computeIfAbsent(methodHandleKey,k-> { + try { + return MethodHandles.lookup().unreflect(method); + } catch (IllegalAccessException e) { + throw new RuntimeException("Process service request lookup method error!",e); } - } + }); Object ret = methodHandle.bindTo(target).invokeWithArguments(methodArg); if (ret != null) { @@ -207,6 +204,42 @@ public Method getWorkMethod(ProcessRequest request) { } } + public MethodHandle getWorkMethodHandle(ProcessRequest request) { + String methodName = request.getMethodName(); + String serviceId = request.getServiceName(); + try { + + StringBuilder methodKeyBuffer = new StringBuilder(); + methodKeyBuffer.append(methodName); + String[] sig = request.getMethodArgSigs(); + for (int i = 0; i < sig.length; i++) { + methodKeyBuffer.append(sig[i]); + } + String methodKey = methodKeyBuffer.toString(); + Method appServiceMethod = workerMethods.get(serviceId).get(methodKey); + if (appServiceMethod == null) { + LOG.error("Can not find method {} from processor by serviceId {}", methodName, + serviceId); + throw new NoSuchMethodException("Can not find method from processor!"); + } + + String methodHandleKey = getMethodHandleKey(serviceId, methodKey); + + MethodHandle methodHandle = methodHandleMap.computeIfAbsent(methodHandleKey,k-> { + try { + return MethodHandles.lookup().unreflect(appServiceMethod); + } catch (IllegalAccessException e) { + throw new RuntimeException("Process service request lookup method error!",e); + } + }); + return methodHandle; + } catch (Exception e) { + LOG.error("Process request {} get WorkMethod error!", request, e); + throw new RuntimeException(String.format("Process request %s get WorkMethod error!", + request)); + } + } + public Map getWorkers() { return workers; } diff --git a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/ProxyHandler.java b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/ProxyHandler.java index f96098cf2..09b9e63c5 100644 --- a/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/ProxyHandler.java +++ b/server/store/jraft/src/main/java/com/alipay/sofa/registry/jraft/processor/ProxyHandler.java @@ -22,7 +22,6 @@ import com.alipay.sofa.registry.log.LoggerFactory; import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -87,9 +86,7 @@ private Object doInvokeMethod(ProcessRequest request) { serviceId)); } - Method method = Processor.getInstance().getWorkMethod(request); - - MethodHandle methodHandle = MethodHandles.lookup().unreflect(method); + MethodHandle methodHandle = Processor.getInstance().getWorkMethodHandle(request); return methodHandle.bindTo(target).invokeWithArguments(request.getMethodArgs()); } catch (Throwable e) { LOGGER.error("Directly invoke read only service {} method {} error!", From 697689109783b9b97c33d9e3faf5765b0190beec Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 Jan 2020 16:46:52 +0800 Subject: [PATCH 158/161] fix test case --- .../test/pubsub/TempPublisherTest.java | 35 +++++++++---------- .../test/sync/SyncDataHandlerTest.java | 4 ++- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java index 45401d224..c14d8d080 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java @@ -16,18 +16,6 @@ */ package com.alipay.sofa.registry.test.pubsub; -import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; -import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringRunner; - import com.alipay.sofa.registry.client.api.model.RegistryType; import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; @@ -38,6 +26,17 @@ import com.alipay.sofa.registry.core.model.ScopeEnum; import com.alipay.sofa.registry.server.session.node.service.DataNodeService; import com.alipay.sofa.registry.test.BaseIntegrationTest; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; +import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; +import static org.junit.Assert.assertEquals; /** * @author xuanbei @@ -55,7 +54,7 @@ public synchronized void doTest() throws Exception { new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(2000L); + Thread.sleep(5000L); assertEquals(dataId, this.dataId); assertEquals(0, userData.getZoneData().size()); @@ -78,7 +77,7 @@ public synchronized void doTest() throws Exception { sessionApplicationContext.getBean(DataNodeService.class).register(tempPublisher); // data size is 1 - Thread.sleep(2000L); + Thread.sleep(5000L); assertEquals(dataId, this.dataId); assertEquals(1, userData.getZoneData().size()); userData = null; @@ -88,7 +87,7 @@ public synchronized void doTest() throws Exception { subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(2000L); + Thread.sleep(5000L); assertEquals(dataId, this.dataId); assertEquals(0, userData.getZoneData().size()); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); @@ -103,13 +102,13 @@ public synchronized void doTestPubAndTempPubSameTime() throws Exception { new MySubscriberDataObserver()); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); - Thread.sleep(2000L); + Thread.sleep(5000L); // publish data PublisherRegistration registration = new PublisherRegistration(dataId); registryClient1.register(registration, "test publish"); - Thread.sleep(2000L); + Thread.sleep(5000L); // publish temp data Publisher tempPublisher = new Publisher(); @@ -129,7 +128,7 @@ public synchronized void doTestPubAndTempPubSameTime() throws Exception { tempPublisher.setDataList(dataBoxData); sessionApplicationContext.getBean(DataNodeService.class).register(tempPublisher); - Thread.sleep(2000L); + Thread.sleep(5000L); assertEquals(1, userData.getZoneData().size()); assertEquals(2, userData.getZoneData().get(LOCAL_REGION).size()); diff --git a/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java b/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java index f9fc97667..e9985e30b 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/sync/SyncDataHandlerTest.java @@ -56,6 +56,8 @@ public void doTest() throws Exception { // request syncData DataNodeExchanger dataNodeExchanger = dataApplicationContext.getBean("dataNodeExchanger", DataNodeExchanger.class); + URL url = new URL(LOCAL_ADDRESS, syncDataPort); + dataNodeExchanger.connect(url); GenericResponse genericResponse = (GenericResponse) dataNodeExchanger.request( new Request() { @Override @@ -67,7 +69,7 @@ public Object getRequestBody() { @Override public URL getRequestUrl() { - return new URL(LOCAL_ADDRESS, syncDataPort); + return url; } }).getResult(); From 702d5b4424e7f23a50176e1c502e894ff9f450e6 Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 Jan 2020 18:03:57 +0800 Subject: [PATCH 159/161] fix temp case --- .../test/pubsub/TempPublisherTest.java | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java index c14d8d080..e824570d0 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/pubsub/TempPublisherTest.java @@ -17,6 +17,7 @@ package com.alipay.sofa.registry.test.pubsub; import com.alipay.sofa.registry.client.api.model.RegistryType; +import com.alipay.sofa.registry.client.api.model.UserData; import com.alipay.sofa.registry.client.api.registration.PublisherRegistration; import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration; import com.alipay.sofa.registry.common.model.PublishType; @@ -33,6 +34,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import static com.alipay.sofa.registry.client.constants.ValueConstants.DEFAULT_GROUP; import static com.alipay.sofa.registry.common.model.constants.ValueConstants.DEFAULT_INSTANCE_ID; @@ -46,17 +48,22 @@ public class TempPublisherTest extends BaseIntegrationTest { @Test public synchronized void doTest() throws Exception { - String dataId = "test-dataId-" + System.currentTimeMillis(); + String dataId = "test-dataId-" +this.getClass().getName()+ System.currentTimeMillis(); String value = "test publish temp data"; - + AtomicReference dataIdRef = new AtomicReference<>(); + AtomicReference userDataRef = new AtomicReference<>(); // register SubscriberRegistration SubscriberRegistration subReg = new SubscriberRegistration(dataId, - new MySubscriberDataObserver()); + (dataIdIn, data) -> { + dataIdRef.set(dataIdIn); + userDataRef.set(data); + }); + subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); Thread.sleep(5000L); - assertEquals(dataId, this.dataId); - assertEquals(0, userData.getZoneData().size()); + assertEquals(dataId, dataIdRef.get()); + assertEquals(0, userDataRef.get().getZoneData().size()); // publish temp data Publisher tempPublisher = new Publisher(); @@ -78,18 +85,24 @@ public synchronized void doTest() throws Exception { // data size is 1 Thread.sleep(5000L); - assertEquals(dataId, this.dataId); - assertEquals(1, userData.getZoneData().size()); - userData = null; + assertEquals(dataId, dataIdRef.get()); + assertEquals(1, userDataRef.get().getZoneData().size()); + + userDataRef.set(null); + dataIdRef.set(null); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); // register another SubscriberRegistration, data size is 0 - subReg = new SubscriberRegistration(dataId, new MySubscriberDataObserver()); + subReg = new SubscriberRegistration(dataId, + (dataIdIn, data) -> { + dataIdRef.set(dataIdIn); + userDataRef.set(data); + }); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); Thread.sleep(5000L); - assertEquals(dataId, this.dataId); - assertEquals(0, userData.getZoneData().size()); + assertEquals(dataId, dataIdRef.get()); + assertEquals(0, userDataRef.get().getZoneData().size()); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); } @@ -97,9 +110,14 @@ public synchronized void doTest() throws Exception { public synchronized void doTestPubAndTempPubSameTime() throws Exception { String dataId = "test-same-time-pub&tempPub-" + System.currentTimeMillis(); String value = "test same time publish"; + AtomicReference dataIdRef = new AtomicReference<>(); + AtomicReference userDataRef = new AtomicReference<>(); SubscriberRegistration subReg = new SubscriberRegistration(dataId, - new MySubscriberDataObserver()); + (dataIdIn, data) -> { + dataIdRef.set(dataIdIn); + userDataRef.set(data); + }); subReg.setScopeEnum(ScopeEnum.zone); registryClient1.register(subReg); Thread.sleep(5000L); @@ -130,8 +148,8 @@ public synchronized void doTestPubAndTempPubSameTime() throws Exception { Thread.sleep(5000L); - assertEquals(1, userData.getZoneData().size()); - assertEquals(2, userData.getZoneData().get(LOCAL_REGION).size()); + assertEquals(1, userDataRef.get().getZoneData().size()); + assertEquals(2, userDataRef.get().getZoneData().get(LOCAL_REGION).size()); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.SUBSCRIBER); registryClient1.unregister(dataId, DEFAULT_GROUP, RegistryType.PUBLISHER); From 3f903596453273e7ff7b6b004eab1c5f5533774e Mon Sep 17 00:00:00 2001 From: "shangyu.wh" Date: Tue, 21 Jan 2020 21:08:06 +0800 Subject: [PATCH 160/161] fix syncConfigRetryInterval 60s --- .../registry/test/BaseIntegrationTest.java | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java index 83c238b6c..555384489 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java @@ -16,31 +16,6 @@ */ package com.alipay.sofa.registry.test; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; -import static org.junit.Assert.assertTrue; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; - -import org.junit.Before; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ConfigurableApplicationContext; - import com.alipay.remoting.Connection; import com.alipay.sofa.registry.client.api.RegistryClientConfig; import com.alipay.sofa.registry.client.api.SubscriberDataObserver; @@ -60,6 +35,29 @@ import com.alipay.sofa.registry.remoting.jersey.JerseyClient; import com.alipay.sofa.registry.server.data.cache.DatumCache; import com.alipay.sofa.registry.server.test.TestRegistryMain; +import org.junit.Before; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ConfigurableApplicationContext; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.junit.Assert.assertTrue; /** * @author xuanbei 18/12/1 @@ -130,7 +128,7 @@ public static void startServerIfNecessary() throws Exception { private static void initRegistryClientAndChannel() { if (registryClient1 == null) { - RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start() + RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start().setSyncConfigRetryInterval(60000) .setAppName("testApp1").setDataCenter(LOCAL_DATACENTER).setZone(LOCAL_REGION) .setRegistryEndpoint(LOCAL_ADDRESS).setRegistryEndpointPort(sessionPort).build(); registryClient1 = new DefaultRegistryClient(config); From 69f08ee72d0a0f5bf6d75b9e64679a560ecf2d2f Mon Sep 17 00:00:00 2001 From: Synex-wh <241809311@qq.com> Date: Tue, 21 Jan 2020 22:30:35 +0800 Subject: [PATCH 161/161] fix format --- .../com/alipay/sofa/registry/test/BaseIntegrationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java index 555384489..e14332bd5 100644 --- a/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java +++ b/test/src/test/java/com/alipay/sofa/registry/test/BaseIntegrationTest.java @@ -128,8 +128,9 @@ public static void startServerIfNecessary() throws Exception { private static void initRegistryClientAndChannel() { if (registryClient1 == null) { - RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start().setSyncConfigRetryInterval(60000) - .setAppName("testApp1").setDataCenter(LOCAL_DATACENTER).setZone(LOCAL_REGION) + RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start() + .setSyncConfigRetryInterval(60000).setAppName("testApp1") + .setDataCenter(LOCAL_DATACENTER).setZone(LOCAL_REGION) .setRegistryEndpoint(LOCAL_ADDRESS).setRegistryEndpointPort(sessionPort).build(); registryClient1 = new DefaultRegistryClient(config); registryClient1.init();