This is an automated email from the ASF dual-hosted git repository.
dragonyliu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/master by this push:
new f2447cfe0 RATIS-1742. Remove slf4j-log4j12 test dependency from
ratis-common and ratis-server. (#781)
f2447cfe0 is described below
commit f2447cfe0b94ad5f9e72dff1623fa90b6f42f4f5
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Nov 17 05:32:58 2022 -0800
RATIS-1742. Remove slf4j-log4j12 test dependency from ratis-common and
ratis-server. (#781)
---
ratis-common/pom.xml | 5 -
.../java/org/apache/ratis/util/Slf4jUtils.java | 111 ++++++++++++++++++---
ratis-server/pom.xml | 5 -
ratis-test/pom.xml | 17 +++-
.../ratis/datastream/TestDataStreamDisabled.java | 36 ++++---
.../raftlog/segmented/TestSegmentedRaftLog.java | 4 +-
6 files changed, 126 insertions(+), 52 deletions(-)
diff --git a/ratis-common/pom.xml b/ratis-common/pom.xml
index e08454db9..fa3c06745 100644
--- a/ratis-common/pom.xml
+++ b/ratis-common/pom.xml
@@ -37,11 +37,6 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>junit</groupId>
diff --git a/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
b/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
index dadbae352..f2fca961a 100644
--- a/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
+++ b/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
@@ -17,34 +17,113 @@
*/
package org.apache.ratis.util;
-import org.apache.log4j.LogManager;
import org.slf4j.Logger;
import org.slf4j.event.Level;
-import java.util.Optional;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Supplier;
public interface Slf4jUtils {
-
static void setLogLevel(Logger logger, Level level) {
final String name = logger.getName();
+ final boolean set = Log4jUtils.setLevel(name, level.name());
+
+ final String prefix = set? "Successfully": "Failed to";
if (LogUtils.LOG.isTraceEnabled()) {
- LogUtils.LOG.trace("", new Throwable("Set " + name + " log level to " +
level));
+ LogUtils.LOG.trace("", new Throwable(prefix + " set " + name + " log
level to " + level));
} else {
- LogUtils.LOG.info("Set {} log level to {}", name, level);
+ LogUtils.LOG.info(prefix + " set {} log level to {}", name, level);
}
-
- Optional.ofNullable(LogManager.getLogger(name))
- .ifPresent(log -> log.setLevel(getLog4jLevel(level)));
}
- static org.apache.log4j.Level getLog4jLevel(Level level) {
- switch (level) {
- case ERROR: return org.apache.log4j.Level.ERROR;
- case WARN: return org.apache.log4j.Level.WARN;
- case INFO: return org.apache.log4j.Level.INFO;
- case DEBUG: return org.apache.log4j.Level.DEBUG;
- case TRACE: return org.apache.log4j.Level.TRACE;
+ interface Log4jUtils {
+ String PACKAGE_NAME = "org.apache.log4j";
+
+ /**
+ * Use reflection to invoke setLevel.
+ *
+ * @param loggerName The logger name.
+ * @param levelName The level name.
+ * @return true iff the level is successfully set.
+ */
+ static boolean setLevel(String loggerName, String levelName) {
+ final Field level = Level.valueOf(levelName);
+ if (level == null) {
+ return false;
+ }
+
+ try {
+ final Object logger = LogManager.getLogger().invoke(null, loggerName);
+ Logger.setLevel().invoke(logger, level.get(null));
+ } catch (Exception ignored) {
+ return false;
+ }
+ return true;
+ }
+
+ interface LogManager {
+ String CLASS_NAME = PACKAGE_NAME + ".LogManager";
+ Supplier<Method> GET_LOGGER =
MemoizedSupplier.valueOf(LogManager::getLoggerImpl);
+
+ static Method getLogger() {
+ return GET_LOGGER.get();
+ }
+
+ static Method getLoggerImpl() {
+ final Class<?> clazz =
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+ if (clazz == null) {
+ return null;
+ }
+ final Class<?>[] argClasses = {String.class};
+ try {
+ return clazz.getMethod("getLogger", argClasses);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ }
+
+ interface Level {
+ String CLASS_NAME = PACKAGE_NAME + ".Level";
+ ConcurrentMap<String, Field> LEVELS = new ConcurrentHashMap<>();
+
+ static Field valueOf(String level) {
+ return LEVELS.computeIfAbsent(level, Level::valueOfImpl);
+ }
+
+ static Field valueOfImpl(String level) {
+ try {
+ final Class<?> clazz =
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+ return clazz.getDeclaredField(level);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ }
+
+ interface Logger {
+ String CLASS_NAME = PACKAGE_NAME + ".Logger";
+ Supplier<Method> SET_LEVEL =
MemoizedSupplier.valueOf(Logger::setLevelImpl);
+
+ static Method setLevel() {
+ return SET_LEVEL.get();
+ }
+
+ static Method setLevelImpl() {
+ final Class<?> clazz =
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+ if (clazz == null) {
+ return null;
+ }
+ final Class<?>[] argClasses =
{ReflectionUtils.getClassByNameOrNull(Level.CLASS_NAME)};
+ try {
+ return clazz.getMethod("setLevel", argClasses);
+ } catch (Exception e) {
+ return null;
+ }
+ }
}
- throw new IllegalArgumentException("Unexpected level " + level);
}
}
diff --git a/ratis-server/pom.xml b/ratis-server/pom.xml
index c1a433e13..0acfa1e6a 100644
--- a/ratis-server/pom.xml
+++ b/ratis-server/pom.xml
@@ -64,11 +64,6 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>junit</groupId>
diff --git a/ratis-test/pom.xml b/ratis-test/pom.xml
index fcc751049..99f4e21cc 100644
--- a/ratis-test/pom.xml
+++ b/ratis-test/pom.xml
@@ -84,6 +84,18 @@
<type>test-jar</type>
</dependency>
+ <dependency>
+ <groupId>org.apache.ratis</groupId>
+ <artifactId>ratis-shell</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
@@ -105,10 +117,5 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.apache.ratis</groupId>
- <artifactId>ratis-shell</artifactId>
- <scope>test</scope>
- </dependency>
</dependencies>
</project>
diff --git
a/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
b/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
index cc0c4d90c..168a1b02d 100644
---
a/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
+++
b/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
@@ -21,35 +21,33 @@ import org.apache.ratis.BaseTest;
import org.apache.ratis.RaftConfigKeys;
import org.apache.ratis.client.DisabledDataStreamClientFactory;
import org.apache.ratis.client.RaftClient;
+import org.apache.ratis.client.api.DataStreamOutput;
import org.apache.ratis.conf.RaftProperties;
import org.apache.ratis.protocol.RaftGroup;
import org.apache.ratis.protocol.RaftGroupId;
import org.apache.ratis.protocol.RaftPeer;
import org.junit.Assert;
-import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.ExpectedException;
public class TestDataStreamDisabled extends BaseTest {
- @Rule
- public final ExpectedException exception = ExpectedException.none();
-
@Test
- public void testDataStreamDisabled() {
- final RaftProperties properties = new RaftProperties();
- Assert.assertEquals(SupportedDataStreamType.DISABLED,
RaftConfigKeys.DataStream.type(properties, LOG::info));
+ public void testDataStreamDisabled() throws Exception {
+ final RaftProperties properties = new RaftProperties();
+ Assert.assertEquals(SupportedDataStreamType.DISABLED,
RaftConfigKeys.DataStream.type(properties, LOG::info));
- final RaftPeer server = RaftPeer.newBuilder().setId("s0").build();
- final RaftClient client = RaftClient.newBuilder()
- .setRaftGroup(RaftGroup.valueOf(RaftGroupId.randomId(), server))
- .setProperties(properties)
- .build();
+ final RaftPeer server = RaftPeer.newBuilder().setId("s0").build();
- exception.expect(UnsupportedOperationException.class);
- exception.expectMessage(DisabledDataStreamClientFactory.class.getName()
- + "$1 does not support streamAsync");
- // stream() will create a header request, thus it will hit
UnsupportedOperationException due to
- // DisabledDataStreamFactory.
- client.getDataStreamApi().stream();
+ // stream() will create a header request, thus it will hit
UnsupportedOperationException due to
+ // DisabledDataStreamFactory.
+ try (RaftClient client = RaftClient.newBuilder()
+ .setRaftGroup(RaftGroup.valueOf(RaftGroupId.randomId(), server))
+ .setProperties(properties)
+ .build();
+ DataStreamOutput out = client.getDataStreamApi().stream()) {
+ Assert.fail("Unexpected object: " + out);
+ } catch (UnsupportedOperationException e) {
+ Assert.assertTrue(e.getMessage().contains(
+ DisabledDataStreamClientFactory.class.getName() + "$1 does not
support streamAsync"));
+ }
}
}
diff --git
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
index 92b6f7d3c..06f7ad30f 100644
---
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
+++
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
@@ -712,8 +712,8 @@ public class TestSegmentedRaftLog extends BaseTest {
long start = System.nanoTime();
for (int i = 0; i < entries.size(); i += 5) {
// call append API
- futures.add(raftLog.append(entries.get(i), entries.get(i + 1),
entries.get(i + 2), entries.get(i + 3),
- entries.get(i + 4)));
+ futures.add(raftLog.append(Arrays.asList(
+ entries.get(i), entries.get(i + 1), entries.get(i + 2),
entries.get(i + 3), entries.get(i + 4))));
}
for (List<CompletableFuture<Long>> futureList: futures) {
futureList.forEach(CompletableFuture::join);