Search in sources :

Example 1 with Event

use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.

the class DistributedDatabaseOperateImpl method init.

protected void init() throws Exception {
    this.dataSourceService = (LocalDataSourceServiceImpl) DynamicDataSource.getInstance().getDataSource();
    // Because in Raft + Derby mode, ensuring data consistency depends on the Raft's
    // log playback and snapshot recovery capabilities, and the last data must be cleared
    this.dataSourceService.cleanAndReopenDerby();
    this.jdbcTemplate = dataSourceService.getJdbcTemplate();
    this.transactionTemplate = dataSourceService.getTransactionTemplate();
    // Registers a Derby Raft state machine failure event for node degradation processing
    NotifyCenter.registerToSharePublisher(RaftDbErrorEvent.class);
    // Register the snapshot load event
    NotifyCenter.registerToSharePublisher(DerbyLoadEvent.class);
    NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorEvent>() {

        @Override
        public void onEvent(RaftDbErrorEvent event) {
            dataSourceService.setHealthStatus("DOWN");
        }

        @Override
        public Class<? extends Event> subscribeType() {
            return RaftDbErrorEvent.class;
        }
    });
    NotifyCenter.registerToPublisher(ConfigDumpEvent.class, NotifyCenter.ringBufferSize);
    NotifyCenter.registerSubscriber(new DumpConfigHandler());
    this.protocol.addRequestProcessors(Collections.singletonList(this));
    LogUtil.DEFAULT_LOG.info("use DistributedTransactionServicesImpl");
}
Also used : DumpConfigHandler(com.alibaba.nacos.config.server.service.dump.DumpConfigHandler) RaftDbErrorEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent) Event(com.alibaba.nacos.common.notify.Event) DerbyLoadEvent(com.alibaba.nacos.config.server.model.event.DerbyLoadEvent) ConfigDumpEvent(com.alibaba.nacos.config.server.model.event.ConfigDumpEvent) RaftDbErrorEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent)

Example 2 with Event

use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.

the class NamingEventPublisher method handleEvent.

private void handleEvent(Event event) {
    Class<? extends Event> eventType = event.getClass();
    Set<Subscriber<? extends Event>> subscribers = subscribes.get(eventType);
    if (null == subscribers) {
        if (Loggers.EVT_LOG.isDebugEnabled()) {
            Loggers.EVT_LOG.debug("[NotifyCenter] No subscribers for slow event {}", eventType.getName());
        }
        return;
    }
    for (Subscriber subscriber : subscribers) {
        notifySubscriber(subscriber, event);
    }
}
Also used : Subscriber(com.alibaba.nacos.common.notify.listener.Subscriber) Event(com.alibaba.nacos.common.notify.Event)

Example 3 with Event

use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.

the class ServerMemberManager method memberChange.

synchronized boolean memberChange(Collection<Member> members) {
    if (members == null || members.isEmpty()) {
        return false;
    }
    boolean isContainSelfIp = members.stream().anyMatch(ipPortTmp -> Objects.equals(localAddress, ipPortTmp.getAddress()));
    if (isContainSelfIp) {
        isInIpList = true;
    } else {
        isInIpList = false;
        members.add(this.self);
        Loggers.CLUSTER.warn("[serverlist] self ip {} not in serverlist {}", self, members);
    }
    // If the number of old and new clusters is different, the cluster information
    // must have changed; if the number of clusters is the same, then compare whether
    // there is a difference; if there is a difference, then the cluster node changes
    // are involved and all recipients need to be notified of the node change event
    boolean hasChange = members.size() != serverList.size();
    ConcurrentSkipListMap<String, Member> tmpMap = new ConcurrentSkipListMap<>();
    Set<String> tmpAddressInfo = new ConcurrentHashSet<>();
    for (Member member : members) {
        final String address = member.getAddress();
        Member existMember = serverList.get(address);
        if (existMember == null) {
            hasChange = true;
            tmpMap.put(address, member);
        } else {
            // to keep extendInfo and abilities that report dynamically.
            tmpMap.put(address, existMember);
        }
        if (NodeState.UP.equals(member.getState())) {
            tmpAddressInfo.add(address);
        }
    }
    serverList = tmpMap;
    memberAddressInfos = tmpAddressInfo;
    Collection<Member> finalMembers = allMembers();
    // that the event publication is sequential
    if (hasChange) {
        Loggers.CLUSTER.warn("[serverlist] updated to : {}", finalMembers);
        MemberUtil.syncToFile(finalMembers);
        Event event = MembersChangeEvent.builder().members(finalMembers).build();
        NotifyCenter.publishEvent(event);
    } else {
        if (Loggers.CLUSTER.isDebugEnabled()) {
            Loggers.CLUSTER.debug("[serverlist] not updated, is still : {}", finalMembers);
        }
    }
    return hasChange;
}
Also used : ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) ConcurrentHashSet(com.alibaba.nacos.common.utils.ConcurrentHashSet) WebServerInitializedEvent(org.springframework.boot.web.context.WebServerInitializedEvent) Event(com.alibaba.nacos.common.notify.Event)

Example 4 with Event

use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.

the class ServerMemberManager_ITCase method testMemberHealthCheck.

@Test
public void testMemberHealthCheck() throws Exception {
    AtomicReference<Collection<Member>> healthMembers = new AtomicReference<>();
    CountDownLatch first = new CountDownLatch(1);
    CountDownLatch second = new CountDownLatch(1);
    NotifyCenter.registerSubscriber(new Subscriber<MembersChangeEvent>() {

        @Override
        public void onEvent(MembersChangeEvent event) {
            System.out.println(event);
            healthMembers.set(MemberUtil.selectTargetMembers(event.getMembers(), member -> !NodeState.DOWN.equals(member.getState())));
            if (first.getCount() == 1) {
                first.countDown();
                return;
            }
            if (second.getCount() == 1) {
                second.countDown();
            }
        }

        @Override
        public Class<? extends Event> subscribeType() {
            return MembersChangeEvent.class;
        }
    });
    String firstIp = "127.0.0.1:8847";
    String secondIp = "127.0.0.1:8848";
    String thirdIp = "127.0.0.1:8849";
    Map<String, Member> map = new HashMap<>(4);
    map.put(firstIp, Member.builder().ip("127.0.0.1").port(8847).state(NodeState.UP).build());
    map.put(secondIp, Member.builder().ip("127.0.0.1").port(8848).state(NodeState.UP).build());
    map.put(thirdIp, Member.builder().ip("127.0.0.1").port(8849).state(NodeState.UP).build());
    Set<Member> firstMemberList = new HashSet<>(map.values());
    memberManager.memberJoin(map.values());
    first.await();
    Set<Member> copy = new HashSet<>(firstMemberList);
    copy.removeAll(healthMembers.get());
    Assert.assertEquals(2, copy.size());
    Member member = map.get(firstIp);
    member.setState(NodeState.DOWN);
    Assert.assertTrue(memberManager.update(member));
    second.await();
    copy = new HashSet<>(firstMemberList);
    copy.removeAll(healthMembers.get());
    Assert.assertEquals(3, copy.size());
    Assert.assertTrue(copy.contains(map.get(firstIp)));
}
Also used : HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) CountDownLatch(java.util.concurrent.CountDownLatch) MembersChangeEvent(com.alibaba.nacos.core.cluster.MembersChangeEvent) Collection(java.util.Collection) MembersChangeEvent(com.alibaba.nacos.core.cluster.MembersChangeEvent) Event(com.alibaba.nacos.common.notify.Event) BeforeClass(org.junit.BeforeClass) AfterClass(org.junit.AfterClass) Member(com.alibaba.nacos.core.cluster.Member) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 5 with Event

use of com.alibaba.nacos.common.notify.Event in project nacos by alibaba.

the class ConfigDerbyRaft_DITCase method test_h_derby_has_error.

@Test
public void test_h_derby_has_error() throws Exception {
    ThreadUtils.sleep(5000);
    boolean result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
    Assert.assertTrue(result);
    NotifyCenter.registerToPublisher(RaftDbErrorRecoverEvent.class, 8);
    CountDownLatch latch1 = new CountDownLatch(1);
    NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorEvent>() {

        @Override
        public void onEvent(RaftDbErrorEvent event) {
            latch1.countDown();
        }

        @Override
        public Class<? extends Event> subscribeType() {
            return RaftDbErrorEvent.class;
        }
    });
    NotifyCenter.publishEvent(new RaftDbErrorEvent());
    latch1.await(10_000L, TimeUnit.MILLISECONDS);
    result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
    Assert.assertFalse(result);
    CountDownLatch latch2 = new CountDownLatch(1);
    NotifyCenter.registerSubscriber(new Subscriber<RaftDbErrorRecoverEvent>() {

        @Override
        public void onEvent(RaftDbErrorRecoverEvent event) {
            latch2.countDown();
        }

        @Override
        public Class<? extends Event> subscribeType() {
            return RaftDbErrorRecoverEvent.class;
        }
    });
    NotifyCenter.publishEvent(new RaftDbErrorRecoverEvent());
    latch2.await(10_000L, TimeUnit.MILLISECONDS);
    result = iconfig7.publishConfig("raft_test_raft_error", "cluster_test_1", "this.is.raft_cluster=lessspring_7");
    Assert.assertTrue(result);
}
Also used : RaftDbErrorRecoverEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorRecoverEvent) RaftDbErrorRecoverEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorRecoverEvent) RaftDbErrorEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent) Event(com.alibaba.nacos.common.notify.Event) BeforeClass(org.junit.BeforeClass) CountDownLatch(java.util.concurrent.CountDownLatch) RaftDbErrorEvent(com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent) Test(org.junit.Test) BaseClusterTest(com.alibaba.nacos.test.base.BaseClusterTest)

Aggregations

Event (com.alibaba.nacos.common.notify.Event)11 Test (org.junit.Test)6 Subscriber (com.alibaba.nacos.common.notify.listener.Subscriber)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 BeforeClass (org.junit.BeforeClass)3 RaftDbErrorEvent (com.alibaba.nacos.config.server.model.event.RaftDbErrorEvent)2 Member (com.alibaba.nacos.core.cluster.Member)2 MembersChangeEvent (com.alibaba.nacos.core.cluster.MembersChangeEvent)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 AfterClass (org.junit.AfterClass)2 InstancesChangeEvent (com.alibaba.nacos.client.naming.event.InstancesChangeEvent)1 ConcurrentHashSet (com.alibaba.nacos.common.utils.ConcurrentHashSet)1 ConfigDataChangeEvent (com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent)1 ConfigDumpEvent (com.alibaba.nacos.config.server.model.event.ConfigDumpEvent)1 DerbyLoadEvent (com.alibaba.nacos.config.server.model.event.DerbyLoadEvent)1 LocalDataChangeEvent (com.alibaba.nacos.config.server.model.event.LocalDataChangeEvent)1 RaftDbErrorRecoverEvent (com.alibaba.nacos.config.server.model.event.RaftDbErrorRecoverEvent)1 DumpConfigHandler (com.alibaba.nacos.config.server.service.dump.DumpConfigHandler)1 TpsControlRuleChangeEvent (com.alibaba.nacos.core.remote.control.TpsControlRuleChangeEvent)1 ConnectionLimitRuleChangeEvent (com.alibaba.nacos.core.remote.event.ConnectionLimitRuleChangeEvent)1