Skip to content

Commit

Permalink
Create standalone resource server.
Browse files Browse the repository at this point in the history
Move properties from atomix module to atomix-resource-manager.
Remove standalone server example.
properties -> options class naming. This reflects the idea that config can potentially (in the future) be populated by various sources, including properties files.
Use Address host string constructor
Move options to .options packages
  • Loading branch information
jhalterman committed Mar 8, 2016
1 parent f18a105 commit 2afd569
Show file tree
Hide file tree
Showing 25 changed files with 760 additions and 387 deletions.
10 changes: 5 additions & 5 deletions core/src/main/java/io/atomix/AtomixClient.java
Expand Up @@ -23,9 +23,9 @@
import io.atomix.copycat.client.CopycatClient; import io.atomix.copycat.client.CopycatClient;
import io.atomix.manager.ResourceClient; import io.atomix.manager.ResourceClient;
import io.atomix.manager.ResourceServer; import io.atomix.manager.ResourceServer;
import io.atomix.manager.options.ClientOptions;
import io.atomix.resource.Resource; import io.atomix.resource.Resource;
import io.atomix.resource.ResourceType; import io.atomix.resource.ResourceType;
import io.atomix.util.ClientProperties;


import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
Expand Down Expand Up @@ -97,8 +97,8 @@ public static Builder builder(String properties) {
* @return The replica builder. * @return The replica builder.
*/ */
public static Builder builder(Properties properties) { public static Builder builder(Properties properties) {
ClientProperties clientProperties = new ClientProperties(properties); ClientOptions clientProperties = new ClientOptions(properties);
return builder(clientProperties.replicas()) return builder(clientProperties.servers())
.withTransport(clientProperties.transport()) .withTransport(clientProperties.transport())
.withSerializer(clientProperties.serializer()); .withSerializer(clientProperties.serializer());
} }
Expand Down Expand Up @@ -133,8 +133,8 @@ public static Builder builder(Collection<Address> members) {
* Builds the underlying resource client from the given properties. * Builds the underlying resource client from the given properties.
*/ */
private static ResourceClient buildClient(Properties properties) { private static ResourceClient buildClient(Properties properties) {
ClientProperties clientProperties = new ClientProperties(properties); ClientOptions clientProperties = new ClientOptions(properties);
return ResourceClient.builder(clientProperties.replicas()) return ResourceClient.builder(clientProperties.servers())
.withTransport(clientProperties.transport()) .withTransport(clientProperties.transport())
.build(); .build();
} }
Expand Down
38 changes: 27 additions & 11 deletions core/src/main/java/io/atomix/AtomixReplica.java
Expand Up @@ -15,17 +15,40 @@
*/ */
package io.atomix; package io.atomix;


import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.stream.Collectors;

import io.atomix.catalyst.serializer.Serializer; import io.atomix.catalyst.serializer.Serializer;
import io.atomix.catalyst.transport.*; import io.atomix.catalyst.transport.Address;
import io.atomix.catalyst.transport.Client;
import io.atomix.catalyst.transport.Connection;
import io.atomix.catalyst.transport.LocalServerRegistry;
import io.atomix.catalyst.transport.LocalTransport;
import io.atomix.catalyst.transport.Server;
import io.atomix.catalyst.transport.Transport;
import io.atomix.catalyst.util.Assert; import io.atomix.catalyst.util.Assert;
import io.atomix.catalyst.util.ConfigurationException; import io.atomix.catalyst.util.ConfigurationException;
import io.atomix.catalyst.util.Listener; import io.atomix.catalyst.util.Listener;
import io.atomix.catalyst.util.PropertiesReader; import io.atomix.catalyst.util.PropertiesReader;
import io.atomix.catalyst.util.concurrent.ThreadContext; import io.atomix.catalyst.util.concurrent.ThreadContext;
import io.atomix.concurrent.DistributedLock; import io.atomix.concurrent.DistributedLock;
import io.atomix.config.ReplicaOptions;
import io.atomix.copycat.Command; import io.atomix.copycat.Command;
import io.atomix.copycat.Query; import io.atomix.copycat.Query;
import io.atomix.copycat.client.*; import io.atomix.copycat.client.ConnectionStrategies;
import io.atomix.copycat.client.CopycatClient;
import io.atomix.copycat.client.RecoveryStrategies;
import io.atomix.copycat.client.RetryStrategies;
import io.atomix.copycat.client.ServerSelectionStrategies;
import io.atomix.copycat.client.ServerSelectionStrategy;
import io.atomix.copycat.server.CopycatServer; import io.atomix.copycat.server.CopycatServer;
import io.atomix.copycat.server.cluster.Member; import io.atomix.copycat.server.cluster.Member;
import io.atomix.copycat.server.storage.Storage; import io.atomix.copycat.server.storage.Storage;
Expand All @@ -39,13 +62,6 @@
import io.atomix.resource.ResourceType; import io.atomix.resource.ResourceType;
import io.atomix.resource.util.ResourceRegistry; import io.atomix.resource.util.ResourceRegistry;
import io.atomix.util.ClusterBalancer; import io.atomix.util.ClusterBalancer;
import io.atomix.util.ReplicaProperties;

import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.stream.Collectors;


/** /**
* Provides an interface for creating and operating on {@link io.atomix.resource.Resource}s as a stateful node. * Provides an interface for creating and operating on {@link io.atomix.resource.Resource}s as a stateful node.
Expand Down Expand Up @@ -203,8 +219,8 @@ public static Builder builder(String properties) {
* @return The replica builder. * @return The replica builder.
*/ */
public static Builder builder(Properties properties) { public static Builder builder(Properties properties) {
ReplicaProperties replicaProperties = new ReplicaProperties(properties); ReplicaOptions replicaProperties = new ReplicaOptions(properties);
Collection<Address> replicas = replicaProperties.replicas(); Collection<Address> replicas = replicaProperties.servers();
return builder(replicaProperties.clientAddress(), replicaProperties.serverAddress(), replicas) return builder(replicaProperties.clientAddress(), replicaProperties.serverAddress(), replicas)
.withTransport(replicaProperties.transport()) .withTransport(replicaProperties.transport())
.withStorage(Storage.builder() .withStorage(Storage.builder()
Expand Down
62 changes: 62 additions & 0 deletions core/src/main/java/io/atomix/config/ReplicaOptions.java
@@ -0,0 +1,62 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed 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 io.atomix.config;

import java.util.Properties;

import io.atomix.Quorum;
import io.atomix.manager.options.ServerOptions;

/**
* Replica options.
*
* @author <a href="http://github.com/kuujo>Jordan Halterman</a>
*/
public final class ReplicaOptions extends ServerOptions {
public static final String QUORUM_HINT = "cluster.quorumHint";
public static final String BACKUP_COUNT = "cluster.backupCount";

private static final int DEFAULT_QUORUM_HINT = -1;
private static final int DEFAULT_BACKUP_COUNT = 0;

public ReplicaOptions(Properties properties) {
super(properties);
}

/**
* Returns the quorum hint.
*
* @return The quorum hint.
*/
public int quorumHint() {
String quorumHint = reader.getString(QUORUM_HINT, String.valueOf(DEFAULT_QUORUM_HINT));
try {
return Integer.valueOf(quorumHint);
} catch (NumberFormatException e) {
return Quorum.valueOf(quorumHint.trim().toUpperCase()).size();
}
}

/**
* Returns the backup count.
*
* @return The backup count.
*/
public int backupCount() {
return reader.getInteger(BACKUP_COUNT, DEFAULT_BACKUP_COUNT);
}

}
157 changes: 0 additions & 157 deletions core/src/test/java/io/atomix/ReplicaPropertiesTest.java

This file was deleted.

67 changes: 67 additions & 0 deletions core/src/test/java/io/atomix/config/ReplicaOptionsTest.java
@@ -0,0 +1,67 @@
/*
* Copyright 2016 the original author or authors.
*
* Licensed 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 io.atomix.config;

import static org.testng.Assert.assertEquals;

import java.util.Properties;

import org.testng.annotations.Test;

import io.atomix.catalyst.util.PropertiesReader;

/**
* Replica options test.
*
* @author <a href="http://github.com/kuujo>Jordan Halterman</a>
*/
@Test
public class ReplicaOptionsTest {

/**
* Tests default server properties.
*/
public void testPropertyDefaults() {
ReplicaOptions options = new ReplicaOptions(new Properties());
assertEquals(options.quorumHint(), -1);
assertEquals(options.backupCount(), 0);
}

/**
* Tests reading properties.
*/
public void testProperties() {
Properties properties = new Properties();
properties.setProperty("cluster.quorumHint", "3");
properties.setProperty("cluster.backupCount", "1");

ReplicaOptions options = new ReplicaOptions(properties);

assertEquals(options.quorumHint(), 3);
assertEquals(options.backupCount(), 1);
}

/**
* Tests reading properties from a file.
*/
public void testPropertiesFile() {
ReplicaOptions options = new ReplicaOptions(PropertiesReader.loadFromClasspath("replica-test.properties").properties());

assertEquals(options.quorumHint(), 3);
assertEquals(options.backupCount(), 1);
}

}

0 comments on commit 2afd569

Please sign in to comment.