This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new c434f4d7da fix(wasm): generate globally unique argument ids by default
(#7570)
c434f4d7da is described below
commit c434f4d7daeb29315079f5da280fc8057b0ad367
Author: Sean-Walker0 <[email protected]>
AuthorDate: Mon Oct 12 22:49:45 2026 +0800
fix(wasm): generate globally unique argument ids by default (#7570)
---
.../handler/AbstractWasmPluginDataHandler.java | 15 ++++++++++---
.../handler/AbstractWasmPluginDataHandlerTest.java | 25 +++++++++++++++++++++
...ndlerTest$DefaultIdGoWasmPluginDataHandler.wasm | Bin 0 -> 3650 bytes
3 files changed, 37 insertions(+), 3 deletions(-)
diff --git
a/shenyu-plugin/shenyu-plugin-wasm-base/src/main/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandler.java
b/shenyu-plugin/shenyu-plugin-wasm-base/src/main/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandler.java
index 9b2deed8f6..0f38663cb8 100644
---
a/shenyu-plugin/shenyu-plugin-wasm-base/src/main/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandler.java
+++
b/shenyu-plugin/shenyu-plugin-wasm-base/src/main/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandler.java
@@ -25,6 +25,7 @@ import
org.apache.shenyu.plugin.base.handler.PluginDataHandler;
import org.apache.shenyu.plugin.wasm.api.loader.WasmLoader;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -45,11 +46,19 @@ public abstract class AbstractWasmPluginDataHandler extends
WasmLoader implement
protected static final String REMOVE_SELECTOR_METHOD_NAME =
"removeSelector";
protected static final Map<Long, RuleData> RULE_ARGUMENTS = new
ConcurrentHashMap<>();
+
protected static final String HANDLER_RULE_METHOD_NAME = "handlerRule";
protected static final String REMOVE_RULE_METHOD_NAME = "removeRule";
+ /**
+ * Argument ids key the shared static argument maps, and every call
removes its entry in a
+ * finally block, so ids must be globally unique: overlapping calls with
equal ids would
+ * overwrite each other's argument and the first cleanup would drop the
other call's entry.
+ */
+ private static final AtomicLong NEXT_ARGUMENT_ID = new AtomicLong();
+
@Override
public void handlerPlugin(final PluginData pluginData) {
super.getWasmExtern(HANDLER_PLUGIN_METHOD_NAME)
@@ -129,14 +138,14 @@ public abstract class AbstractWasmPluginDataHandler
extends WasmLoader implement
}
protected Long getPluginArgumentId(final PluginData pluginData) {
- return 0L;
+ return NEXT_ARGUMENT_ID.incrementAndGet();
}
protected Long getSelectorArgumentId(final SelectorData selectorData) {
- return 0L;
+ return NEXT_ARGUMENT_ID.incrementAndGet();
}
protected Long getRuleArgumentId(final RuleData ruleData) {
- return 0L;
+ return NEXT_ARGUMENT_ID.incrementAndGet();
}
}
diff --git
a/shenyu-plugin/shenyu-plugin-wasm-base/src/test/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandlerTest.java
b/shenyu-plugin/shenyu-plugin-wasm-base/src/test/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandlerTest.java
index 8dda848f1d..9ad1e48d48 100644
---
a/shenyu-plugin/shenyu-plugin-wasm-base/src/test/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandlerTest.java
+++
b/shenyu-plugin/shenyu-plugin-wasm-base/src/test/java/org/apache/shenyu/plugin/wasm/base/handler/AbstractWasmPluginDataHandlerTest.java
@@ -29,7 +29,9 @@ import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.nio.charset.StandardCharsets;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -63,6 +65,19 @@ public final class AbstractWasmPluginDataHandlerTest {
when(ruleData.getPluginName()).thenReturn("SHENYU");
}
+
+ /** Default argument-id generators must never collide. */
+ @Test
+ public void defaultArgumentIdsAreUniqueAcrossTypesAndCalls() {
+ final DefaultIdGoWasmPluginDataHandler handler = new
DefaultIdGoWasmPluginDataHandler();
+ final Set<Long> ids = new HashSet<>();
+ ids.add(handler.getPluginArgumentId(pluginData));
+ ids.add(handler.getPluginArgumentId(pluginData));
+ ids.add(handler.getSelectorArgumentId(selectorData));
+ ids.add(handler.getRuleArgumentId(ruleData));
+ assertEquals(4, ids.size(), "default argument ids must be unique
across types and calls");
+ }
+
/** Go WASM handlerPlugin test. */
@Test
public void goHandlerPluginTest() {
@@ -202,6 +217,16 @@ public final class AbstractWasmPluginDataHandlerTest {
}
}
+
+ /** Loads a copy of the Go fixture but keeps the default argument-id
generators. */
+ static class DefaultIdGoWasmPluginDataHandler extends
AbstractWasmPluginDataHandler {
+
+ @Override
+ public String pluginNamed() {
+ return "SHENYU_TEST";
+ }
+ }
+
/** Loads $TestGoWasmPluginDataHandler.wasm. */
static class TestGoWasmPluginDataHandler extends WasmTestHandler {
TestGoWasmPluginDataHandler(final String expected) {
diff --git
a/shenyu-plugin/shenyu-plugin-wasm-base/src/test/resources/org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$DefaultIdGoWasmPluginDataHandler.wasm
b/shenyu-plugin/shenyu-plugin-wasm-base/src/test/resources/org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$DefaultIdGoWasmPluginDataHandler.wasm
new file mode 100644
index 0000000000..1f6f9c6d2c
Binary files /dev/null and
b/shenyu-plugin/shenyu-plugin-wasm-base/src/test/resources/org.apache.shenyu.plugin.wasm.base.handler.AbstractWasmPluginDataHandlerTest$DefaultIdGoWasmPluginDataHandler.wasm
differ