|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. |
| 2 | + * Copyright (c) 2000, 2025, Oracle and/or its affiliates. |
3 | 3 | *
|
4 | 4 | * Licensed under the Universal Permissive License v 1.0 as shown at
|
5 | 5 | * https://oss.oracle.com/licenses/upl.
|
@@ -784,6 +784,89 @@ public void testQuorumStatusOfSuspendedService()
|
784 | 784 | }
|
785 | 785 | }
|
786 | 786 |
|
| 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 | + |
787 | 870 | /**
|
788 | 871 | * Test that when logClusterState operation of ClusterMBean is invoked,
|
789 | 872 | * the thread dump is logged.
|
@@ -1324,6 +1407,47 @@ public Object getEventAttribute(String sService, int nodeId, String sAttribute)
|
1324 | 1407 | return -1;
|
1325 | 1408 | }
|
1326 | 1409 |
|
| 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 | + |
1327 | 1451 | /**
|
1328 | 1452 | * Helper function to start a cache server with specified site name, rack name and machine name.
|
1329 | 1453 | *
|
|
0 commit comments