You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2018/07/12 16:00:01 UTC
ignite git commit: IGNITE-8776 Eviction policy MBeans are never
registered if evictionPolicyFactory is used - Fixes #4300.
Repository: ignite
Updated Branches:
refs/heads/master 6dc473d79 -> 31e88fc32
IGNITE-8776 Eviction policy MBeans are never registered if evictionPolicyFactory is used - Fixes #4300.
Signed-off-by: Dmitriy Pavlov <dp...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/31e88fc3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/31e88fc3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/31e88fc3
Branch: refs/heads/master
Commit: 31e88fc32725aebfc52e705c0b7c085fec510f66
Parents: 6dc473d
Author: kcmvp <kc...@gmail.com>
Authored: Thu Jul 12 18:59:41 2018 +0300
Committer: Dmitriy Pavlov <dp...@apache.org>
Committed: Thu Jul 12 18:59:41 2018 +0300
----------------------------------------------------------------------
.../cache/GridCacheEvictionManager.java | 128 +++++++++++++++++++
.../processors/cache/GridCacheProcessor.java | 18 ---
.../cache/GridEvictionPolicyMBeansTest.java | 117 +++++++++++++++++
.../IgniteCacheMetricsSelfTestSuite.java | 3 +
4 files changed, 248 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/31e88fc3/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionManager.java
index 2c9dec7..6caf3e4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEvictionManager.java
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.processors.cache;
import java.util.Collection;
+import javax.management.MBeanServer;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cache.eviction.EvictionFilter;
import org.apache.ignite.cache.eviction.EvictionPolicy;
@@ -30,6 +31,7 @@ import org.apache.ignite.internal.util.GridBusyLock;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.mxbean.IgniteMBeanAware;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.events.EventType.EVT_CACHE_ENTRY_EVICTED;
@@ -72,6 +74,9 @@ public class GridCacheEvictionManager extends GridCacheManagerAdapter implements
plcEnabled = plc != null;
+ if (plcEnabled)
+ prepare(cfg, plc, cctx.isNear());
+
filter = cfg.getEvictionFilter();
if (log.isDebugEnabled())
@@ -311,4 +316,127 @@ public class GridCacheEvictionManager extends GridCacheManagerAdapter implements
public EvictionPolicy getEvictionPolicy() {
return plc;
}
+
+ /**
+ * Performs injections and MBean registration.
+ *
+ * @param cfg Cache configuration.
+ * @param rsrc Resource.
+ * @param near Near flag.
+ * @throws IgniteCheckedException If failed.
+ */
+ private void prepare(CacheConfiguration cfg, @Nullable Object rsrc, boolean near) throws IgniteCheckedException {
+ cctx.kernalContext().resource().injectGeneric(rsrc);
+
+ cctx.kernalContext().resource().injectCacheName(rsrc, cfg.getName());
+
+ registerMbean(rsrc, cfg.getName(), near);
+ }
+
+ /**
+ * Registers MBean for cache components.
+ *
+ * @param obj Cache component.
+ * @param cacheName Cache name.
+ * @param near Near flag.
+ * @throws IgniteCheckedException If registration failed.
+ */
+ @SuppressWarnings("unchecked")
+ private void registerMbean(Object obj, @Nullable String cacheName, boolean near)
+ throws IgniteCheckedException {
+ if (U.IGNITE_MBEANS_DISABLED)
+ return;
+
+ assert obj != null;
+
+ MBeanServer srvr = cctx.kernalContext().config().getMBeanServer();
+
+ assert srvr != null;
+
+ cacheName = U.maskName(cacheName);
+
+ cacheName = near ? cacheName + "-near" : cacheName;
+
+ final Object mbeanImpl = (obj instanceof IgniteMBeanAware) ? ((IgniteMBeanAware)obj).getMBean() : obj;
+
+ for (Class<?> itf : mbeanImpl.getClass().getInterfaces()) {
+ if (itf.getName().endsWith("MBean") || itf.getName().endsWith("MXBean")) {
+ try {
+ U.registerMBean(srvr, cctx.kernalContext().igniteInstanceName(), cacheName, obj.getClass().getName(),
+ mbeanImpl, (Class<Object>)itf);
+ }
+ catch (Throwable e) {
+ throw new IgniteCheckedException("Failed to register MBean for component: " + obj, e);
+ }
+
+ break;
+ }
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void stop0(boolean cancel, boolean destroy) {
+ cleanup(cctx.config(), plc, cctx.isNear());
+ }
+
+ /**
+ * @param cfg Cache configuration.
+ * @param rsrc Resource.
+ * @param near Near flag.
+ */
+ void cleanup(CacheConfiguration cfg, @Nullable Object rsrc, boolean near) {
+ if (rsrc != null) {
+ unregisterMbean(rsrc, cfg.getName(), near);
+
+ try {
+ cctx.kernalContext().resource().cleanupGeneric(rsrc);
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to cleanup resource: " + rsrc, e);
+ }
+ }
+ }
+
+ /**
+ * Unregisters MBean for cache components.
+ *
+ * @param o Cache component.
+ * @param cacheName Cache name.
+ * @param near Near flag.
+ */
+ private void unregisterMbean(Object o, @Nullable String cacheName, boolean near) {
+ if (U.IGNITE_MBEANS_DISABLED)
+ return;
+
+ assert o != null;
+
+ MBeanServer srvr = cctx.kernalContext().config().getMBeanServer();
+
+ assert srvr != null;
+
+ cacheName = U.maskName(cacheName);
+
+ cacheName = near ? cacheName + "-near" : cacheName;
+
+ boolean needToUnregister = o instanceof IgniteMBeanAware;
+
+ if (!needToUnregister) {
+ for (Class<?> itf : o.getClass().getInterfaces()) {
+ if (itf.getName().endsWith("MBean") || itf.getName().endsWith("MXBean")) {
+ needToUnregister = true;
+
+ break;
+ }
+ }
+ }
+
+ if (needToUnregister) {
+ try {
+ srvr.unregisterMBean(U.makeMBeanName(cctx.kernalContext().igniteInstanceName(), cacheName, o.getClass().getName()));
+ }
+ catch (Throwable e) {
+ U.error(log, "Failed to unregister MBean for component: " + o, e);
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/31e88fc3/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 99bb4cb..26f1887 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -572,20 +572,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @throws IgniteCheckedException If failed to inject.
*/
private void prepare(CacheConfiguration cfg, Collection<Object> objs) throws IgniteCheckedException {
- prepare(cfg, cfg.getEvictionPolicyFactory(), false);
- prepare(cfg, cfg.getEvictionPolicy(), false);
prepare(cfg, cfg.getAffinity(), false);
prepare(cfg, cfg.getAffinityMapper(), false);
prepare(cfg, cfg.getEvictionFilter(), false);
prepare(cfg, cfg.getInterceptor(), false);
- NearCacheConfiguration nearCfg = cfg.getNearConfiguration();
-
- if (nearCfg != null) {
- prepare(cfg, nearCfg.getNearEvictionPolicyFactory(), true);
- prepare(cfg, nearCfg.getNearEvictionPolicy(), true);
- }
-
for (Object obj : objs)
prepare(cfg, obj, false);
}
@@ -612,8 +603,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
private void cleanup(GridCacheContext cctx) {
CacheConfiguration cfg = cctx.config();
- cleanup(cfg, cfg.getEvictionPolicyFactory(), false);
- cleanup(cfg, cfg.getEvictionPolicy(), false);
cleanup(cfg, cfg.getAffinity(), false);
cleanup(cfg, cfg.getAffinityMapper(), false);
cleanup(cfg, cfg.getEvictionFilter(), false);
@@ -625,13 +614,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
unregisterMbean(cctx.cache().clusterMxBean(), cfg.getName(), false);
}
- NearCacheConfiguration nearCfg = cfg.getNearConfiguration();
-
- if (nearCfg != null) {
- cleanup(cfg, nearCfg.getNearEvictionPolicyFactory(), true);
- cleanup(cfg, nearCfg.getNearEvictionPolicy(), true);
- }
-
cctx.cleanup();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/31e88fc3/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridEvictionPolicyMBeansTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridEvictionPolicyMBeansTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridEvictionPolicyMBeansTest.java
new file mode 100644
index 0000000..b093bb2
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridEvictionPolicyMBeansTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import javax.management.ObjectName;
+import org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicyFactory;
+import org.apache.ignite.cache.eviction.lru.LruEvictionPolicy;
+import org.apache.ignite.cache.eviction.lru.LruEvictionPolicyFactory;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Tests for the eviction policy JMX beans registered by the kernal.
+ */
+public class GridEvictionPolicyMBeansTest extends GridCommonAbstractTest {
+ /** Create test and auto-start the grid */
+ public GridEvictionPolicyMBeansTest() {
+ super(true);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation adds eviction policies.
+ */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+ FifoEvictionPolicyFactory<String, String> plc = new FifoEvictionPolicyFactory<>();
+
+ plc.setMaxSize(100);
+ plc.setBatchSize(10);
+ plc.setMaxMemorySize(20);
+
+ CacheConfiguration cache1 = defaultCacheConfiguration();
+
+ cache1.setName("cache1");
+ cache1.setOnheapCacheEnabled(true);
+ cache1.setEvictionPolicyFactory(plc);
+
+ NearCacheConfiguration ncf = new NearCacheConfiguration<>();
+
+ ncf.setNearEvictionPolicyFactory(new LruEvictionPolicyFactory<>(40, 10, 500));
+
+ cache1.setNearConfiguration(ncf);
+
+ CacheConfiguration cache2 = defaultCacheConfiguration();
+
+ cache2.setName("cache2");
+ cache2.setOnheapCacheEnabled(true);
+
+ LruEvictionPolicy lep = new LruEvictionPolicy();
+
+ lep.setBatchSize(10);
+ lep.setMaxMemorySize(125);
+ lep.setMaxSize(30);
+ cache2.setEvictionPolicy(lep);
+
+ ncf = new NearCacheConfiguration<>();
+ lep = new LruEvictionPolicy();
+
+ lep.setBatchSize(10);
+ lep.setMaxMemorySize(500);
+ lep.setMaxSize(40);
+ ncf.setNearEvictionPolicy(lep);
+ cache2.setNearConfiguration(ncf);
+
+ cfg.setCacheConfiguration(cache1, cache2);
+
+ return cfg;
+ }
+
+ /** Check that eviction bean is available */
+ public void testEvictionPolicyBeans() throws Exception{
+ checkBean("cache1", "org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy", "MaxSize", 100);
+ checkBean("cache1", "org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy", "BatchSize", 10);
+ checkBean("cache1", "org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy", "MaxMemorySize", 20L);
+
+ checkBean("cache1-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxSize", 40);
+ checkBean("cache1-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "BatchSize", 10);
+ checkBean("cache1-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxMemorySize", 500L);
+
+ checkBean("cache2", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxSize", 30);
+ checkBean("cache2", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "BatchSize", 10);
+ checkBean("cache2", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxMemorySize", 125L);
+
+ checkBean("cache2-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxSize", 40);
+ checkBean("cache2-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "BatchSize", 10);
+ checkBean("cache2-near", "org.apache.ignite.cache.eviction.lru.LruEvictionPolicy", "MaxMemorySize", 500L);
+ }
+
+ /** Checks that a bean with the specified group and name is available and has the expected attribute */
+ private void checkBean(String grp, String name, String attributeName, Object expAttributeVal) throws Exception {
+ ObjectName mBeanName = IgniteUtils.makeMBeanName(grid().name(), grp, name);
+ Object attributeVal = grid().configuration().getMBeanServer().getAttribute(mBeanName, attributeName);
+
+ assertEquals(expAttributeVal, attributeVal);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/31e88fc3/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMetricsSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMetricsSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMetricsSelfTestSuite.java
index 237f7e1..dc79123 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMetricsSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMetricsSelfTestSuite.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.cache.CacheMetricsEnableRuntimeTest
import org.apache.ignite.internal.processors.cache.CacheMetricsEntitiesCountTest;
import org.apache.ignite.internal.processors.cache.CacheMetricsForClusterGroupSelfTest;
import org.apache.ignite.internal.processors.cache.CacheValidatorMetricsTest;
+import org.apache.ignite.internal.processors.cache.GridEvictionPolicyMBeansTest;
import org.apache.ignite.internal.processors.cache.OffheapCacheMetricsForClusterGroupSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicPartitionedMetricsSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicPartitionedTckMetricsSelfTestImpl;
@@ -77,6 +78,8 @@ public class IgniteCacheMetricsSelfTestSuite extends TestSuite {
suite.addTestSuite(TransactionMetricsMxBeanImplTest.class);
+ suite.addTestSuite(GridEvictionPolicyMBeansTest.class);
+
return suite;
}
}