This is an automated email from the ASF dual-hosted git repository.
eolivelli pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.7 by this push:
new 48ee424 Pulsar Functions: detect .nar files and prevent spammy logs
on functions boot (#12665)
48ee424 is described below
commit 48ee42421c7b5ff5e1d1a6dd3f44e1d7c79664c4
Author: Enrico Olivelli <[email protected]>
AuthorDate: Tue Nov 9 10:50:53 2021 +0100
Pulsar Functions: detect .nar files and prevent spammy logs on functions
boot (#12665)
---
.../org/apache/pulsar/common/nar/FileUtils.java | 20 +++++++++++++++
.../functions/instance/JavaInstanceRunnable.java | 29 ++++++++++++++++------
2 files changed, 41 insertions(+), 8 deletions(-)
diff --git
a/pulsar-common/src/main/java/org/apache/pulsar/common/nar/FileUtils.java
b/pulsar-common/src/main/java/org/apache/pulsar/common/nar/FileUtils.java
index 6e34e78..c32db9c 100644
--- a/pulsar-common/src/main/java/org/apache/pulsar/common/nar/FileUtils.java
+++ b/pulsar-common/src/main/java/org/apache/pulsar/common/nar/FileUtils.java
@@ -30,7 +30,10 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
/**
@@ -38,6 +41,7 @@ import org.slf4j.Logger;
* operations.
*
*/
+@Slf4j
public class FileUtils {
public static final long MILLIS_BETWEEN_ATTEMPTS = 50L;
@@ -221,5 +225,21 @@ public class FileUtils {
/* do nothing */
}
}
+
+ public static boolean mayBeANarArchive(File jarFile) {
+ try (ZipFile zipFile = new ZipFile(jarFile);) {
+ ZipEntry entry = zipFile.getEntry("META-INF/bundled-dependencies");
+ if (entry == null || !entry.isDirectory()) {
+ log.info("Jar file {} does not contain
META-INF/bundled-dependencies, it is not a NAR file", jarFile);
+ return false;
+ } else {
+ log.info("Jar file {} contains META-INF/bundled-dependencies,
it may be a NAR file", jarFile);
+ return true;
+ }
+ } catch (IOException err) {
+ log.info("Cannot safely detect if {} is a NAR archive", jarFile,
err);
+ return true;
+ }
+ }
}
diff --git
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/instance/JavaInstanceRunnable.java
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/instance/JavaInstanceRunnable.java
index ea79093..fc4fbe7 100644
---
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/instance/JavaInstanceRunnable.java
+++
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/instance/JavaInstanceRunnable.java
@@ -22,6 +22,8 @@ package org.apache.pulsar.functions.instance;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.prometheus.client.CollectorRegistry;
+
+import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
@@ -44,6 +46,7 @@ import org.apache.pulsar.common.functions.ConsumerConfig;
import org.apache.pulsar.common.functions.FunctionConfig;
import org.apache.pulsar.common.functions.ProducerConfig;
import org.apache.pulsar.common.util.Reflections;
+import org.apache.pulsar.common.nar.FileUtils;
import org.apache.pulsar.functions.api.Function;
import org.apache.pulsar.functions.api.Record;
import org.apache.pulsar.functions.api.StateStore;
@@ -292,14 +295,24 @@ public class JavaInstanceRunnable implements
AutoCloseable, Runnable {
private ClassLoader loadJars() throws Exception {
ClassLoader fnClassLoader;
- try {
- log.info("Load JAR: {}", jarFile);
- // Let's first try to treat it as a nar archive
- fnCache.registerFunctionInstanceWithArchive(
- instanceConfig.getFunctionId(),
- instanceConfig.getInstanceName(),
- jarFile, narExtractionDirectory);
- } catch (FileNotFoundException e) {
+ boolean loadedAsNar = false;
+ if (FileUtils.mayBeANarArchive(new File(jarFile))) {
+ try {
+ log.info("Trying Loading file as NAR file: {}", jarFile);
+ // Let's first try to treat it as a nar archive
+ fnCache.registerFunctionInstanceWithArchive(
+ instanceConfig.getFunctionId(),
+ instanceConfig.getInstanceName(),
+ jarFile, narExtractionDirectory);
+ loadedAsNar = true;
+ } catch (FileNotFoundException e) {
+ // this is usually like
+ // java.io.FileNotFoundException:
/tmp/pulsar-nar/xxx.jar-unpacked/xxxxx/META-INF/MANIFEST.MF'
+ log.error("The file {} does not look like a .nar file",
jarFile, e.toString());
+ }
+ }
+ if (!loadedAsNar) {
+ log.info("Load file as simple JAR file: {}", jarFile);
// create the function class loader
fnCache.registerFunctionInstance(
instanceConfig.getFunctionId(),