Merge branch 'GOSSIP-89' of https://github.com/Terry-Weymouth/incubator-gossip
This commit is contained in:
@ -1,50 +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 org.apache.gossip.examples;
|
|
||||||
|
|
||||||
public class ExampleCommon {
|
|
||||||
|
|
||||||
private boolean clearTerminalScreen = true;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Look for -s in args. If there, suppress terminal-clear on write results Shift args for
|
|
||||||
* positional args, if necessary
|
|
||||||
*/
|
|
||||||
public String[] checkArgsForClearFlag(String[] args) {
|
|
||||||
int pos = 0;
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
if (args[i].equals("-s")) {
|
|
||||||
clearTerminalScreen = false;
|
|
||||||
} else {
|
|
||||||
// in the case of the -s flag, shift args
|
|
||||||
// down by one slot; this will end up with
|
|
||||||
// a duplicate entry in the last position of args,
|
|
||||||
// but this is ok, because it will be ignored
|
|
||||||
args[pos++] = args[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void optionallyClearTerminal() {
|
|
||||||
if (clearTerminalScreen) {
|
|
||||||
System.out.print("\033[H\033[2J");
|
|
||||||
System.out.flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.apache.gossip.examples;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class RunStandardExamples {
|
||||||
|
|
||||||
|
private static boolean WILL_READ = true;
|
||||||
|
|
||||||
|
private static boolean WILL_NOT_READ = false;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
if ((args.length < 1) || args[0].equals("-h") || args[0].equals("--help") || args.length < 2) {
|
||||||
|
System.out.print(usage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
int example = intFromString(args[0]);
|
||||||
|
int channel = intFromString(args[1]);
|
||||||
|
if ((example < 1) || (example > 4) || (channel < 0) || (channel > 2)) {
|
||||||
|
System.out.print(usage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
runExaple(example, channel);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.print(usage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void runExaple(int exampleNumber, int channel) throws IOException {
|
||||||
|
String[] args = stanardArgs(channel, new String[4]);
|
||||||
|
if (exampleNumber == 1) {
|
||||||
|
StandAloneNode example = new StandAloneNode(args);
|
||||||
|
example.exec(WILL_NOT_READ);
|
||||||
|
} else if (exampleNumber == 2) {
|
||||||
|
StandAloneNodeCrdtOrSet example = new StandAloneNodeCrdtOrSet(args);
|
||||||
|
example.exec(WILL_READ);
|
||||||
|
} else if (exampleNumber == 3) {
|
||||||
|
StandAlonePNCounter example = new StandAlonePNCounter(args);
|
||||||
|
example.exec(WILL_READ);
|
||||||
|
} else if (exampleNumber == 4) {
|
||||||
|
args = extendedArgs(channel, new String[6]);
|
||||||
|
StandAloneDatacenterAndRack example = new StandAloneDatacenterAndRack(args);
|
||||||
|
example.exec(WILL_READ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] stanardArgs(int channel, String[] args) {
|
||||||
|
// see README.md for examples
|
||||||
|
args[0] = "udp://localhost:1000" + channel;
|
||||||
|
args[1] = "" + channel;
|
||||||
|
args[2] = "udp://localhost:10000";
|
||||||
|
args[3] = "0";
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] extendedArgs(int channel, String[] args) {
|
||||||
|
args = stanardArgs(channel, args);
|
||||||
|
// see README.md for examples
|
||||||
|
if (channel == 0) {
|
||||||
|
args[4] = "1";
|
||||||
|
args[5] = "2";
|
||||||
|
}
|
||||||
|
if (channel == 1) {
|
||||||
|
args[4] = "1";
|
||||||
|
args[5] = "3";
|
||||||
|
}
|
||||||
|
if (channel == 2) {
|
||||||
|
args[4] = "2";
|
||||||
|
args[5] = "2";
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int intFromString(String string) {
|
||||||
|
return Integer.parseInt(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String usage() {
|
||||||
|
return "Select and run (usually in a seperate terminal window) \n"
|
||||||
|
+ "one of the the standard Examples,\n" + " 1. StandAloneNode\n"
|
||||||
|
+ " 2. StandAloneNodeCrdtOrSet\n" + " 3. StandAlonePNCounter\n"
|
||||||
|
+ " 4. StandAloneDatacenterAndRack\n" + "(See README.md in this modules)\n" + "\n"
|
||||||
|
+ "Usage: mvn exec:java -Dexec.mainClass=org.apache.gossip.examples.RunStandardExamples -Dexec.args=\"s c\"\n"
|
||||||
|
+ "where...\n" + " s - int - the example number from above\n"
|
||||||
|
+ " c - int - the channel number: 0, 1, or 2\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,8 +18,8 @@
|
|||||||
|
|
||||||
package org.apache.gossip.examples;
|
package org.apache.gossip.examples;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -30,12 +30,20 @@ import org.apache.gossip.manager.DatacenterRackAwareActiveGossiper;
|
|||||||
import org.apache.gossip.manager.GossipManager;
|
import org.apache.gossip.manager.GossipManager;
|
||||||
import org.apache.gossip.manager.GossipManagerBuilder;
|
import org.apache.gossip.manager.GossipManagerBuilder;
|
||||||
|
|
||||||
public class StandAloneDatacenterAndRack {
|
public class StandAloneDatacenterAndRack extends StandAloneExampleBase {
|
||||||
|
|
||||||
private static ExampleCommon common = new ExampleCommon();
|
public static void main(String[] args) throws InterruptedException, IOException {
|
||||||
|
StandAloneDatacenterAndRack example = new StandAloneDatacenterAndRack(args);
|
||||||
|
boolean willRead = true;
|
||||||
|
example.exec(willRead);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws UnknownHostException, InterruptedException {
|
StandAloneDatacenterAndRack(String[] args) {
|
||||||
args = common.checkArgsForClearFlag(args);
|
args = super.checkArgsForClearFlag(args);
|
||||||
|
initGossipManager(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void initGossipManager(String[] args) {
|
||||||
GossipSettings s = new GossipSettings();
|
GossipSettings s = new GossipSettings();
|
||||||
s.setWindowSize(1000);
|
s.setWindowSize(1000);
|
||||||
s.setGossipInterval(100);
|
s.setGossipInterval(100);
|
||||||
@ -48,20 +56,17 @@ public class StandAloneDatacenterAndRack {
|
|||||||
props.put(DatacenterRackAwareActiveGossiper.DATACENTER, args[4]);
|
props.put(DatacenterRackAwareActiveGossiper.DATACENTER, args[4]);
|
||||||
props.put(DatacenterRackAwareActiveGossiper.RACK, args[5]);
|
props.put(DatacenterRackAwareActiveGossiper.RACK, args[5]);
|
||||||
GossipManager manager = GossipManagerBuilder.newBuilder().cluster("mycluster")
|
GossipManager manager = GossipManagerBuilder.newBuilder().cluster("mycluster")
|
||||||
.uri(URI.create(args[0]))
|
.uri(URI.create(args[0])).id(args[1]).gossipSettings(s)
|
||||||
.id(args[1])
|
|
||||||
.gossipSettings(s)
|
|
||||||
.gossipMembers(
|
.gossipMembers(
|
||||||
Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
||||||
.properties(props)
|
.properties(props).build();
|
||||||
.build();
|
|
||||||
manager.init();
|
manager.init();
|
||||||
while (true) {
|
setGossipService(manager);
|
||||||
common.optionallyClearTerminal();
|
|
||||||
System.out.println("Live: " + manager.getLiveMembers());
|
|
||||||
System.out.println("Dead: " + manager.getDeadMembers());
|
|
||||||
Thread.sleep(2000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void printValues(GossipManager gossipService) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.apache.gossip.examples;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.gossip.GossipSettings;
|
||||||
|
import org.apache.gossip.LocalMember;
|
||||||
|
import org.apache.gossip.RemoteMember;
|
||||||
|
import org.apache.gossip.manager.GossipManager;
|
||||||
|
import org.apache.gossip.manager.GossipManagerBuilder;
|
||||||
|
|
||||||
|
abstract class StandAloneExampleBase {
|
||||||
|
private String lastInput = "{none}";
|
||||||
|
|
||||||
|
private boolean clearTerminalScreen = true;
|
||||||
|
|
||||||
|
private GossipManager gossipService = null;
|
||||||
|
|
||||||
|
abstract void printValues(GossipManager gossipService);
|
||||||
|
|
||||||
|
boolean processReadLoopInput(String line) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void exec(boolean willRead) throws IOException {
|
||||||
|
gossipService.init();
|
||||||
|
startMonitorLoop(gossipService);
|
||||||
|
if (willRead) {
|
||||||
|
startBlockingReadLoop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Look for -s in args. If there, suppress terminal-clear on write results: shift args for
|
||||||
|
* positional args, if necessary
|
||||||
|
*/
|
||||||
|
String[] checkArgsForClearFlag(String[] args) {
|
||||||
|
int pos = 0;
|
||||||
|
for (int i = 0; i < args.length; i++) {
|
||||||
|
if (args[i].equals("-s")) {
|
||||||
|
clearTerminalScreen = false;
|
||||||
|
} else {
|
||||||
|
// in the case of the -s flag, shift args
|
||||||
|
// down by one slot; this will end up with
|
||||||
|
// a duplicate entry in the last position of args,
|
||||||
|
// but this is ok, because it will be ignored
|
||||||
|
args[pos++] = args[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void optionallyClearTerminal() {
|
||||||
|
if (clearTerminalScreen) {
|
||||||
|
System.out.print("\033[H\033[2J");
|
||||||
|
System.out.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLastInput(String input, boolean valid) {
|
||||||
|
lastInput = input;
|
||||||
|
if (!valid) {
|
||||||
|
lastInput += " (invalid)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getLastInput() {
|
||||||
|
return lastInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startMonitorLoop(GossipManager gossipService) {
|
||||||
|
new Thread(() -> {
|
||||||
|
while (true) {
|
||||||
|
optionallyClearTerminal();
|
||||||
|
printLiveMembers(gossipService);
|
||||||
|
printDeadMambers(gossipService);
|
||||||
|
printValues(gossipService);
|
||||||
|
try {
|
||||||
|
Thread.sleep(2000);
|
||||||
|
} catch (Exception ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void printLiveMembers(GossipManager gossipService) {
|
||||||
|
List<LocalMember> members = gossipService.getLiveMembers();
|
||||||
|
if (members.isEmpty()) {
|
||||||
|
System.out.println("Live: (none)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.out.println("Live: " + members.get(0));
|
||||||
|
for (int i = 1; i < members.size(); i++) {
|
||||||
|
System.out.println(" : " + members.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void printDeadMambers(GossipManager gossipService) {
|
||||||
|
List<LocalMember> members = gossipService.getDeadMembers();
|
||||||
|
if (members.isEmpty()) {
|
||||||
|
System.out.println("Dead: (none)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.out.println("Dead: " + members.get(0));
|
||||||
|
for (int i = 1; i < members.size(); i++) {
|
||||||
|
System.out.println(" : " + members.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startBlockingReadLoop() throws IOException {
|
||||||
|
String line;
|
||||||
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
System.out.println(line);
|
||||||
|
boolean valid = processReadLoopInput(line);
|
||||||
|
setLastInput(line, valid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initGossipManager(String[] args) {
|
||||||
|
GossipSettings s = new GossipSettings();
|
||||||
|
s.setWindowSize(1000);
|
||||||
|
s.setGossipInterval(100);
|
||||||
|
GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster("mycluster")
|
||||||
|
.uri(URI.create(args[0])).id(args[1])
|
||||||
|
.gossipMembers(Collections
|
||||||
|
.singletonList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
||||||
|
.gossipSettings(s).build();
|
||||||
|
setGossipService(gossipService);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setGossipService(GossipManager gossipService) {
|
||||||
|
this.gossipService = gossipService;
|
||||||
|
}
|
||||||
|
|
||||||
|
GossipManager getGossipManager() {
|
||||||
|
return this.gossipService;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -17,37 +17,26 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.gossip.examples;
|
package org.apache.gossip.examples;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.io.IOException;
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import org.apache.gossip.GossipSettings;
|
|
||||||
import org.apache.gossip.RemoteMember;
|
|
||||||
import org.apache.gossip.manager.GossipManager;
|
import org.apache.gossip.manager.GossipManager;
|
||||||
import org.apache.gossip.manager.GossipManagerBuilder;
|
|
||||||
|
|
||||||
public class StandAloneNode {
|
public class StandAloneNode extends StandAloneExampleBase {
|
||||||
|
|
||||||
private static ExampleCommon common = new ExampleCommon();
|
private static boolean WILL_READ = false;
|
||||||
|
|
||||||
public static void main(String[] args) throws UnknownHostException, InterruptedException {
|
public static void main(String[] args) throws InterruptedException, IOException {
|
||||||
args = common.checkArgsForClearFlag(args);
|
StandAloneNode example = new StandAloneNode(args);
|
||||||
GossipSettings s = new GossipSettings();
|
example.exec(WILL_READ);
|
||||||
s.setWindowSize(1000);
|
|
||||||
s.setGossipInterval(100);
|
|
||||||
GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster("mycluster")
|
|
||||||
.uri(URI.create(args[0]))
|
|
||||||
.id(args[1])
|
|
||||||
.gossipMembers(
|
|
||||||
Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
|
||||||
.gossipSettings(s)
|
|
||||||
.build();
|
|
||||||
gossipService.init();
|
|
||||||
while (true) {
|
|
||||||
common.optionallyClearTerminal();
|
|
||||||
System.out.println("Live: " + gossipService.getLiveMembers());
|
|
||||||
System.out.println("Dead: " + gossipService.getDeadMembers());
|
|
||||||
Thread.sleep(2000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StandAloneNode(String[] args) {
|
||||||
|
args = super.checkArgsForClearFlag(args);
|
||||||
|
super.initGossipManager(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void printValues(GossipManager gossipService) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,85 +17,89 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.gossip.examples;
|
package org.apache.gossip.examples;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import org.apache.gossip.GossipSettings;
|
|
||||||
import org.apache.gossip.RemoteMember;
|
|
||||||
import org.apache.gossip.crdt.GrowOnlyCounter;
|
import org.apache.gossip.crdt.GrowOnlyCounter;
|
||||||
import org.apache.gossip.crdt.OrSet;
|
import org.apache.gossip.crdt.OrSet;
|
||||||
import org.apache.gossip.manager.GossipManager;
|
import org.apache.gossip.manager.GossipManager;
|
||||||
import org.apache.gossip.manager.GossipManagerBuilder;
|
|
||||||
import org.apache.gossip.model.SharedDataMessage;
|
import org.apache.gossip.model.SharedDataMessage;
|
||||||
|
|
||||||
public class StandAloneNodeCrdtOrSet {
|
public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase {
|
||||||
|
|
||||||
private static ExampleCommon common = new ExampleCommon();
|
private static final String INDEX_KEY_FOR_SET = "abc";
|
||||||
|
|
||||||
|
private static final String INDEX_KEY_FOR_COUNTER = "def";
|
||||||
|
|
||||||
public static void main(String[] args) throws InterruptedException, IOException {
|
public static void main(String[] args) throws InterruptedException, IOException {
|
||||||
args = common.checkArgsForClearFlag(args);
|
StandAloneNodeCrdtOrSet example = new StandAloneNodeCrdtOrSet(args);
|
||||||
GossipSettings s = new GossipSettings();
|
boolean willRead = true;
|
||||||
s.setWindowSize(1000);
|
example.exec(willRead);
|
||||||
s.setGossipInterval(100);
|
|
||||||
GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster("mycluster")
|
|
||||||
.uri(URI.create(args[0]))
|
|
||||||
.id(args[1])
|
|
||||||
.gossipMembers(
|
|
||||||
Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
|
||||||
.gossipSettings(s)
|
|
||||||
.build();
|
|
||||||
gossipService.init();
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
while (true) {
|
|
||||||
common.optionallyClearTerminal();
|
|
||||||
System.out.println("Live: " + gossipService.getLiveMembers());
|
|
||||||
System.out.println("Dead: " + gossipService.getDeadMembers());
|
|
||||||
System.out.println("---------- " + (gossipService.findCrdt("abc") == null ? ""
|
|
||||||
: gossipService.findCrdt("abc").value()));
|
|
||||||
System.out.println("********** " + gossipService.findCrdt("abc"));
|
|
||||||
System.out.println("^^^^^^^^^^ " + (gossipService.findCrdt("def") == null ? ""
|
|
||||||
: gossipService.findCrdt("def").value()));
|
|
||||||
System.out.println("$$$$$$$$$$ " + gossipService.findCrdt("def"));
|
|
||||||
try {
|
|
||||||
Thread.sleep(2000);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
|
|
||||||
String line = null;
|
StandAloneNodeCrdtOrSet(String[] args) {
|
||||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
|
args = super.checkArgsForClearFlag(args);
|
||||||
while ((line = br.readLine()) != null) {
|
super.initGossipManager(args);
|
||||||
System.out.println(line);
|
}
|
||||||
|
|
||||||
|
void printValues(GossipManager gossipService) {
|
||||||
|
System.out.println("Last Input: " + getLastInput());
|
||||||
|
System.out.println("---------- Or Set " + (gossipService.findCrdt(INDEX_KEY_FOR_SET) == null
|
||||||
|
? "" : gossipService.findCrdt(INDEX_KEY_FOR_SET).value()));
|
||||||
|
System.out.println("********** " + gossipService.findCrdt(INDEX_KEY_FOR_SET));
|
||||||
|
System.out.println(
|
||||||
|
"^^^^^^^^^^ Grow Only Counter" + (gossipService.findCrdt(INDEX_KEY_FOR_COUNTER) == null
|
||||||
|
? "" : gossipService.findCrdt(INDEX_KEY_FOR_COUNTER).value()));
|
||||||
|
System.out.println("$$$$$$$$$$ " + gossipService.findCrdt(INDEX_KEY_FOR_COUNTER));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean processReadLoopInput(String line) {
|
||||||
|
boolean valid = true;
|
||||||
char op = line.charAt(0);
|
char op = line.charAt(0);
|
||||||
String val = line.substring(2);
|
String val = line.substring(2);
|
||||||
if (op == 'a') {
|
if (op == 'a') {
|
||||||
addData(val, gossipService);
|
addData(val, getGossipManager());
|
||||||
} else if (op == 'r') {
|
} else if (op == 'r') {
|
||||||
removeData(val, gossipService);
|
removeData(val, getGossipManager());
|
||||||
} else if (op == 'g') {
|
} else if (op == 'g') {
|
||||||
gcount(val, gossipService);
|
if (isNonNegativeNumber(val)) {
|
||||||
|
gcount(val, getGossipManager());
|
||||||
|
} else {
|
||||||
|
valid = false;
|
||||||
}
|
}
|
||||||
if (op == 'l') {
|
} else if (op == 'l') {
|
||||||
listen(val, gossipService);
|
if ((val == INDEX_KEY_FOR_SET) || (val == INDEX_KEY_FOR_COUNTER)) {
|
||||||
|
listen(val, getGossipManager());
|
||||||
|
} else {
|
||||||
|
valid = false;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
valid = false;
|
||||||
}
|
}
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isNonNegativeNumber(String val) {
|
||||||
|
long l = 0;
|
||||||
|
try {
|
||||||
|
Long n = Long.parseLong(val);
|
||||||
|
l = n.longValue();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return (l >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void listen(String val, GossipManager gossipManager) {
|
private static void listen(String val, GossipManager gossipManager) {
|
||||||
gossipManager.registerSharedDataSubscriber((key, oldValue, newValue) -> {
|
gossipManager.registerSharedDataSubscriber((key, oldValue, newValue) -> {
|
||||||
if (key.equals(val)) {
|
if (key.equals(val)) {
|
||||||
System.out.println("Event Handler fired! " + oldValue + " " + newValue);
|
System.out.println(
|
||||||
|
"Event Handler fired for key = '" + key + "'! " + oldValue + " " + newValue);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void gcount(String val, GossipManager gossipManager) {
|
private static void gcount(String val, GossipManager gossipManager) {
|
||||||
GrowOnlyCounter c = (GrowOnlyCounter) gossipManager.findCrdt("def");
|
GrowOnlyCounter c = (GrowOnlyCounter) gossipManager.findCrdt(INDEX_KEY_FOR_COUNTER);
|
||||||
Long l = Long.valueOf(val);
|
Long l = Long.valueOf(val);
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
c = new GrowOnlyCounter(new GrowOnlyCounter.Builder(gossipManager).increment((l)));
|
c = new GrowOnlyCounter(new GrowOnlyCounter.Builder(gossipManager).increment((l)));
|
||||||
@ -104,7 +108,7 @@ public class StandAloneNodeCrdtOrSet {
|
|||||||
}
|
}
|
||||||
SharedDataMessage m = new SharedDataMessage();
|
SharedDataMessage m = new SharedDataMessage();
|
||||||
m.setExpireAt(Long.MAX_VALUE);
|
m.setExpireAt(Long.MAX_VALUE);
|
||||||
m.setKey("def");
|
m.setKey(INDEX_KEY_FOR_COUNTER);
|
||||||
m.setPayload(c);
|
m.setPayload(c);
|
||||||
m.setTimestamp(System.currentTimeMillis());
|
m.setTimestamp(System.currentTimeMillis());
|
||||||
gossipManager.merge(m);
|
gossipManager.merge(m);
|
||||||
@ -112,10 +116,10 @@ public class StandAloneNodeCrdtOrSet {
|
|||||||
|
|
||||||
private static void removeData(String val, GossipManager gossipService) {
|
private static void removeData(String val, GossipManager gossipService) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
OrSet<String> s = (OrSet<String>) gossipService.findCrdt("abc");
|
OrSet<String> s = (OrSet<String>) gossipService.findCrdt(INDEX_KEY_FOR_SET);
|
||||||
SharedDataMessage m = new SharedDataMessage();
|
SharedDataMessage m = new SharedDataMessage();
|
||||||
m.setExpireAt(Long.MAX_VALUE);
|
m.setExpireAt(Long.MAX_VALUE);
|
||||||
m.setKey("abc");
|
m.setKey(INDEX_KEY_FOR_SET);
|
||||||
m.setPayload(new OrSet<String>(s, new OrSet.Builder<String>().remove(val)));
|
m.setPayload(new OrSet<String>(s, new OrSet.Builder<String>().remove(val)));
|
||||||
m.setTimestamp(System.currentTimeMillis());
|
m.setTimestamp(System.currentTimeMillis());
|
||||||
gossipService.merge(m);
|
gossipService.merge(m);
|
||||||
@ -124,7 +128,7 @@ public class StandAloneNodeCrdtOrSet {
|
|||||||
private static void addData(String val, GossipManager gossipService) {
|
private static void addData(String val, GossipManager gossipService) {
|
||||||
SharedDataMessage m = new SharedDataMessage();
|
SharedDataMessage m = new SharedDataMessage();
|
||||||
m.setExpireAt(Long.MAX_VALUE);
|
m.setExpireAt(Long.MAX_VALUE);
|
||||||
m.setKey("abc");
|
m.setKey(INDEX_KEY_FOR_SET);
|
||||||
m.setPayload(new OrSet<String>(val));
|
m.setPayload(new OrSet<String>(val));
|
||||||
m.setTimestamp(System.currentTimeMillis());
|
m.setTimestamp(System.currentTimeMillis());
|
||||||
gossipService.merge(m);
|
gossipService.merge(m);
|
||||||
|
@ -17,57 +17,33 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.gossip.examples;
|
package org.apache.gossip.examples;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.gossip.GossipSettings;
|
|
||||||
import org.apache.gossip.LocalMember;
|
|
||||||
import org.apache.gossip.RemoteMember;
|
|
||||||
import org.apache.gossip.crdt.PNCounter;
|
import org.apache.gossip.crdt.PNCounter;
|
||||||
import org.apache.gossip.manager.GossipManager;
|
import org.apache.gossip.manager.GossipManager;
|
||||||
import org.apache.gossip.manager.GossipManagerBuilder;
|
|
||||||
import org.apache.gossip.model.SharedDataMessage;
|
import org.apache.gossip.model.SharedDataMessage;
|
||||||
|
|
||||||
public class StandAlonePNCounter {
|
public class StandAlonePNCounter extends StandAloneExampleBase {
|
||||||
private static ExampleCommon common = new ExampleCommon();
|
|
||||||
private static String lastInput = "{None}";
|
|
||||||
|
|
||||||
public static void main(String[] args) throws InterruptedException, IOException {
|
public static void main(String[] args) throws InterruptedException, IOException {
|
||||||
args = common.checkArgsForClearFlag(args);
|
StandAlonePNCounter example = new StandAlonePNCounter(args);
|
||||||
GossipSettings s = new GossipSettings();
|
boolean willRead = true;
|
||||||
s.setWindowSize(1000);
|
example.exec(willRead);
|
||||||
s.setGossipInterval(100);
|
|
||||||
GossipManager gossipService = GossipManagerBuilder
|
|
||||||
.newBuilder()
|
|
||||||
.cluster("mycluster")
|
|
||||||
.uri(URI.create(args[0])).id(args[1])
|
|
||||||
.gossipMembers(
|
|
||||||
Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3])))
|
|
||||||
.gossipSettings(s)
|
|
||||||
.build();
|
|
||||||
gossipService.init();
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
while (true) {
|
|
||||||
common.optionallyClearTerminal();
|
|
||||||
printLiveMembers(gossipService);
|
|
||||||
printDeadMambers(gossipService);
|
|
||||||
printValues(gossipService);
|
|
||||||
try {
|
|
||||||
Thread.sleep(2000);
|
|
||||||
} catch (Exception ignore) {
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
|
|
||||||
String line = null;
|
StandAlonePNCounter(String[] args) {
|
||||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
|
args = super.checkArgsForClearFlag(args);
|
||||||
while ((line = br.readLine()) != null) {
|
super.initGossipManager(args);
|
||||||
System.out.println(line);
|
}
|
||||||
|
|
||||||
|
void printValues(GossipManager gossipService) {
|
||||||
|
System.out.println("Last Input: " + getLastInput());
|
||||||
|
System.out.println("---------- " + (gossipService.findCrdt("myPNCounter") == null ? ""
|
||||||
|
: gossipService.findCrdt("myPNCounter").value()));
|
||||||
|
System.out.println("********** " + gossipService.findCrdt("myPNCounter"));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean processReadLoopInput(String line) {
|
||||||
char op = line.charAt(0);
|
char op = line.charAt(0);
|
||||||
char blank = line.charAt(1);
|
char blank = line.charAt(1);
|
||||||
String val = line.substring(2);
|
String val = line.substring(2);
|
||||||
@ -78,55 +54,18 @@ public class StandAlonePNCounter {
|
|||||||
} catch (NumberFormatException ex) {
|
} catch (NumberFormatException ex) {
|
||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
valid = valid &&
|
valid = valid && ((blank == ' ') && ((op == 'i') || (op == 'd')));
|
||||||
(
|
|
||||||
(blank == ' ') &&
|
|
||||||
((op == 'i') || (op == 'd'))
|
|
||||||
);
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (op == 'i') {
|
if (op == 'i') {
|
||||||
increment(l, gossipService);
|
increment(l, getGossipManager());
|
||||||
} else if (op == 'd') {
|
} else if (op == 'd') {
|
||||||
decrement(l, gossipService);
|
decrement(l, getGossipManager());
|
||||||
}
|
|
||||||
}
|
|
||||||
setLastInput(line,valid);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void printValues(GossipManager gossipService) {
|
void increment(Long l, GossipManager gossipManager) {
|
||||||
System.out.println("Last Input: " + getLastInput());
|
|
||||||
System.out.println("---------- " + (gossipService.findCrdt("myPNCounter") == null ? ""
|
|
||||||
: gossipService.findCrdt("myPNCounter").value()));
|
|
||||||
System.out.println("********** " + gossipService.findCrdt("myPNCounter"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void printDeadMambers(GossipManager gossipService) {
|
|
||||||
List<LocalMember> members = gossipService.getDeadMembers();
|
|
||||||
if (members.isEmpty()) {
|
|
||||||
System.out.println("Dead: (none)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
System.out.println("Dead: " + members.get(0));
|
|
||||||
for (int i = 1; i < members.size(); i++) {
|
|
||||||
System.out.println(" : " + members.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void printLiveMembers(GossipManager gossipService) {
|
|
||||||
List<LocalMember> members = gossipService.getLiveMembers();
|
|
||||||
if (members.isEmpty()) {
|
|
||||||
System.out.println("Live: (none)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
System.out.println("Live: " + members.get(0));
|
|
||||||
for (int i = 1; i < members.size(); i++) {
|
|
||||||
System.out.println(" : " + members.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void increment(Long l, GossipManager gossipManager) {
|
|
||||||
PNCounter c = (PNCounter) gossipManager.findCrdt("myPNCounter");
|
PNCounter c = (PNCounter) gossipManager.findCrdt("myPNCounter");
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
c = new PNCounter(new PNCounter.Builder(gossipManager).increment((l)));
|
c = new PNCounter(new PNCounter.Builder(gossipManager).increment((l)));
|
||||||
@ -141,7 +80,7 @@ public class StandAlonePNCounter {
|
|||||||
gossipManager.merge(m);
|
gossipManager.merge(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void decrement(Long l, GossipManager gossipManager) {
|
void decrement(Long l, GossipManager gossipManager) {
|
||||||
PNCounter c = (PNCounter) gossipManager.findCrdt("myPNCounter");
|
PNCounter c = (PNCounter) gossipManager.findCrdt("myPNCounter");
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
c = new PNCounter(new PNCounter.Builder(gossipManager).decrement((l)));
|
c = new PNCounter(new PNCounter.Builder(gossipManager).decrement((l)));
|
||||||
@ -156,15 +95,4 @@ public class StandAlonePNCounter {
|
|||||||
gossipManager.merge(m);
|
gossipManager.merge(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setLastInput(String input, boolean valid) {
|
|
||||||
lastInput = input;
|
|
||||||
if (! valid) {
|
|
||||||
lastInput += " (invalid)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getLastInput() {
|
|
||||||
return lastInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user