From e10683599489d1f7aa593983316cd5e7288b7cf9 Mon Sep 17 00:00:00 2001 From: Richard Davison Date: Sat, 12 Feb 2022 15:33:04 +0100 Subject: [PATCH 1/4] cache jni fields --- ...ime_api_client_runtimeapi_NativeClient.cpp | 69 +++++++++++++------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp index c6a1dabc..a159cd8a 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp @@ -24,6 +24,45 @@ static aws::lambda_runtime::runtime * CLIENT = nullptr; +static jint JNI_VERSION = JNI_VERSION_1_8; + +static jclass invocationRequestClass; +static jfieldID invokedFunctionArnField; +static jfieldID deadlineTimeInMsField; +static jfieldID idField; +static jfieldID contentField; +static jfieldID clientContextField = nullptr; +static jfieldID cognitoIdentityField = nullptr; +static jfieldID xrayTraceIdField = nullptr; + + +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION) != JNI_OK) { + return JNI_ERR; + } + + jclass tempInvocationRequestClassRef; + tempInvocationRequestClassRef = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest"); + invocationRequestClass = (jclass) env->NewGlobalRef(tempInvocationRequestClassRef); + env->DeleteLocalRef(tempInvocationRequestClassRef); + + idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;"); + invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;"); + deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J"); + contentField = env->GetFieldID(invocationRequestClass , "content", "[B"); + + return JNI_VERSION; +} + +void JNI_OnUnload(JavaVM *vm, void *reserved) { + JNIEnv* env; + vm->GetEnv(reinterpret_cast(&env), JNI_VERSION); + + env->DeleteGlobalRef(invocationRequestClass); +} + static void throwLambdaRuntimeClientException(JNIEnv *env, std::string message, aws::http::response_code responseCode){ jclass lambdaRuntimeExceptionClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/LambdaRuntimeClientException"); jstring jMessage = env->NewStringUTF(message.c_str()); @@ -56,50 +95,40 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_ return NULL; } - jclass invocationRequestClass; - jfieldID invokedFunctionArnField; - jfieldID deadlineTimeInMsField; - jfieldID xrayTraceIdField; - jfieldID idField; jobject invocationRequest; - jfieldID clientContextField; - jfieldID cognitoIdentityField; jbyteArray jArray; const jbyte* bytes; - jfieldID contentField; auto response = outcome.get_result(); - CHECK_EXCEPTION(env, invocationRequestClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest")); CHECK_EXCEPTION(env, invocationRequest = env->AllocObject(invocationRequestClass)); - - CHECK_EXCEPTION(env, idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, idField, env->NewStringUTF(response.request_id.c_str()))); - - CHECK_EXCEPTION(env, invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, invokedFunctionArnField, env->NewStringUTF(response.function_arn.c_str()))); - - CHECK_EXCEPTION(env, deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J")); CHECK_EXCEPTION(env, env->SetLongField(invocationRequest, deadlineTimeInMsField, std::chrono::duration_cast(response.deadline.time_since_epoch()).count())); if(response.xray_trace_id != ""){ - CHECK_EXCEPTION(env, xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;")); + if(xrayTraceIdField == nullptr){ + xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"); + } CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, xrayTraceIdField, env->NewStringUTF(response.xray_trace_id.c_str()))); } if(response.client_context != ""){ - CHECK_EXCEPTION(env, clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;")); + if(clientContextField == nullptr){ + clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"); + } CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, clientContextField, env->NewStringUTF(response.client_context.c_str()))); } if(response.cognito_identity != ""){ - CHECK_EXCEPTION(env, cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;")); - CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); + if(cognitoIdentityField == nullptr){ + cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"); + } + CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); } bytes = reinterpret_cast(response.payload.c_str()); CHECK_EXCEPTION(env, jArray = env->NewByteArray(response.payload.length())); CHECK_EXCEPTION(env, env->SetByteArrayRegion(jArray, 0, response.payload.length(), bytes)); - CHECK_EXCEPTION(env, contentField = env->GetFieldID(invocationRequestClass , "content", "[B")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, contentField, jArray)); return invocationRequest; From cd9a367c7d670adb47a349b5a8b4fe2d53b6cedc Mon Sep 17 00:00:00 2001 From: Davison Date: Thu, 5 May 2022 09:27:50 +0200 Subject: [PATCH 2/4] add optimization --- .gitignore | 5 ++++- .../src/main/jni/Dockerfile.glibc | 3 ++- .../src/main/jni/Dockerfile.musl | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index fbdc4bbe..2f2f0af4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,7 @@ dependency-reduced-pom.xml .gradle .settings .classpath -.project \ No newline at end of file +.project + +# OSX +.DS_Store \ No newline at end of file diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc index 9d46d2f9..6ccfe66f 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc @@ -69,4 +69,5 @@ RUN /usr/bin/c++ -c \ -laws-lambda-runtime \ -lcurl \ -static-libstdc++ \ - -lrt + -lrt \ + -O2 diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl index d34253fa..6e953796 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl @@ -58,4 +58,5 @@ RUN /usr/bin/c++ -c \ -laws-lambda-runtime \ -lcurl \ -static-libstdc++ \ - -static-libgcc + -static-libgcc \ + -O2 From 4225470e88e4f2a3a736afd49fe2640dc3772da5 Mon Sep 17 00:00:00 2001 From: Richard Davison Date: Tue, 16 Aug 2022 13:19:06 +0200 Subject: [PATCH 3/4] Remove conditional lookups for xrayTraceId, clientContext & cognitoIdentity fields --- ...time_api_client_runtimeapi_NativeClient.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp index a159cd8a..925fcd41 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp @@ -31,9 +31,9 @@ static jfieldID invokedFunctionArnField; static jfieldID deadlineTimeInMsField; static jfieldID idField; static jfieldID contentField; -static jfieldID clientContextField = nullptr; -static jfieldID cognitoIdentityField = nullptr; -static jfieldID xrayTraceIdField = nullptr; +static jfieldID clientContextField; +static jfieldID cognitoIdentityField; +static jfieldID xrayTraceIdField; jint JNI_OnLoad(JavaVM* vm, void* reserved) { @@ -52,6 +52,9 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;"); deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J"); contentField = env->GetFieldID(invocationRequestClass , "content", "[B"); + xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"); + clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"); + cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"); return JNI_VERSION; } @@ -106,23 +109,14 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_ CHECK_EXCEPTION(env, env->SetLongField(invocationRequest, deadlineTimeInMsField, std::chrono::duration_cast(response.deadline.time_since_epoch()).count())); if(response.xray_trace_id != ""){ - if(xrayTraceIdField == nullptr){ - xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"); - } CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, xrayTraceIdField, env->NewStringUTF(response.xray_trace_id.c_str()))); } if(response.client_context != ""){ - if(clientContextField == nullptr){ - clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"); - } CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, clientContextField, env->NewStringUTF(response.client_context.c_str()))); } if(response.cognito_identity != ""){ - if(cognitoIdentityField == nullptr){ - cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"); - } CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); } From f0ac591952670c3e92e1e7a090169ec40f280d37 Mon Sep 17 00:00:00 2001 From: Richard Davison Date: Tue, 16 Aug 2022 13:20:28 +0200 Subject: [PATCH 4/4] Remove extra space --- ...rvices_lambda_runtime_api_client_runtimeapi_NativeClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp index 925fcd41..87fa9f02 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp @@ -117,7 +117,7 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_ } if(response.cognito_identity != ""){ - CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); + CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); } bytes = reinterpret_cast(response.payload.c_str());