Skip to content

Commit c016249

Browse files
committed
Enh 38000002 - [37486697->14.1.1.0.22] Add a JMX operation to the Cluster MBean to set a new log level for all nodes in the cluster (14.1.1.0 cl 116667 --> 14.1.1.0 CE)
[git-p4: depot-paths = "//dev/coherence-ce/release/coherence-ce-v14.1.1.0/": change = 116695]
1 parent 322c580 commit c016249

File tree

3 files changed

+125
-1
lines changed

3 files changed

+125
-1
lines changed

prj/test/functional/jmx/src/test/java/jmx/JmxTests.java

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2000, 2023, Oracle and/or its affiliates.
2+
* Copyright (c) 2000, 2025, Oracle and/or its affiliates.
33
*
44
* Licensed under the Universal Permissive License v 1.0 as shown at
55
* https://oss.oracle.com/licenses/upl.
@@ -784,6 +784,89 @@ public void testQuorumStatusOfSuspendedService()
784784
}
785785
}
786786

787+
/**
788+
* Test that the loggingLevel of a cluster can be dynamically changed for members within a specific role, or,
789+
* when no role is specified, for all members of the cluster.
790+
*/
791+
@Test
792+
public void testConfigureLogLevel()
793+
{
794+
CacheFactory.shutdown();
795+
796+
Properties propsMain = new Properties();
797+
propsMain.setProperty("coherence.role", "node1");
798+
propsMain.setProperty("coherence.management","all");
799+
propsMain.setProperty("coherence.management.remote","true");
800+
propsMain.setProperty("test.log", "jdk");
801+
propsMain.setProperty("test.log.level", "6");
802+
propsMain.setProperty("java.net.preferIPV4Stack", "true");
803+
804+
Cluster cluster = CacheFactory.ensureCluster();
805+
806+
assertTrue(cluster.isRunning());
807+
assertEquals("cluster already exists", 1, cluster.getMemberSet().size());
808+
809+
// add 2 members to the cluster
810+
propsMain.setProperty("coherence.role", "node2");
811+
CoherenceClusterMember member2 = startCacheServer(m_testName.getMethodName() + "-member2", PROJECT, null, propsMain);
812+
propsMain.setProperty("coherence.role", "node3");
813+
CoherenceClusterMember member3 = startCacheServer(m_testName.getMethodName() + "-member3", PROJECT, null, propsMain);
814+
Eventually.assertDeferred(member2::getClusterSize, is(3));
815+
816+
MBeanServer serverJMX = MBeanHelper.findMBeanServer();
817+
try
818+
{
819+
updateLoggingLevelForCluster(serverJMX, null, 6);
820+
// initial state
821+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(6));
822+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(6));
823+
824+
// change log level of all members to 9
825+
updateLoggingLevelForCluster(serverJMX, null, 9);
826+
827+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(9));
828+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(9));
829+
830+
// change log level of all members to 6
831+
updateLoggingLevelForCluster(serverJMX, null, 6);
832+
833+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(6));
834+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(6));
835+
836+
// change log level of member2 to 9
837+
updateLoggingLevelForCluster(serverJMX, "node2", 9);
838+
839+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(9));
840+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(6));
841+
842+
// change log level of member3 to 9
843+
updateLoggingLevelForCluster(serverJMX, "node3", 9);
844+
845+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(9));
846+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(9));
847+
848+
// attempt to change log level of all members to 20, revert to max log level
849+
updateLoggingLevelForCluster(serverJMX, null, 20);
850+
851+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(9));
852+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(9));
853+
854+
// attempt to change log level of all members to -1, revert to min log level
855+
updateLoggingLevelForCluster(serverJMX, null, -1);
856+
857+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member2), is(0));
858+
Eventually.assertDeferred(() -> getLoggingLevelForMember(serverJMX, member3), is(0));
859+
}
860+
catch (Exception e)
861+
{
862+
fail(e.getMessage());
863+
}
864+
finally
865+
{
866+
AbstractFunctionalTest._shutdown();
867+
}
868+
}
869+
787870
/**
788871
* Test that when logClusterState operation of ClusterMBean is invoked,
789872
* the thread dump is logged.
@@ -1324,6 +1407,47 @@ public Object getEventAttribute(String sService, int nodeId, String sAttribute)
13241407
return -1;
13251408
}
13261409

1410+
/**
1411+
* Return the current value for the "LoggingLevel" JMX attribute.
1412+
*
1413+
* @param server the {@link MBeanServer} to query
1414+
* @param member the {@link CoherenceClusterMember} of interest
1415+
*
1416+
* @return the current configuration value or -1 if the attribute can't be retrieved.
1417+
*/
1418+
public int getLoggingLevelForMember(MBeanServer server, CoherenceClusterMember member)
1419+
{
1420+
try
1421+
{
1422+
ObjectName oBeanName = new ObjectName("Coherence:type=Node,nodeId=" + member.getLocalMemberId());
1423+
1424+
return (int) getMbeanAttribute(server, oBeanName, "LoggingLevel");
1425+
}
1426+
catch (Exception e)
1427+
{
1428+
Assert.fail(printStackTrace(e));
1429+
}
1430+
return -1;
1431+
}
1432+
1433+
/**
1434+
* Update the logging level at the cluster-level via JMX.
1435+
*
1436+
* @param server the {@link MBeanServer}
1437+
* @param sRole the member roles the changes should be scoped to
1438+
* @param nLevel the new logging level
1439+
*
1440+
* @throws Exception if an unexpected error occurs
1441+
*/
1442+
public void updateLoggingLevelForCluster(MBeanServer server, String sRole, int nLevel)
1443+
throws Exception
1444+
{
1445+
server.invoke(new ObjectName("Coherence:type=Cluster"),
1446+
"configureLogLevel",
1447+
new Object[] {sRole, Integer.valueOf(nLevel)},
1448+
new String[] {String.class.getName(), Integer.class.getName()});
1449+
}
1450+
13271451
/**
13281452
* Helper function to start a cache server with specified site name, rack name and machine name.
13291453
*
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)