Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Run java-tron on ARM - AWS Arm-based Graviton2 instances / Apple M1 #4132

Closed
air3ijai opened this issue Oct 24, 2021 · 7 comments
Closed

Run java-tron on ARM - AWS Arm-based Graviton2 instances / Apple M1 #4132

air3ijai opened this issue Oct 24, 2021 · 7 comments

Comments

@air3ijai
Copy link

air3ijai commented Oct 24, 2021

1. What did you do?

We are trying to run FullNode.jar on x2gd.large ARM based instance with Amazon Corretto installed, but get the error:

# Install Amazon Corretto 8
amazon-linux-extras install corretto8

# Install Java Tron
mkdir java-tron
cd java-tron
curl -L https://github.com/tronprotocol/java-tron/releases/download/GreatVoyage-v4.4.1/FullNode.jar -o FullNode-4.4.1.jar
curl https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/main_net_config.conf -o main_net_config.conf

# Run java-tron
java -Xmx25g -XX:+UseConcMarkSweepGC -jar FullNode-4.4.1.jar -d data -c main_net_config.conf

And get the error

Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: org.tron.core.config.DefaultConfig
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:410)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:263)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:130)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
	at org.tron.program.FullNode.main(FullNode.java:76)
Caused by: java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni766752390673739481.so: /tmp/librocksdbjni766752390673739481.so: cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
	at java.lang.Runtime.load0(Runtime.java:810)
	at java.lang.System.load(System.java:1088)
	at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:78)
	at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:56)
	at org.rocksdb.RocksDB.loadLibrary(RocksDB.java:64)
	at org.rocksdb.RocksDB.<clinit>(RocksDB.java:35)
	at org.tron.core.config.DefaultConfig.<clinit>(DefaultConfig.java:30)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:397)
	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
	at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:135)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:107)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:400)
	... 6 more

2. What did you expect to see?

We should be able to run java-tron on ARM based architecture.

3. What did you see instead?

For now we are running java-tron on x86-64 architecture.

During last years Amazon WS introduced a lot of ARM based instances and they have a great performance and affordable price. Also, Apple started a movement to the ARM architecture which is actual for Developers. It will be great to have an option to run java-tron using ARM architecture.

Thank you!

@Benson0224
Copy link
Contributor

can you share your java version info

@air3ijai
Copy link
Author

We are use Amazon Corretto 8

java -version
openjdk version "1.8.0_302"
OpenJDK Runtime Environment Corretto-8.302.08.1 (build 1.8.0_302-b08)
OpenJDK 64-Bit Server VM Corretto-8.302.08.1 (build 25.302-b08, mixed mode)

@air3ijai
Copy link
Author

air3ijai commented Oct 25, 2021

And one more try with Oracle Java

Get Oracle Java for ARM

curl -L https://javadl.oracle.com/webapps/download/AutoDL?BundleId=243705_61ae65e088624f5aaa0b1d2d801acb16 -o jdk-8u271-linux-aarch64.rpm

Install Oracle Java for ARM

yum install jdk-8u271-linux-aarch64.rpm

Check Java version

java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

Get java-tron and config

mkdir java-tron
cd java-tron
curl -L https://github.com/tronprotocol/java-tron/releases/download/GreatVoyage-v4.4.1/FullNode.jar -o FullNode-4.4.1.jar
curl https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/main_net_config.conf -o main_net_config.conf

Run java-tron

java -Xmx25g -XX:+UseConcMarkSweepGC -jar FullNode-4.4.1.jar -d data -c main_net_config.conf

Get the error

Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: org.tron.core.config.DefaultConfig
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:410)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:263)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:130)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
	at org.tron.program.FullNode.main(FullNode.java:76)
Caused by: java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni9042101356528469660.so: /tmp/librocksdbjni9042101356528469660.so: cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
	at java.lang.Runtime.load0(Runtime.java:810)
	at java.lang.System.load(System.java:1086)
	at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:78)
	at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:56)
	at org.rocksdb.RocksDB.loadLibrary(RocksDB.java:64)
	at org.rocksdb.RocksDB.<clinit>(RocksDB.java:35)
	at org.tron.core.config.DefaultConfig.<clinit>(DefaultConfig.java:30)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:397)
	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
	at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:135)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:107)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:400)
	... 6 more

@Benson0224
Copy link
Contributor

Looks like your system does not have Librocksdb.so
I would suggest you google and install the related lib and try again.

@air3ijai
Copy link
Author

air3ijai commented Oct 25, 2021

Java on Graviton

It is a shared library and should be included in the jar?

Check GutHub jar

Get FullNode-4.4.1.jar

curl -L https://github.com/tronprotocol/java-tron/releases/download/GreatVoyage-v4.4.1/FullNode.jar -o FullNode-4.4.1.jar

Check for shared libraries

jar xvf FullNode-4.4.1.jar | grep ".*.so$"
 inflated: native-package/linux/libzksnarkjni.so
 inflated: org/sqlite/native/FreeBSD/x86_64/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/android-arm/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/arm/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/armv6/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/armv7/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/ppc64/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/x86/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/x86_64/libsqlitejdbc.so
 inflated: META-INF/native/linux32/libleveldbjni.so
 inflated: META-INF/native/linux64/libleveldbjni.so
 inflated: META-INF/native/freebsd32/libjansi.so
 inflated: META-INF/native/freebsd64/libjansi.so
 inflated: META-INF/native/linux32/libjansi.so
 inflated: META-INF/native/linux64/libjansi.so
 inflated: librocksdbjni-linux-ppc64le.so
 inflated: librocksdbjni-linux32.so
 inflated: librocksdbjni-linux64.so

We see only

librocksdbjni-linux-ppc64le.so
librocksdbjni-linux32.so
librocksdbjni-linux64.so

Build on x86 a jar with RocksDB for ARM

Install Oracle JDK 8

curl -L https://github.com/frekele/oracle-java/releases/download/8u92-b14/jdk-8u92-linux-x64.rpm -o jdk-8u92-linux-x64.rpm
yum -y install jdk-8u92-linux-x64.rpm

Get java-tron sources

git clone https://github.com/tronprotocol/java-tron.git
cd java-tron

Use RocksDB 6.2.2 - facebook/rocksdb#5559 (comment)

sed -i "s/'rocksdbjni', version: '5.15.10'/'rocksdbjni', version: '6.2.2'/" common/build.gradle

Build the application

./gradlew build -x test -Dorg.gradle.jvmargs=-Xmx16g
BUILD SUCCESSFUL in 2m 45s
64 actionable tasks: 64 executed

Check the new build

jar xvf /opt/java-tron/build/libs/FullNode.jar | grep ".*.so$"
 inflated: native-package/linux/libzksnarkjni.so
 inflated: org/sqlite/native/FreeBSD/x86_64/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/android-arm/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/arm/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/armv6/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/armv7/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/ppc64/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/x86/libsqlitejdbc.so
 inflated: org/sqlite/native/Linux/x86_64/libsqlitejdbc.so
 inflated: META-INF/native/linux32/libleveldbjni.so
 inflated: META-INF/native/linux64/libleveldbjni.so
 inflated: META-INF/native/freebsd32/libjansi.so
 inflated: META-INF/native/freebsd64/libjansi.so
 inflated: META-INF/native/linux32/libjansi.so
 inflated: META-INF/native/linux64/libjansi.so
 inflated: librocksdbjni-linux-aarch64.so
 inflated: librocksdbjni-linux-ppc64le.so
 inflated: librocksdbjni-linux32.so
 inflated: librocksdbjni-linux64.so

We see shared library for arm64 included in the jar

librocksdbjni-linux-aarch64.so
librocksdbjni-linux-ppc64le.so
librocksdbjni-linux32.so
librocksdbjni-linux64.so

Run on ARM

OS

uname -a
Linux x2gd.medium-arm 4.14.246-187.474.amzn2.aarch64 #1 SMP Tue Sep 7 21:48:09 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

Get config from GitHub

mkdir java-tron
cd java-tron
curl https://raw.githubusercontent.com/tronprotocol/tron-deployment/master/main_net_config.conf -o main_net_config.conf

Run jar builded on x86 on ARM node

java -Xmx10g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c main_net_config.conf

Get the error again

Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: org.tron.core.config.DefaultConfig
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:410)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:263)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:130)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520)
	at org.tron.program.FullNode.main(FullNode.java:76)
Caused by: java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni4764689028666132559.so: /tmp/librocksdbjni4764689028666132559.so: cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
	at java.lang.Runtime.load0(Runtime.java:810)
	at java.lang.System.load(System.java:1086)
	at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:79)
	at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:57)
	at org.rocksdb.RocksDB.loadLibrary(RocksDB.java:63)
	at org.rocksdb.RocksDB.<clinit>(RocksDB.java:34)
	at org.tron.core.config.DefaultConfig.<clinit>(DefaultConfig.java:30)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:397)
	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
	at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:135)
	at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:107)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:400)
	... 6 more

Any suggestions?

@Benson0224
Copy link
Contributor

@air3ijai
This may help:
fusesource/leveldbjni#102

@Benson0224
Copy link
Contributor

Thanks for your contribution to java-tron.
This issue will be closed as no update for a long time.
Please feel free to re-open it if you still see the issue, thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants