Skip to content

Commit

Permalink
[server] fix dynamic jar loading; [client] better force new; [all] be…
Browse files Browse the repository at this point in the history
…tter docker image generation
  • Loading branch information
otrack committed Jan 23, 2021
1 parent 5f9a71e commit f45fc73
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 39 deletions.
42 changes: 25 additions & 17 deletions client/src/main/java/org/crucial/dso/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

import org.crucial.dso.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
* A client interface for DSO.
Expand All @@ -15,8 +12,6 @@
*/
public class Client {

//

private static Client client;

@Deprecated
Expand All @@ -43,16 +38,25 @@ public synchronized static Client getClient() {
return client;
}

//

private Factory factory;
private boolean forceNew;

public Client(){ factory = Factory.get(); }

public Client(String server) { factory = Factory.get(server); }

public Client(String server, long seed) { factory = Factory.get(server, seed); }

public Client(Client client) {
this.factory = client.factory;
}

public Client withForceNew(){
Client ret = new Client(this);
ret.forceNew = true;
return ret;
}

public Logger getLog(String name) {
return factory.getInstanceOf(Logger.class, name);
}
Expand All @@ -61,13 +65,13 @@ public <V> List<V> getAtomicList(String name) {
return factory.getInstanceOf(AtomicList.class, name);
}

public <T> Future<T> getFuture(String name, boolean forceNew) {
public <T> Future<T> getFuture(String name) {
return forceNew ? factory.getInstanceOf(Future.class, name)
: factory.getInstanceOf(Future.class, name, false, false, false);
: factory.getInstanceOf(Future.class, name, false, false, this.forceNew);
}

public MonitorCyclicBarrier getMonitorCyclicBarrier(String name, int parties) {
return factory.getInstanceOf(MonitorCyclicBarrier.class, name, false, false, false, name, parties);
return factory.getInstanceOf(MonitorCyclicBarrier.class, name, false, false, this.forceNew, name, parties);
}

public CyclicBarrier getCyclicBarrier(String name, int parties) {
Expand All @@ -93,31 +97,31 @@ public Semaphore getSemaphore(String name) {
}

public Semaphore getSemaphore(String name, int permits) {
return factory.getInstanceOf(Semaphore.class, name, false, false, false, name, permits);
return factory.getInstanceOf(Semaphore.class, name, false, false, this.forceNew, name, permits);
}

public AtomicLong getAtomicLong(String name) {
return getAtomicLong(name, (long)0);
}

public AtomicLong getAtomicLong(String name, long initialValue) {
return factory.getInstanceOf(AtomicLong.class, name, false, false, false, name, initialValue);
return factory.getInstanceOf(AtomicLong.class, name, false, false, this.forceNew, name, initialValue);
}

public AtomicByteArray getAtomicByteArray(String name) {
return factory.getInstanceOf(AtomicByteArray.class, name);
}

public AtomicBoolean getAtomicBoolean(String name, boolean initialValue) {
return factory.getInstanceOf(AtomicBoolean.class, name, false, false, false, name, initialValue);
return factory.getInstanceOf(AtomicBoolean.class, name, false, false, this.forceNew, name, initialValue);
}

public AtomicBoolean getAtomicBoolean(String name) {
return factory.getInstanceOf(AtomicBoolean.class, name);
}

public AtomicCounter getAtomicCounter(String name, int initialValue) {
return factory.getInstanceOf(AtomicCounter.class, name, false, false, false, name, initialValue);
return factory.getInstanceOf(AtomicCounter.class, name, false, false, this.forceNew, name, initialValue);
}

public Map getMap(){
Expand All @@ -128,12 +132,16 @@ public AtomicMap getAtomicMap(String name) {
return factory.getInstanceOf(AtomicMap.class, name);
}

public AtomicMatrix getAtomicMatrix(String name, Class clazz, int n, int m) {
return factory.getInstanceOf(AtomicMatrix.class, name, false, false, false, name, clazz, n, m);
public AtomicMatrix getAtomicMatrix(String name, Class clazz, Object zero, int n, int m) {
return factory.getInstanceOf(AtomicMatrix.class, name, false, false, this.forceNew, name, clazz, zero, n, m);
}

public AtomicMatrix getAtomicMatrix(String name) {
return factory.getInstanceOf(AtomicMatrix.class, name, false, false, this.forceNew);
}

public Blob getAtomicBlob(String name) {
return factory.getInstanceOf(Blob.class, name, false, false, false);
return factory.getInstanceOf(Blob.class, name, false, false, this.forceNew);
}

public CountDownLatch getCountDownLatch(String name, int parties) {
Expand Down
5 changes: 4 additions & 1 deletion client/src/test/bin/image.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ if [ -z "${DOCKER_USER}" ]; then
DOCKER_USER=0track
fi

DIR=$(dirname "$0")
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
IMAGE=${DOCKER_USER}/dso-client-tests:${TAG}
DOCKERFILE=${DIR}/../docker/Dockerfile

pushd ${DIR}/../../../

# package
mvn clean package -DskipTests

Expand All @@ -28,3 +30,4 @@ docker build \
# push image
docker push "${IMAGE}"

popd
5 changes: 4 additions & 1 deletion server/src/main/bin/image.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ if [ -z "${DOCKER_USER}" ]; then
DOCKER_USER=0track
fi

DIR=$(dirname "$0")
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
IMAGE=${DOCKER_USER}/dso-server:${TAG}
DOCKERFILE=${DIR}/../docker/Dockerfile

pushd ${DIR}/../../../

# package
mvn clean package -DskipTests

Expand All @@ -31,3 +33,4 @@ docker build \
# push image
docker push "${IMAGE}"

popd
4 changes: 2 additions & 2 deletions server/src/main/bin/server.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ fi

cp ${CONFIG} jgroups.xml

JVM="${JVM_EXTRA} -Djava.net.preferIPv4Stack=true -Djgroups.tcp.address=${IP}"
JVM="${JVM_EXTRA} -Djava.net.preferIPv4Stack=true -Djgroups.tcp.address=${IP} --add-opens java.base/jdk.internal.loader=ALL-UNNAMED"
CMD="java -ea -cp \"${CLASSPATH}\" ${JVM} org.crucial.dso.Server -server ${IP}:${PORT} ${EXTRA}"
echo ${CMD}
bash -c "$CMD"
bash -c "$CMD"
49 changes: 32 additions & 17 deletions server/src/main/java/org/crucial/dso/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,19 @@
import org.infinispan.test.AbstractCacheTest;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.jboss.marshalling.serial.Serial;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import sun.misc.Signal;
import sun.misc.SignalHandler;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -88,14 +94,23 @@ public void doMain(String[] args) {
return;
}

List<String> jars = new ArrayList<>();
Runnable runnable = () -> {
File folder = new File(userLib);
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile() && file.getName().matches(".*\\.jar")) {
loadLibrary(file);
try {
File folder = new File(userLib);
log.info("Looking for user jars in "+userLib);
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile() && file.getName().matches(".*\\.jar") && !jars.contains(file.getName())) {
loadLibrary(file);
jars.add(file.getName()); // FIXME checksum for re-loading?
}
}
} catch (Exception e) {
e.printStackTrace();
return;
}

};

try {
Expand All @@ -105,7 +120,7 @@ public void doMain(String[] args) {
}

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(runnable, 3, 3, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(runnable, 10, 10, TimeUnit.SECONDS);

String host = server.split(":")[0];
int port = Integer.valueOf(
Expand Down Expand Up @@ -192,18 +207,18 @@ public void doMain(String[] args) {

public static synchronized void loadLibrary(java.io.File jar) {
try {
java.net.URLClassLoader loader = (java.net.URLClassLoader) ClassLoader.getSystemClassLoader();
java.net.URL url = jar.toURI().toURL();
for (java.net.URL it : loader.getURLs()) {
if (it.equals(url)) {
return;
}
}
System.out.println("Loading " + jar.getName());
java.lang.reflect.Method method = java.net.URLClassLoader.class.
getDeclaredMethod("addURL", java.net.URL.class);
method.setAccessible(true); /*promote the method to public access*/
method.invoke(loader, url);
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
try {
Method method = classLoader.getClass().getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, jar.toURI().toURL());
} catch (NoSuchMethodException e) {
Method method = classLoader.getClass()
.getDeclaredMethod("appendToClassPathForInstrumentation", String.class);
method.setAccessible(true);
method.invoke(classLoader, jar.getPath());
}
} catch (final java.lang.NoSuchMethodException |
java.lang.IllegalAccessException |
java.net.MalformedURLException |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class StateMachineInterceptor extends ClusteringInterceptor {
@Override
public java.lang.Object visitClearCommand(InvocationContext ctx, ClearCommand command) throws Throwable {

log.trace(" Clearing all");
log.info(" Clearing all objects");

responseCache.clearAll();
return super.visitClearCommand(ctx, command);
Expand Down

0 comments on commit f45fc73

Please sign in to comment.