Skip to content

Commit

Permalink
Use the right classloader to load the native library
Browse files Browse the repository at this point in the history
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
  • Loading branch information
fab-10 committed Feb 27, 2024
1 parent be738e7 commit e1f07d6
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package net.consensys.linea;

import lombok.extern.slf4j.Slf4j;
import net.consensys.linea.compress.LibCompress;
import net.consensys.linea.config.LineaL1L2BridgeCliOptions;
import net.consensys.linea.config.LineaL1L2BridgeConfiguration;
import net.consensys.linea.config.LineaTransactionSelectorCliOptions;
Expand All @@ -38,6 +39,11 @@ public abstract class AbstractLineaSharedOptionsPlugin implements BesuPlugin {
protected static LineaTransactionValidatorConfiguration transactionValidatorConfiguration;
protected static LineaL1L2BridgeConfiguration l1L2BridgeConfiguration;

static {
// force the initialization of the gnark compress native library to fail fast in case of issues
LibCompress.CompressedSize(new byte[0], 0);
}

@Override
public synchronized void register(final BesuContext context) {
if (!cliOptionsRegistered) {
Expand Down
15 changes: 9 additions & 6 deletions native/compress/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,16 @@

plugins {
id 'java-library'
id 'maven-publish'
id 'com.jfrog.artifactory' version '4.20.0'
id 'common-plugins'
id 'com.github.hierynomus.license'
}

apply from: rootProject.file("gradle/java.gradle")
apply from: rootProject.file("gradle/dependency-management.gradle")
apply from: rootProject.file('gradle/common-dependencies.gradle')
apply from: rootProject.file("gradle/build-aliases.gradle")
apply from: rootProject.file("gradle/check-licenses.gradle")
apply from: rootProject.file("gradle/lint.gradle")

repositories {
mavenCentral()
Expand Down Expand Up @@ -82,7 +87,7 @@ jar {
'Specification-Version': project.version,
'Implementation-Title': archiveBaseName,
'Implementation-Version': project.version,
'Automatic-Module-Name': 'org.consensys.nativelib.compress'
'Automatic-Module-Name': 'net.consensys.nativelib.compress'
)
}
}
Expand All @@ -98,6 +103,4 @@ sourceSets {
srcDirs '${buildDir}/linux-gnu-aarch64'
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -15,53 +15,57 @@
*/
package net.consensys.linea.compress;

import com.sun.jna.Native;

import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;

/**
* Java interface to compress
*/
import com.sun.jna.Native;
import lombok.extern.slf4j.Slf4j;

/** Java interface to compress */
@Slf4j
public class LibCompress {

@SuppressWarnings("WeakerAccess")
public static final boolean ENABLED;
@SuppressWarnings("WeakerAccess")
public static final boolean ENABLED;

static {
boolean enabled;
try {
final File compressJni = Native.extractFromResourcePath("compress_jni");
Native.register(LibCompress.class, compressJni.getAbsolutePath());
static {
try {
final File compressJni =
Native.extractFromResourcePath("compress_jni", LibCompress.class.getClassLoader());
Native.register(LibCompress.class, compressJni.getAbsolutePath());

Path dictFilePath = Files.createTempFile("tempCompressor_dict", "bin");
try (InputStream stream = LibCompress.class.getClassLoader().getResourceAsStream("compressor_dict.bin")) {
Files.copy(stream, dictFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
dictFilePath.toFile().deleteOnExit();
} catch (Exception e) {
System.out.println("Problem creating temp file from compressor_dict.bin resource: " + e.getMessage());
dictFilePath.toFile().delete();
System.exit(-1);
}
Path dictFilePath = Files.createTempFile("tempCompressor_dict", "bin");
try (InputStream stream =
LibCompress.class.getClassLoader().getResourceAsStream("compressor_dict.bin")) {
Files.copy(stream, dictFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
dictFilePath.toFile().deleteOnExit();
} catch (Exception e) {
log.error(
"Problem creating temp file from compressor_dict.bin resource: " + e.getMessage());
dictFilePath.toFile().delete();
System.exit(1);
}

final String dictPath = dictFilePath.toAbsolutePath().toString();
if (!Init(dictPath)) {
throw new RuntimeException(Error());
}
enabled = true;
} catch (final Throwable t) {
t.printStackTrace();
enabled = false;
}
ENABLED = enabled;
final String dictPath = dictFilePath.toAbsolutePath().toString();
if (!Init(dictPath)) {
throw new RuntimeException(Error());
}
log.info(
"Loaded compress_jni native library from {} with compressor_dict {}",
compressJni,
dictPath);
} catch (final Throwable t) {
log.error("Error loading native compress_jni library", t);
System.exit(1);
}
ENABLED = true;
}

public static native boolean Init(String dictPath);

public static native boolean Init(String dictPath);

public static native int CompressedSize(
byte[] i, int i_len);
public static native int CompressedSize(byte[] i, int i_len);

public static native String Error();
}
public static native String Error();
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,29 @@
*/
package net.consensys.linea.compress;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

public class LibCompressTest {
@Test
public void testCompressZeroes() {
byte[] zeroes = new byte[128];
int size = LibCompress.CompressedSize(zeroes, 128);

// should not error
assertThat(size).isGreaterThan(0);

// should have compressed into 1 backref + header, must be less than 10
assertThat(size).isLessThan(10);
}

@Test
public void testCompressTooLargeInput() {
byte[] zeroes = new byte[512*1024];
int size = LibCompress.CompressedSize(zeroes, 512*1024);

// should error --> too large payload.
assertThat(size).isLessThan(0);
}
import org.junit.jupiter.api.Test;

}
public class LibCompressTest {
@Test
public void testCompressZeroes() {
byte[] zeroes = new byte[128];
int size = LibCompress.CompressedSize(zeroes, 128);

// should not error
assertThat(size).isGreaterThan(0);

// should have compressed into 1 backref + header, must be less than 10
assertThat(size).isLessThan(10);
}

@Test
public void testCompressTooLargeInput() {
byte[] zeroes = new byte[512 * 1024];
int size = LibCompress.CompressedSize(zeroes, 512 * 1024);

// should error --> too large payload.
assertThat(size).isLessThan(0);
}
}

0 comments on commit e1f07d6

Please sign in to comment.