From 69c103e399274995d72ff639855f5dd446b1c036 Mon Sep 17 00:00:00 2001 From: Jeremiah Jordan Date: Thu, 16 Jul 2026 07:23:32 -0500 Subject: [PATCH] Resolve the trigger constructor once when loading trigger classes --- .../cassandra/triggers/TriggerExecutor.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java index 6231979695..f4e9798214 100644 --- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java +++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java @@ -292,13 +292,20 @@ public class TriggerExecutor // CreateTriggerStatement#apply. // Check that triggerClass is available on the classpath, but do not initialize the class since that would // execute static blocks. - Class trigger; + Class trigger = loadTriggerClassWithoutInitialization(triggerClass); + // Validate that the class exposes a public no-argument constructor before it is accepted. + trigger.getConstructor(); + return trigger; + } + + private Class loadTriggerClassWithoutInitialization(String triggerClass) throws Exception + { try { - trigger = FBUtilities.classForNameWithoutInitialization(triggerClass, - "trigger", - ITrigger.class, - customClassLoader); + return FBUtilities.classForNameWithoutInitialization(triggerClass, + "trigger", + ITrigger.class, + customClassLoader); } catch (ConfigurationException e) { @@ -306,8 +313,6 @@ public class TriggerExecutor throw (ClassNotFoundException) e.getCause(); throw e; } - trigger.getConstructor(); - return trigger; } public synchronized ITrigger loadTriggerInstance(String triggerClass) throws Exception @@ -321,6 +326,6 @@ public class TriggerExecutor // double check. if (cachedTriggers.get(triggerClass) != null) return cachedTriggers.get(triggerClass); - return loadTriggerClass(triggerClass).getConstructor().newInstance(); + return loadTriggerClassWithoutInitialization(triggerClass).getConstructor().newInstance(); } }