This is an automated email from the ASF dual-hosted git repository.

stoty pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-3 by this push:
     new 156ac1fc9d0 HBASE-29550 Reflection error in TestRSGroupsKillRS with 
Java 21 (#7327)
156ac1fc9d0 is described below

commit 156ac1fc9d04da4eef87a74b1889744f1c6af0c9
Author: Istvan Toth <[email protected]>
AuthorDate: Mon Sep 22 16:14:42 2025 +0200

    HBASE-29550 Reflection error in TestRSGroupsKillRS with Java 21 (#7327)
    
    Signed-off-by: Duo Zhang <[email protected]>
    (cherry picked from commit d108b8e51bcd78495b6884f0293feea1646d12f6)
---
 .../org/apache/hadoop/hbase/trace/TraceUtil.java   |  4 +--
 .../org/apache/hadoop/hbase/util/VersionInfo.java  |  5 ++-
 .../hadoop/hbase/rsgroup/TestRSGroupsKillRS.java   | 39 +++++++++++-----------
 3 files changed, 26 insertions(+), 22 deletions(-)

diff --git 
a/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
index 5b1fb86a351..260c0064f84 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/trace/TraceUtil.java
@@ -28,8 +28,8 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Supplier;
-import org.apache.hadoop.hbase.Version;
 import org.apache.hadoop.hbase.util.FutureUtils;
+import org.apache.hadoop.hbase.util.VersionInfo;
 import org.apache.yetus.audience.InterfaceAudience;
 
 @InterfaceAudience.Private
@@ -39,7 +39,7 @@ public final class TraceUtil {
   }
 
   public static Tracer getGlobalTracer() {
-    return GlobalOpenTelemetry.getTracer("org.apache.hbase", Version.version);
+    return GlobalOpenTelemetry.getTracer("org.apache.hbase", 
VersionInfo.getVersion());
   }
 
   /**
diff --git 
a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java
index ba60edb06a0..dfb74e66a9e 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java
@@ -40,12 +40,15 @@ public class VersionInfo {
   // higher than any numbers in the version.
   private static final int VERY_LARGE_NUMBER = 100000;
 
+  // Copying into a non-final member so that it can be changed by reflection 
for testing
+  private static String version = Version.version;
+
   /**
    * Get the hbase version.
    * @return the hbase version string, eg. "0.6.3-dev"
    */
   public static String getVersion() {
-    return Version.version;
+    return version;
   }
 
   /**
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
index b3e30211f24..3a596a02e0a 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsKillRS.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -47,7 +46,6 @@ import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.testclassification.RSGroupTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.JVMClusterUtil;
-import org.apache.hadoop.hbase.util.ReflectionUtils;
 import org.apache.hadoop.hbase.util.VersionInfo;
 import org.junit.After;
 import org.junit.AfterClass;
@@ -268,24 +266,27 @@ public class TestRSGroupsKillRS extends TestRSGroupsBase {
     Address address = servers.iterator().next();
     int majorVersion = VersionInfo.getMajorVersion(originVersion);
     assertTrue(majorVersion >= 1);
-    String lowerVersion = String.valueOf(majorVersion - 1) + 
originVersion.split("\\.")[1];
-    setFinalStatic(Version.class.getField("version"), lowerVersion);
-    TEST_UTIL.getMiniHBaseCluster().startRegionServer(address.getHostName(), 
address.getPort());
-    assertEquals(NUM_SLAVES_BASE,
-      TEST_UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size());
-    assertTrue(VersionInfo.compareVersion(originVersion,
-      MASTER.getRegionServerVersion(getServerName(servers.iterator().next()))) 
> 0);
-    LOG.debug("wait for META assigned...");
-    // SCP finished, which means all regions assigned too.
-    TEST_UTIL.waitFor(60000, () -> 
!TEST_UTIL.getHBaseCluster().getMaster().getProcedures().stream()
-      .filter(p -> (p instanceof ServerCrashProcedure)).findAny().isPresent());
+    String lowerVersion =
+      String.valueOf(majorVersion - 1) + 
originVersion.substring(originVersion.indexOf("."));
+    try {
+      setVersionInfoVersion(lowerVersion);
+      TEST_UTIL.getMiniHBaseCluster().startRegionServer(address.getHostName(), 
address.getPort());
+      assertEquals(NUM_SLAVES_BASE,
+        TEST_UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size());
+      assertTrue(VersionInfo.compareVersion(originVersion,
+        
MASTER.getRegionServerVersion(getServerName(servers.iterator().next()))) > 0);
+      LOG.debug("wait for META assigned...");
+      // SCP finished, which means all regions assigned too.
+      TEST_UTIL.waitFor(60000, () -> 
!TEST_UTIL.getHBaseCluster().getMaster().getProcedures()
+        .stream().filter(p -> (p instanceof 
ServerCrashProcedure)).findAny().isPresent());
+    } finally {
+      setVersionInfoVersion(Version.version);
+    }
   }
 
-  private static void setFinalStatic(Field field, Object newValue) throws 
Exception {
-    field.setAccessible(true);
-    Field modifiersField = ReflectionUtils.getModifiersField();
-    modifiersField.setAccessible(true);
-    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-    field.set(null, newValue);
+  private static void setVersionInfoVersion(String newValue) throws Exception {
+    Field f = VersionInfo.class.getDeclaredField("version");
+    f.setAccessible(true);
+    f.set(null, newValue);
   }
 }

Reply via email to