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

feat(java-binding): bundle jni library to jar #10229

Merged
merged 5 commits into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/connector-node-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:

echo "--- build connector node"
cd ${RISINGWAVE_ROOT}/java
mvn --batch-mode --update-snapshots clean package
mvn --batch-mode --update-snapshots clean package -Dno-build-rust

echo "--- install postgresql client"
sudo apt install postgresql postgresql-contrib libpq-dev
Expand Down
4 changes: 1 addition & 3 deletions ci/scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,11 @@ cargo build \
-p risingwave_sqlsmith \
-p risingwave_compaction_test \
-p risingwave_backup_cmd \
-p risingwave_java_binding \
-p risingwave_e2e_extended_mode_test \
$RISINGWAVE_FEATURE_FLAGS \
--profile "$profile"

# the file name suffix of artifact for risingwave_java_binding is so only for linux. It is dylib for MacOS
artifacts=(risingwave sqlsmith compaction-test backup-restore risingwave_regress_test risingwave_e2e_extended_mode_test risedev-dev delete-range-test librisingwave_java_binding.so)
artifacts=(risingwave sqlsmith compaction-test backup-restore risingwave_regress_test risingwave_e2e_extended_mode_test risedev-dev delete-range-test)

echo "--- Show link info"
ldd target/"$profile"/risingwave
Expand Down
20 changes: 0 additions & 20 deletions ci/scripts/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,3 @@ function download_and_prepare_rw() {
cargo make pre-start-dev
cargo make link-all-in-one-binaries
}

# Arguments:
# $1: cargo build `profile` of the binaries
function download_java_binding() {
echo "--- Download java binding"
if [ -z "$1" ]; then
echo "download_java_binding: missing argument profile"
exit 1
fi

profile=$1

echo -e "\033[33mDownload artifacts\033[0m"

mkdir -p target/debug
download-and-decompress-artifact librisingwave_java_binding.so-"$profile" target/debug
mv target/debug/librisingwave_java_binding.so-"$profile" target/debug/librisingwave_java_binding.so

export RW_JAVA_BINDING_LIB_PATH=${PWD}/target/debug
}
4 changes: 0 additions & 4 deletions ci/scripts/e2e-iceberg-sink-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ shift $((OPTIND -1))

download_and_prepare_rw "$profile" source

download_java_binding "$profile"

export RW_CONNECTOR_RPC_SINK_PAYLOAD_FORMAT=stream_chunk

echo "--- Download connector node package"
buildkite-agent artifact download risingwave-connector.tar.gz ./
mkdir ./connector-node
Expand Down
5 changes: 0 additions & 5 deletions ci/scripts/e2e-sink-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,6 @@ shift $((OPTIND -1))

download_and_prepare_rw "$profile" source

download_java_binding "$profile"

# TODO: Switch to stream_chunk encoding once it's completed, and then remove json encoding as well as this env var.
export RW_CONNECTOR_RPC_SINK_PAYLOAD_FORMAT=stream_chunk

# Change process number limit
echo "--- os limits"
ulimit -a
Expand Down
2 changes: 0 additions & 2 deletions ci/scripts/e2e-source-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ shift $((OPTIND -1))

download_and_prepare_rw "$profile" source

download_java_binding "$profile"

echo "--- Download connector node package"
buildkite-agent artifact download risingwave-connector.tar.gz ./
mkdir ./connector-node
Expand Down
4 changes: 1 addition & 3 deletions ci/scripts/java-binding-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ shift $((OPTIND -1))

download_and_prepare_rw "$profile" source

download_java_binding "$profile"

echo "--- starting risingwave cluster"
cargo make ci-start java-binding-demo

echo "--- Build java binding demo"
cargo make build-java-binding-java
cargo make build-java-binding

echo "--- ingest data and run java binding"
cargo make ingest-data-and-run-java-binding
Expand Down
8 changes: 2 additions & 6 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ RUN rustup self update \

RUN cargo fetch

RUN cargo build -p risingwave_cmd_all -p risingwave_java_binding --release --features "rw-static-link" && \
RUN cargo build -p risingwave_cmd_all --release --features "rw-static-link" && \
mkdir -p /risingwave/bin && mv /risingwave/target/release/risingwave /risingwave/bin/ && \
mkdir -p /risingwave/lib && mv /risingwave/target/release/librisingwave_java_binding.so /risingwave/lib && \
cargo clean
mkdir -p /risingwave/lib && cargo clean

RUN cd /risingwave/java && mvn -B package -Dmaven.test.skip=true && \
mkdir -p /risingwave/bin/connector-node && \
Expand All @@ -52,9 +51,6 @@ RUN mkdir -p /risingwave/bin/connector-node && mkdir -p /risingwave/lib
COPY --from=builder /risingwave/bin/risingwave /risingwave/bin/risingwave
COPY --from=builder /risingwave/bin/connector-node /risingwave/bin/connector-node
COPY --from=builder /risingwave/ui /risingwave/ui
COPY --from=builder /risingwave/lib/librisingwave_java_binding.so /risingwave/lib/librisingwave_java_binding.so
# Set java.library.path env to /risingwave/lib
ENV RW_JAVA_BINDING_LIB_PATH /risingwave/lib
# Set default playground mode to docker-playground profile
ENV PLAYGROUND_PROFILE docker-playground
# Set default dashboard UI to local path instead of github proxy
Expand Down
8 changes: 2 additions & 6 deletions docker/Dockerfile.hdfs
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@ ARG JAVA_HOME_PATH
ENV JAVA_HOME ${JAVA_HOME_PATH}
ENV LD_LIBRARY_PATH ${JAVA_HOME_PATH}/lib/server:${LD_LIBRARY_PATH}

RUN cargo build -p risingwave_cmd_all -p risingwave_java_binding --release --features "static-link static-log-level" && \
RUN cargo build -p risingwave_cmd_all --release --features "static-link static-log-level" && \
mkdir -p /risingwave/bin && mv /risingwave/target/release/risingwave /risingwave/bin/ && \
mkdir -p /risingwave/lib && mv /risingwave/target/release/librisingwave_java_binding.so /risingwave/lib && \
cargo clean
mkdir -p /risingwave/lib && cargo clean

RUN cd /risingwave/java && mvn -B package -Dmaven.test.skip=true && \
mkdir -p /risingwave/bin/connector-node && \
Expand All @@ -57,7 +56,6 @@ RUN mkdir -p /risingwave/bin/connector-node && mkdir -p /risingwave/lib
COPY --from=builder /risingwave/bin/risingwave /risingwave/bin/risingwave
COPY --from=builder /risingwave/bin/connector-node /risingwave/bin/connector-node
COPY --from=builder /risingwave/ui /risingwave/ui
COPY --from=builder /risingwave/lib/librisingwave_java_binding.so /risingwave/lib/librisingwave_java_binding.so

# hadoop
RUN wget https://rw-yufan.s3.ap-southeast-1.amazonaws.com/hadoop-2.7.3.tar.gz -P /root/
Expand All @@ -75,8 +73,6 @@ ARG JAVA_HOME_PATH
ENV JAVA_HOME ${JAVA_HOME_PATH}
ENV LD_LIBRARY_PATH ${JAVA_HOME_PATH}/lib/server:${LD_LIBRARY_PATH}

# Set java.library.path env to /risingwave/lib
ENV RW_JAVA_BINDING_LIB_PATH /risingwave/lib
# Set default playground mode to docker-playground profile
ENV PLAYGROUND_PROFILE docker-playground
# Set default dashboard UI to local path instead of github proxy
Expand Down
5 changes: 1 addition & 4 deletions java/connector-node/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,7 @@ Sometimes, you need to specify the shared library path. For example, when progra
```
RISINGWAVE_ROOT=$(git rev-parse --show-toplevel)
CONNECTOR_ROOT=$JAVA_ROOT/connector-node
# Build shared library file
cd $RISINGWAVE_ROOT && cargo build -p risingwave_java_binding
# specify the Djava.library.path, please make sure the shared library you needed exist in /target/debug
cd ${CONNECTOR_ROOT}/assembly/target && java -classpath "./libs/*" -Djava.library.path=${RISINGWAVE_ROOT}/target/debug com.risingwave.connector.ConnectorService
cd ${CONNECTOR_ROOT}/assembly/target && java -classpath "./libs/*" com.risingwave.connector.ConnectorService
```

## Docker image
Expand Down
2 changes: 1 addition & 1 deletion java/connector-node/assembly/scripts/start-service.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ if [ -z "${port}" ]; then
port=$PORT
fi

java -classpath "${DIR}/libs/*" -Djava.library.path="${RW_JAVA_BINDING_LIB_PATH}" $MAIN --port ${port}
java -classpath "${DIR}/libs/*" $MAIN --port ${port}
99 changes: 55 additions & 44 deletions java/java-binding/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,21 @@
</parent>

<artifactId>java-binding</artifactId>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<module.version>1.0-SNAPSHOT</module.version>
<jni.loader.version>1.0.0</jni.loader.version>
</properties>

<dependencies>
<dependency>
<groupId>org.questdb</groupId>
<artifactId>jar-jni</artifactId>
<version>${jni.loader.version}</version>
</dependency>
<dependency>
<groupId>com.risingwave.java</groupId>
<artifactId>proto</artifactId>
Expand All @@ -36,49 +42,54 @@
</dependency>
</dependencies>

<profiles>
<profile>
<id>no-build-jni-rust</id>
<activation>
<property>
<name>no-build-rust</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.questdb</groupId>
<artifactId>rust-maven-plugin</artifactId>
<version>${jni.loader.version}</version>
<executions>
<execution>
<id>build-jni-rust</id>
<!--disable the plugin-->
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.questdb</groupId>
<artifactId>rust-maven-plugin</artifactId>
<version>${jni.loader.version}</version>
<executions>
<execution>
<id>build-jni-rust</id>
<goals>
<goal>build</goal>
</goals>
<configuration>
<path>../../src/java_binding</path>
<release>false</release>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way to enable the release build for the java binding crate? (performance concern)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing out! I just added a property -Djava.binding.release=true in maven command to enable release build.

The property has been added to script related to release mode.

<copyTo>${project.build.directory}/classes/risingwave/jni</copyTo>
<copyWithPlatformDir>true</copyWithPlatformDir>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@

package com.risingwave.java.binding;

import io.questdb.jar.jni.JarJniLoader;

public class Binding {
static {
System.loadLibrary("risingwave_java_binding");
JarJniLoader.loadLib(Binding.class, "/risingwave/jni", "risingwave_java_binding");
}

public static native int vnodeCount();
Expand Down
4 changes: 2 additions & 2 deletions src/compute/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,8 +322,8 @@ pub async fn compute_node_serve(
let connector_params = risingwave_connector::ConnectorParams {
connector_rpc_endpoint: opts.connector_rpc_endpoint,
sink_payload_format: match opts.connector_rpc_sink_payload_format.as_deref() {
None | Some("json") => SinkPayloadFormat::Json,
Some("stream_chunk") => SinkPayloadFormat::StreamChunk,
None | Some("stream_chunk") => SinkPayloadFormat::StreamChunk,
Some("json") => SinkPayloadFormat::Json,
_ => {
unreachable!(
"invalid sink payload format: {:?}. Should be either json or stream_chunk",
Expand Down
2 changes: 1 addition & 1 deletion src/java_binding/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ tracing = "0.1"
risingwave_expr = { path = "../expr" }

[lib]
crate_type = ["cdylib"]
crate-type = ["cdylib"]

[[bin]]
name = "data-chunk-payload-generator"
Expand Down
20 changes: 5 additions & 15 deletions src/java_binding/make-java-binding.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,13 @@ cd java
javac -h . -cp java-binding/src/main/java/ java-binding/src/main/java/com/risingwave/java/binding/Binding.java
'''

[tasks.build-java-binding-rust]
description = "Build the java binding rust code"
script = '''
#!/usr/bin/env bash
set -ex
cargo build -p risingwave_java_binding
'''

[tasks.build-java-binding-java]
[tasks.build-java-binding]
description = "Build the java binding java code"
script = '''
#!/usr/bin/env bash
set -ex
cd java
mvn clean install --no-transfer-progress --pl java-binding-integration-test --am -DskipTests=true
mvn install --no-transfer-progress --pl java-binding-integration-test --am -DskipTests=true
mvn dependency:copy-dependencies --no-transfer-progress --pl java-binding-integration-test
'''

Expand Down Expand Up @@ -71,8 +63,7 @@ bash ${RUST_JAVA_BINDING_ROOT}/run_demo.sh
[tasks.run-java-binding-demo]
description = "Run the java binding demo"
dependencies = [
"build-java-binding-rust",
"build-java-binding-java",
"build-java-binding",
"start-java-binding-demo-cluster",
"ingest-data-and-run-java-binding",
"kill-java-binding-demo-cluster"
Expand All @@ -81,8 +72,7 @@ dependencies = [
[tasks.run-java-binding-stream-chunk-demo]
description = "Run the java binding stream chunk demo"
dependencies = [
"build-java-binding-rust",
"build-java-binding-java",
"build-java-binding",
]
script = '''
#!/usr/bin/env bash
Expand All @@ -94,7 +84,7 @@ cd ${RISINGWAVE_ROOT}/java

(cd ${RISINGWAVE_ROOT} && cargo run --bin data-chunk-payload-generator) | \
java -cp "./java-binding-integration-test/target/dependency/*:./java-binding-integration-test/target/classes" \
-Djava.library.path=${RISINGWAVE_ROOT}/target/debug com.risingwave.java.binding.StreamChunkDemo
com.risingwave.java.binding.StreamChunkDemo


'''
2 changes: 1 addition & 1 deletion src/java_binding/run_demo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ set -x
cd ${RISINGWAVE_ROOT}/java

java -cp "./java-binding-integration-test/target/dependency/*:./java-binding-integration-test/target/classes" \
-Djava.library.path=${RISINGWAVE_ROOT}/target/debug com.risingwave.java.binding.HummockReadDemo
com.risingwave.java.binding.HummockReadDemo

psql -d dev -h localhost -p 4566 -U root << EOF
DROP TABLE ${TABLE_NAME};
Expand Down