jepsen-io / jepsen

A framework for distributed systems verification, with fault injection
6.81k stars 719 forks source link

The scaffolding tutorial fails with java.lang.UnsatisfiedLinkError: Can't obtain static newInstance method for class com.sun.jna.Structure at com.sun.jna.Native.initIDs #131

Closed alf239 closed 6 years ago

alf239 commented 8 years ago

Trying to follow https://github.com/aphyr/jepsen/blob/master/doc/scaffolding.md, got the following problem at the step "Next, we'll replace the example test that lein generated (test/jepsen/zookeeper_test.clj) with one that calls the zk-test function, runs the test that function returns, looks at the results, and ensures that the :valid? key is true."

The stack trace is as follows:

alexey@instance-1:~/jepsen.hazelcast$ lein test

lein test jepsen.hazelcast-test

lein test :only jepsen.hazelcast-test/hc-test

ERROR in (hc-test) (FutureTask.java:122)
expected: (:valid? (:results (jepsen/run! (hc/hc-test "3.6.3"))))
  actual: java.util.concurrent.ExecutionException: java.lang.UnsatisfiedLinkError: Can't obtain static newInstance method for class com.sun.jna.Structure
 at java.util.concurrent.FutureTask.report (FutureTask.java:122)
    java.util.concurrent.FutureTask.get (FutureTask.java:192)
    clojure.core$deref_future.invoke (core.clj:2186)
    clojure.core$future_call$reify__6736.deref (core.clj:6683)
    clojure.core$deref.invoke (core.clj:2206)
    clojure.core$pmap$step__6749$fn__6751.invoke (core.clj:6733)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:507)
    clojure.core/seq (core.clj:137)
    clojure.core$dorun.invoke (core.clj:3009)
    clojure.core$doall.invoke (core.clj:3025)
    jepsen.core$run_BANG_$fn__6833.invoke (core.clj:398)
    jepsen.core$run_BANG_.invoke (core.clj:379)
    jepsen.hazelcast_test/fn (hazelcast_test.clj:7)
    clojure.test$test_var$fn__7670.invoke (test.clj:704)
    clojure.test$test_var.invoke (test.clj:704)
    clojure.test$test_vars$fn__7692$fn__7697.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars$fn__7692.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars.invoke (test.clj:718)
    clojure.test$test_all_vars.invoke (test.clj:728)
    clojure.test$test_ns.invoke (test.clj:747)
    clojure.core$map$fn__4553.invoke (core.clj:2624)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1735)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invoke (core.clj:632)
    clojure.test$run_tests.doInvoke (test.clj:762)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:630)
    user$eval85$fn__144$fn__175.invoke (form-init3003048779867791666.clj:1)
    user$eval85$fn__144$fn__145.invoke (form-init3003048779867791666.clj:1)
    user$eval85$fn__144.invoke (form-init3003048779867791666.clj:1)
    user$eval85.invoke (form-init3003048779867791666.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6782)
    clojure.lang.Compiler.eval (Compiler.java:6772)
    clojure.lang.Compiler.load (Compiler.java:7227)
    clojure.lang.Compiler.loadFile (Compiler.java:7165)
    clojure.main$load_script.invoke (main.clj:275)
    clojure.main$init_opt.invoke (main.clj:280)
    clojure.main$initialize.invoke (main.clj:308)
    clojure.main$null_opt.invoke (main.clj:343)
    clojure.main$main.doInvoke (main.clj:421)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Caused by: java.lang.UnsatisfiedLinkError: Can't obtain static newInstance method for class com.sun.jna.Structure
 at com.sun.jna.Native.initIDs (Native.java:-2)
    com.sun.jna.Native.<clinit> (Native.java:135)
    com.jcraft.jsch.agentproxy.usocket.JNAUSocketFactory$CLibrary.<clinit> (JNAUSocketFactory.java:47)
    com.jcraft.jsch.agentproxy.usocket.JNAUSocketFactory.open (JNAUSocketFactory.java:114)
    com.jcraft.jsch.agentproxy.connector.SSHAgentConnector.open (SSHAgentConnector.java:80)
    com.jcraft.jsch.agentproxy.connector.SSHAgentConnector.<init> (SSHAgentConnector.java:48)
    clj_ssh.agent$sock_agent_connector.invoke (agent.clj:15)
    clj_ssh.agent$connect.invoke (agent.clj:35)
    clj_ssh.ssh$ssh_agent.invoke (ssh.clj:148)
    jepsen.control$session.invoke (control.clj:193)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:630)
    clojure.core$with_bindings_STAR_.doInvoke (core.clj:1868)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:634)
    clojure.core$bound_fn_STAR_$fn__4439.doInvoke (core.clj:1890)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:630)
    jepsen.core$fcatch$wrapper__6696.doInvoke (core.clj:55)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$pmap$fn__6744$fn__6745.invoke (core.clj:6729)
    clojure.core$binding_conveyor_fn$fn__4444.invoke (core.clj:1916)
    clojure.lang.AFn.call (AFn.java:18)
    java.util.concurrent.FutureTask.run (FutureTask.java:266)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)
Ran 1 tests containing 1 assertions.
0 failures, 1 errors.
Tests failed.
alexey@instance-1:~/jepsen.hazelcast$

(I did call the test jepsen.hazelcast, but otherwise it's the same dummy test)

The system is as follows:

alexey@instance-1:~$ uname -a
Linux instance-1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux
alexey@instance-1:~$ dpkg -s libjna-java
Package: libjna-java
Status: install ok installed
Priority: optional
Section: java
Installed-Size: 233
Maintainer: Debian Java maintainers <pkg-java-maintainers@lists.alioth.debian.org>
Architecture: all
Version: 4.1.0-1
aphyr commented 8 years ago

Sounds like some sort of JNA problem, but I haven't seen this before so I'm not sure. Perhaps your system java doesn't use that libjna?

alf239 commented 8 years ago

It does sound like that indeed; but I thought JNA is a self-containing .jar? Do I need any special dance for openjdk to use JNA? (I'll google for sure and will report if/when solved, it's just if you happen to know, that'd be great)

alf239 commented 8 years ago

One more question... at https://github.com/aphyr/jepsen, you say that one needs to install libjna-java; but then it's a self-containing jar, and maven/leiningen downloads it just fine on its own—why would one need to install it?

alf239 commented 8 years ago

JNA itself seems to be fine:

alexey@instance-1:~/jna-test$ cat HelloWorld.java 
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {
    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                               CLibrary.class);
        void printf(String format, Object... args);
    }
    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}
alexey@instance-1:~/jna-test$ javac -classpath /usr/share/java/jna.jar HelloWorld.java 
alexey@instance-1:~/jna-test$ java -classpath /usr/share/java/jna.jar:. HelloWorld 
Hello, World
alexey@instance-1:~/jna-test$ 
alf239 commented 8 years ago

The JNA in the maven repo isn't:

alexey@instance-1:~/jna-test$ javac -classpath ~/.m2/repository/net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar HelloWorld.java 
alexey@instance-1:~/jna-test$ java -classpath ~/.m2/repository/net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar:. HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't obtain static newInstance method for class com.sun.jna.Structure
        at com.sun.jna.Native.initIDs(Native Method)
        at com.sun.jna.Native.<clinit>(Native.java:135)
        at HelloWorld$CLibrary.<clinit>(HelloWorld.java:14)
        at HelloWorld.main(HelloWorld.java:21)
alexey@instance-1:~/jna-test$ 

It seems that it might make sense to upgrade JNA in jepsen dependencies...

alf239 commented 8 years ago

Changing the project file to

(defproject jepsen.hazelcast "0.1.0-SNAPSHOT"
  :description "Jepsen: Hazelcast"
  :url "http://www.kamchatkaltd.co.uk/jepsen-hazelcast"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [jepsen "0.0.9" :exclude net.java.dev.jna/jna]
                 [avout "0.5.4"]
                 [net.java.dev.jna/jna "4.1.0"]])

seems to do the trick.

alf239 commented 8 years ago

Yep, it does... @aphyr, will it make any sense to adjust the tutorial and/or the dependencies? I solved the problem for myself by overriding the dependency, but am happy to dig further, e.g. finding a compatible version of jsch.

aphyr commented 8 years ago

Looks like this jna dep is required by com.jcraft/jsch.agentproxy.usocket-jna, which is pulled in by clj-ssh 0.5.14, so if you're having compatibility problems with that jna package, perhaps it's worth filing a ticket on jsch? Since this has (so far) worked for other users, I'm hesitant to add a dep exclusion that could break that support--but I also don't understand JNA that well so I could be wrong.

sani3854 commented 7 years ago

java.lang.ExceptionInInitializerError at com.neurotec.lang.NCore.(NCore.java:140) at com.muzima.biometric.activity.FingerActivity.onCreate(FingerActivity.java:93) at android.app.Activity.performCreate(Activity.java:6010) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) at android.app.ActivityThread.access$800(ActivityThread.java:155) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

How to solution this error

sani3854 commented 7 years ago

java.lang.ExceptionInInitializerError at com.neurotec.lang.NCore.(NCore.java:140) at com.muzima.biometric.activity.FingerActivity.onCreate(FingerActivity.java:93) at android.app.Activity.performCreate(Activity.java:6010) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) at android.app.ActivityThread.access$800(ActivityThread.java:155) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) Caused by: java.lang.UnsatisfiedLinkError: Can't obtain static newInstance method for class com.sun.jna.Structure at com.sun.jna.Native.initIDs(Native Method) at com.sun.jna.Native.(Native.java:135) at com.sun.jna.NativeLibrary.(NativeLibrary.java:67) at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java) at com.neurotec.lang.NCore.(NCore.java:132) at com.muzima.biometric.activity.FingerActivity.onCreate(FingerActivity.java:93)  at android.app.Activity.performCreate(Activity.java:6010)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)  at android.app.ActivityThread.access$800(ActivityThread.java:155)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5343)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

how to solution of this error ??? rep me

aphyr commented 7 years ago

Sounds like your JVM doesn't have JNA set up?