Search in sources :

Example 6 with ServerList

use of com.netflix.exhibitor.core.state.ServerList in project exhibitor by soabase.

the class TestRollingConfigChange method testChange.

@Test
public void testChange() throws Exception {
    ServerList serverList = new ServerList("1:one,2:two,3:three");
    RemoteInstanceRequestClient mockClient = new RemoteInstanceRequestClient() {

        @Override
        public void close() throws IOException {
        }

        @Override
        public <T> T getWebResource(URI remoteUri, MediaType type, Class<T> clazz) throws Exception {
            return clazz.cast("foo");
        }
    };
    ActivityLog log = new ActivityLog(100);
    ActivityQueue activityQueue = new ActivityQueue();
    Exhibitor mockExhibitor = Mockito.mock(Exhibitor.class);
    MonitorRunningInstance mockMonitorRunningInstance = makeMockMonitorRunningInstance();
    Mockito.when(mockExhibitor.getMonitorRunningInstance()).thenReturn(mockMonitorRunningInstance);
    Mockito.when(mockExhibitor.getLog()).thenReturn(log);
    Mockito.when(mockExhibitor.getActivityQueue()).thenReturn(activityQueue);
    Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn("one");
    Mockito.when(mockExhibitor.getRemoteInstanceRequestClient()).thenReturn(mockClient);
    final AtomicLong modified = new AtomicLong(1);
    ConfigProvider provider = new ConfigProvider() {

        private volatile ConfigCollection config = new PropertyBasedInstanceConfig(new Properties(), new Properties());

        @Override
        public void start() throws Exception {
        }

        @Override
        public void close() throws IOException {
        }

        @Override
        public LoadedInstanceConfig loadConfig() throws Exception {
            return new LoadedInstanceConfig(config, modified.get());
        }

        @Override
        public PseudoLock newPseudoLock() throws Exception {
            return null;
        }

        @Override
        public LoadedInstanceConfig storeConfig(ConfigCollection config, long compareVersion) throws Exception {
            this.config = config;
            modified.incrementAndGet();
            return loadConfig();
        }
    };
    InstanceState state = new InstanceState(serverList, InstanceStateTypes.SERVING, new RestartSignificantConfig(null));
    ConfigManager manager = new ConfigManager(mockExhibitor, provider, 10);
    manager.start();
    try {
        Properties properties = new Properties();
        properties.setProperty(PropertyBasedInstanceConfig.toName(StringConfigs.SERVERS_SPEC, PropertyBasedInstanceConfig.ROOT_PROPERTY_PREFIX), serverList.toSpecString());
        PropertyBasedInstanceConfig config = new PropertyBasedInstanceConfig(properties, DefaultProperties.get(null));
        manager.startRollingConfig(config.getRootConfig(), null);
        for (String hostname : manager.getRollingConfigState().getRollingHostNames()) {
            Assert.assertTrue(manager.isRolling());
            RollingReleaseState rollingState = new RollingReleaseState(state, manager.getCollection());
            Assert.assertEquals(rollingState.getCurrentRollingHostname(), hostname);
            Assert.assertNull(manager.getRollingConfigAdvanceAttempt());
            Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn(hostname);
            long lastModified = modified.get();
            manager.checkRollingConfig(state);
            Assert.assertTrue(modified.get() > lastModified);
        }
        Assert.assertFalse(manager.isRolling());
    } finally {
        CloseableUtils.closeQuietly(manager);
    }
}
Also used : ActivityLog(com.netflix.exhibitor.core.activity.ActivityLog) Properties(java.util.Properties) URI(java.net.URI) MonitorRunningInstance(com.netflix.exhibitor.core.state.MonitorRunningInstance) AtomicLong(java.util.concurrent.atomic.AtomicLong) InstanceState(com.netflix.exhibitor.core.state.InstanceState) ActivityQueue(com.netflix.exhibitor.core.activity.ActivityQueue) Exhibitor(com.netflix.exhibitor.core.Exhibitor) ServerList(com.netflix.exhibitor.core.state.ServerList) MediaType(javax.ws.rs.core.MediaType) RemoteInstanceRequestClient(com.netflix.exhibitor.core.automanage.RemoteInstanceRequestClient) RestartSignificantConfig(com.netflix.exhibitor.core.state.RestartSignificantConfig) Test(org.testng.annotations.Test)

Example 7 with ServerList

use of com.netflix.exhibitor.core.state.ServerList in project exhibitor by soabase.

the class TestRollingConfigChange method testFailedQuorum.

@Test
public void testFailedQuorum() throws Exception {
    ServerList serverList = new ServerList("1:one,2:two,3:three");
    RemoteInstanceRequestClient mockClient = new RemoteInstanceRequestClient() {

        @Override
        public void close() throws IOException {
        }

        @Override
        public <T> T getWebResource(URI remoteUri, MediaType type, Class<T> clazz) throws Exception {
            return clazz.cast("foo");
        }
    };
    ActivityLog log = new ActivityLog(100);
    ActivityQueue activityQueue = new ActivityQueue();
    Exhibitor mockExhibitor = Mockito.mock(Exhibitor.class);
    MonitorRunningInstance mockMonitorRunningInstance = makeMockMonitorRunningInstance();
    Mockito.when(mockExhibitor.getMonitorRunningInstance()).thenReturn(mockMonitorRunningInstance);
    Mockito.when(mockExhibitor.getLog()).thenReturn(log);
    Mockito.when(mockExhibitor.getActivityQueue()).thenReturn(activityQueue);
    Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn("one");
    Mockito.when(mockExhibitor.getRemoteInstanceRequestClient()).thenReturn(mockClient);
    final AtomicLong modified = new AtomicLong(1);
    ConfigProvider provider = new ConfigProvider() {

        private volatile ConfigCollection config = new PropertyBasedInstanceConfig(new Properties(), new Properties());

        @Override
        public void start() throws Exception {
        }

        @Override
        public void close() throws IOException {
        }

        @Override
        public LoadedInstanceConfig loadConfig() throws Exception {
            return new LoadedInstanceConfig(config, modified.get());
        }

        @Override
        public PseudoLock newPseudoLock() throws Exception {
            return null;
        }

        @Override
        public LoadedInstanceConfig storeConfig(ConfigCollection config, long compareVersion) throws Exception {
            this.config = config;
            modified.incrementAndGet();
            return loadConfig();
        }
    };
    InstanceState state = new InstanceState(serverList, InstanceStateTypes.NOT_SERVING, new RestartSignificantConfig(null));
    final AtomicBoolean hasBeenCanceled = new AtomicBoolean(false);
    ConfigManager manager = new ConfigManager(mockExhibitor, provider, 10) {

        @Override
        public synchronized void cancelRollingConfig(CancelMode mode) throws Exception {
            super.cancelRollingConfig(mode);
            hasBeenCanceled.set(true);
        }
    };
    manager.start();
    try {
        Properties properties = new Properties();
        properties.setProperty(PropertyBasedInstanceConfig.toName(StringConfigs.SERVERS_SPEC, PropertyBasedInstanceConfig.ROOT_PROPERTY_PREFIX), serverList.toSpecString());
        PropertyBasedInstanceConfig config = new PropertyBasedInstanceConfig(properties, DefaultProperties.get(null));
        manager.startRollingConfig(config.getRootConfig(), null);
        String hostname = manager.getRollingConfigState().getRollingHostNames().get(0);
        Assert.assertTrue(manager.isRolling());
        RollingReleaseState rollingState = new RollingReleaseState(state, manager.getCollection());
        Assert.assertEquals(rollingState.getCurrentRollingHostname(), hostname);
        Assert.assertNull(manager.getRollingConfigAdvanceAttempt());
        Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn(hostname);
        for (int i = 0; i < (ConfigManager.DEFAULT_MAX_ATTEMPTS - 1); ++i) {
            long lastModified = modified.get();
            manager.checkRollingConfig(state);
            Assert.assertFalse(modified.get() > lastModified);
            Assert.assertFalse(hasBeenCanceled.get());
        }
        manager.checkRollingConfig(state);
        Assert.assertTrue(hasBeenCanceled.get());
        Assert.assertFalse(manager.isRolling());
    } finally {
        CloseableUtils.closeQuietly(manager);
    }
}
Also used : ActivityLog(com.netflix.exhibitor.core.activity.ActivityLog) Properties(java.util.Properties) URI(java.net.URI) MonitorRunningInstance(com.netflix.exhibitor.core.state.MonitorRunningInstance) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) AtomicLong(java.util.concurrent.atomic.AtomicLong) InstanceState(com.netflix.exhibitor.core.state.InstanceState) ActivityQueue(com.netflix.exhibitor.core.activity.ActivityQueue) Exhibitor(com.netflix.exhibitor.core.Exhibitor) ServerList(com.netflix.exhibitor.core.state.ServerList) MediaType(javax.ws.rs.core.MediaType) RemoteInstanceRequestClient(com.netflix.exhibitor.core.automanage.RemoteInstanceRequestClient) RestartSignificantConfig(com.netflix.exhibitor.core.state.RestartSignificantConfig) Test(org.testng.annotations.Test)

Example 8 with ServerList

use of com.netflix.exhibitor.core.state.ServerList in project exhibitor by soabase.

the class TestRollingConfigChange method testLongQuorumSuccess.

@Test
public void testLongQuorumSuccess() throws Exception {
    ServerList serverList = new ServerList("1:one");
    RemoteInstanceRequestClient mockClient = new RemoteInstanceRequestClient() {

        @Override
        public void close() throws IOException {
        }

        @Override
        public <T> T getWebResource(URI remoteUri, MediaType type, Class<T> clazz) throws Exception {
            throw new Exception();
        }
    };
    ActivityLog log = new ActivityLog(100);
    ActivityQueue activityQueue = new ActivityQueue();
    Exhibitor mockExhibitor = Mockito.mock(Exhibitor.class);
    MonitorRunningInstance mockMonitorRunningInstance = makeMockMonitorRunningInstance();
    Mockito.when(mockExhibitor.getMonitorRunningInstance()).thenReturn(mockMonitorRunningInstance);
    Mockito.when(mockExhibitor.getLog()).thenReturn(log);
    Mockito.when(mockExhibitor.getActivityQueue()).thenReturn(activityQueue);
    Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn("one");
    Mockito.when(mockExhibitor.getRemoteInstanceRequestClient()).thenReturn(mockClient);
    ConfigProvider provider = new ConfigWrapper(new AtomicLong(1));
    Properties properties = new Properties();
    properties.setProperty(PropertyBasedInstanceConfig.toName(StringConfigs.SERVERS_SPEC, PropertyBasedInstanceConfig.ROOT_PROPERTY_PREFIX), serverList.toSpecString());
    properties.setProperty(PropertyBasedInstanceConfig.toName(StringConfigs.SERVERS_SPEC, PropertyBasedInstanceConfig.ROLLING_PROPERTY_PREFIX), serverList.toSpecString());
    properties.setProperty(PropertyBasedInstanceConfig.PROPERTY_ROLLING_HOSTNAMES, "one");
    properties.setProperty(PropertyBasedInstanceConfig.PROPERTY_ROLLING_HOSTNAMES_INDEX, "0");
    PropertyBasedInstanceConfig config = new PropertyBasedInstanceConfig(properties, DefaultProperties.get(null));
    provider.storeConfig(config, 0);
    final int MAX_ATTEMPTS = 3;
    ConfigManager manager = new ConfigManager(mockExhibitor, provider, 10, MAX_ATTEMPTS);
    manager.start();
    try {
        InstanceState instanceState = new InstanceState(serverList, InstanceStateTypes.NOT_SERVING, new RestartSignificantConfig(null));
        for (int i = 0; i < (MAX_ATTEMPTS - 1); ++i) {
            manager.checkRollingConfig(instanceState);
            Assert.assertTrue(manager.isRolling());
        }
        manager.checkRollingConfig(instanceState);
        Assert.assertFalse(manager.isRolling());
    } finally {
        CloseableUtils.closeQuietly(manager);
    }
}
Also used : ActivityLog(com.netflix.exhibitor.core.activity.ActivityLog) Properties(java.util.Properties) URI(java.net.URI) IOException(java.io.IOException) MonitorRunningInstance(com.netflix.exhibitor.core.state.MonitorRunningInstance) AtomicLong(java.util.concurrent.atomic.AtomicLong) InstanceState(com.netflix.exhibitor.core.state.InstanceState) ActivityQueue(com.netflix.exhibitor.core.activity.ActivityQueue) Exhibitor(com.netflix.exhibitor.core.Exhibitor) ServerList(com.netflix.exhibitor.core.state.ServerList) MediaType(javax.ws.rs.core.MediaType) RemoteInstanceRequestClient(com.netflix.exhibitor.core.automanage.RemoteInstanceRequestClient) RestartSignificantConfig(com.netflix.exhibitor.core.state.RestartSignificantConfig) Test(org.testng.annotations.Test)

Example 9 with ServerList

use of com.netflix.exhibitor.core.state.ServerList in project exhibitor by soabase.

the class ClusterResource method getClusterAsJson.

@Path("list")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getClusterAsJson() throws Exception {
    InstanceConfig config = context.getExhibitor().getConfigManager().getConfig();
    ObjectNode node = JsonNodeFactory.instance.objectNode();
    ArrayNode serversNode = JsonNodeFactory.instance.arrayNode();
    ServerList serverList = new ServerList(config.getString(StringConfigs.SERVERS_SPEC));
    for (ServerSpec spec : serverList.getSpecs()) {
        serversNode.add(spec.getHostname());
    }
    node.put("servers", serversNode);
    node.put("port", config.getInt(IntConfigs.CLIENT_PORT));
    return JsonUtil.writeValueAsString(node);
}
Also used : ServerSpec(com.netflix.exhibitor.core.state.ServerSpec) InstanceConfig(com.netflix.exhibitor.core.config.InstanceConfig) ObjectNode(org.codehaus.jackson.node.ObjectNode) ServerList(com.netflix.exhibitor.core.state.ServerList) ArrayNode(org.codehaus.jackson.node.ArrayNode) Path(javax.ws.rs.Path) Produces(javax.ws.rs.Produces) GET(javax.ws.rs.GET)

Example 10 with ServerList

use of com.netflix.exhibitor.core.state.ServerList in project exhibitor by soabase.

the class TestRollingConfigChange method testDownLastInstance.

@Test
public void testDownLastInstance() throws Exception {
    ServerList serverList = new ServerList("1:one,2:two,3:three");
    RemoteInstanceRequestClient mockClient = new RemoteInstanceRequestClient() {

        @Override
        public void close() throws IOException {
        }

        @Override
        public <T> T getWebResource(URI remoteUri, MediaType type, Class<T> clazz) throws Exception {
            if (remoteUri.getHost().equals("two")) {
                throw new Exception();
            }
            return clazz.cast("foo");
        }
    };
    ActivityLog log = new ActivityLog(100);
    ActivityQueue activityQueue = new ActivityQueue();
    Exhibitor mockExhibitor = Mockito.mock(Exhibitor.class);
    MonitorRunningInstance mockMonitorRunningInstance = makeMockMonitorRunningInstance();
    Mockito.when(mockExhibitor.getMonitorRunningInstance()).thenReturn(mockMonitorRunningInstance);
    Mockito.when(mockExhibitor.getLog()).thenReturn(log);
    Mockito.when(mockExhibitor.getActivityQueue()).thenReturn(activityQueue);
    Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn("one");
    Mockito.when(mockExhibitor.getRemoteInstanceRequestClient()).thenReturn(mockClient);
    final AtomicLong modified = new AtomicLong(1);
    ConfigProvider provider = new ConfigProvider() {

        private volatile ConfigCollection config = new PropertyBasedInstanceConfig(new Properties(), new Properties());

        @Override
        public void start() throws Exception {
        }

        @Override
        public void close() throws IOException {
        }

        @Override
        public LoadedInstanceConfig loadConfig() throws Exception {
            return new LoadedInstanceConfig(config, modified.get());
        }

        @Override
        public PseudoLock newPseudoLock() throws Exception {
            return null;
        }

        @Override
        public LoadedInstanceConfig storeConfig(ConfigCollection config, long compareVersion) throws Exception {
            this.config = config;
            modified.incrementAndGet();
            return loadConfig();
        }
    };
    InstanceState state = new InstanceState(serverList, InstanceStateTypes.SERVING, new RestartSignificantConfig(null));
    ConfigManager manager = new ConfigManager(mockExhibitor, provider, 10);
    manager.start();
    try {
        Properties properties = new Properties();
        properties.setProperty(PropertyBasedInstanceConfig.toName(StringConfigs.SERVERS_SPEC, PropertyBasedInstanceConfig.ROOT_PROPERTY_PREFIX), serverList.toSpecString());
        PropertyBasedInstanceConfig config = new PropertyBasedInstanceConfig(properties, DefaultProperties.get(null));
        manager.startRollingConfig(config.getRootConfig(), null);
        for (String hostname : manager.getRollingConfigState().getRollingHostNames()) {
            if (hostname.equals("two")) {
                Assert.assertFalse(manager.isRolling());
                continue;
            }
            Assert.assertTrue(manager.isRolling());
            RollingReleaseState rollingState = new RollingReleaseState(state, manager.getCollection());
            Assert.assertEquals(rollingState.getCurrentRollingHostname(), hostname);
            Assert.assertNull(manager.getRollingConfigAdvanceAttempt());
            Mockito.when(mockExhibitor.getThisJVMHostname()).thenReturn(hostname);
            long lastModified = modified.get();
            manager.checkRollingConfig(state);
            if (// the next will be the down instance "two"
            hostname.equals("three")) {
                for (// don't check last time as it's cleared on MAX
                int i = 1; // don't check last time as it's cleared on MAX
                i < ConfigManager.DEFAULT_MAX_ATTEMPTS; // don't check last time as it's cleared on MAX
                ++i) {
                    Assert.assertNotNull(manager.getRollingConfigAdvanceAttempt());
                    Assert.assertEquals(manager.getRollingConfigAdvanceAttempt().getAttemptCount(), i);
                    manager.checkRollingConfig(state);
                }
            }
            Assert.assertTrue(modified.get() > lastModified);
        }
        Assert.assertFalse(manager.isRolling());
    } finally {
        CloseableUtils.closeQuietly(manager);
    }
}
Also used : ActivityLog(com.netflix.exhibitor.core.activity.ActivityLog) Properties(java.util.Properties) URI(java.net.URI) IOException(java.io.IOException) MonitorRunningInstance(com.netflix.exhibitor.core.state.MonitorRunningInstance) AtomicLong(java.util.concurrent.atomic.AtomicLong) InstanceState(com.netflix.exhibitor.core.state.InstanceState) ActivityQueue(com.netflix.exhibitor.core.activity.ActivityQueue) Exhibitor(com.netflix.exhibitor.core.Exhibitor) ServerList(com.netflix.exhibitor.core.state.ServerList) MediaType(javax.ws.rs.core.MediaType) RemoteInstanceRequestClient(com.netflix.exhibitor.core.automanage.RemoteInstanceRequestClient) RestartSignificantConfig(com.netflix.exhibitor.core.state.RestartSignificantConfig) Test(org.testng.annotations.Test)

Aggregations

ServerList (com.netflix.exhibitor.core.state.ServerList)16 ServerSpec (com.netflix.exhibitor.core.state.ServerSpec)7 Exhibitor (com.netflix.exhibitor.core.Exhibitor)6 ActivityLog (com.netflix.exhibitor.core.activity.ActivityLog)6 ActivityQueue (com.netflix.exhibitor.core.activity.ActivityQueue)6 RemoteInstanceRequestClient (com.netflix.exhibitor.core.automanage.RemoteInstanceRequestClient)6 MonitorRunningInstance (com.netflix.exhibitor.core.state.MonitorRunningInstance)6 URI (java.net.URI)6 Properties (java.util.Properties)6 AtomicLong (java.util.concurrent.atomic.AtomicLong)6 MediaType (javax.ws.rs.core.MediaType)6 Test (org.testng.annotations.Test)6 InstanceState (com.netflix.exhibitor.core.state.InstanceState)5 RestartSignificantConfig (com.netflix.exhibitor.core.state.RestartSignificantConfig)5 InstanceConfig (com.netflix.exhibitor.core.config.InstanceConfig)4 ServerStatus (com.netflix.exhibitor.core.entities.ServerStatus)4 IOException (java.io.IOException)4 GET (javax.ws.rs.GET)4 Path (javax.ws.rs.Path)4 Produces (javax.ws.rs.Produces)4