You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/01/13 16:21:54 UTC

[4/7] incubator-ignite git commit: ignite-45: wip

ignite-45: wip


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/5800a756
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/5800a756
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/5800a756

Branch: refs/heads/ignite-1
Commit: 5800a75660a534711388367ef9046afb4603d041
Parents: 5190b12
Author: Yakov Zhdanov <yz...@gridgain.com>
Authored: Mon Jan 12 09:35:30 2015 +0300
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Mon Jan 12 09:35:30 2015 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/IgniteCacheManager.java   | 107 +++++++++++++---
 .../processors/cache/IgniteCacheProxy.java      |   9 +-
 .../ignite/tck/TCKMBeanServerBuilder.java       | 124 +++++++++++++++++++
 3 files changed, 217 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5800a756/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java b/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
index 2f0073f..376c982 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
@@ -10,11 +10,14 @@
 package org.apache.ignite;
 
 import org.apache.ignite.configuration.*;
+import org.apache.ignite.lang.*;
 import org.gridgain.grid.cache.*;
+import org.gridgain.grid.util.typedef.*;
 
 import javax.cache.*;
 import javax.cache.configuration.*;
 import javax.cache.spi.*;
+import javax.management.*;
 import java.net.*;
 import java.util.*;
 import java.util.concurrent.atomic.*;
@@ -24,7 +27,7 @@ import java.util.concurrent.atomic.*;
  */
 public class IgniteCacheManager implements CacheManager {
     /** */
-    private final Map<String, Ignite> igniteMap = new HashMap<>();
+    private final Map<String, IgniteBiTuple<Ignite, IgniteCacheMXBean>> igniteMap = new HashMap<>();
 
     /** */
     private final URI uri;
@@ -45,7 +48,7 @@ public class IgniteCacheManager implements CacheManager {
      * @param uri Uri.
      * @param cachingProvider Caching provider.
      * @param clsLdr Class loader.
-     * @param props
+     * @param props Properties.
      */
     public IgniteCacheManager(URI uri, CachingProvider cachingProvider, ClassLoader clsLdr, Properties props) {
         this.uri = uri;
@@ -102,12 +105,14 @@ public class IgniteCacheManager implements CacheManager {
             }
         }
 
-        Ignite ignite;
+        IgniteCache<K, V> res;
 
         synchronized (igniteMap) {
             if (igniteMap.containsKey(cacheName))
                 throw new CacheException("Cache already exists [cacheName=" + cacheName + ", manager=" + uri + ']');
 
+            Ignite ignite;
+
             if (uri.equals(cachingProvider.getDefaultURI())) {
                 IgniteConfiguration cfg = new IgniteConfiguration();
                 cfg.setGridName("grid-for-" + cacheName);
@@ -126,26 +131,31 @@ public class IgniteCacheManager implements CacheManager {
             else
                 throw new UnsupportedOperationException();
 
-            igniteMap.put(cacheName, ignite);
+            res = ignite.jcache(cacheName);
+
+            igniteMap.put(cacheName, new T2<>(ignite, new IgniteCacheMXBean(res)));
         }
 
-        return ignite.jcache(cacheName);
+        if (((CompleteConfiguration)cacheCfg).isManagementEnabled())
+            enableManagement(cacheName, true);
+
+        return res;
     }
 
     /**
      * @param cacheName Cache name.
      */
     private <K, V> IgniteCache<K, V> findCache(String cacheName) {
-        Ignite ignite;
+        IgniteBiTuple<Ignite, IgniteCacheMXBean> tuple;
 
         synchronized (igniteMap) {
-            ignite = igniteMap.get(cacheName);
+            tuple = igniteMap.get(cacheName);
         }
 
-        if (ignite == null)
+        if (tuple == null)
             return null;
 
-        return ignite.jcache(cacheName);
+        return tuple.get1().jcache(cacheName);
     }
 
     /** {@inheritDoc} */
@@ -202,8 +212,13 @@ public class IgniteCacheManager implements CacheManager {
      */
     public boolean isManagedIgnite(Ignite ignite) {
         synchronized (igniteMap) {
-            return igniteMap.values().contains(ignite);
+            for (IgniteBiTuple<Ignite, IgniteCacheMXBean> tuple : igniteMap.values()) {
+                if (ignite.equals(tuple.get1()))
+                    return true;
+            }
         }
+
+        return false;
     }
 
     /** {@inheritDoc} */
@@ -213,19 +228,48 @@ public class IgniteCacheManager implements CacheManager {
         if (cacheName == null)
             throw new NullPointerException();
 
-        Ignite ignite;
+        IgniteBiTuple<Ignite, IgniteCacheMXBean> tuple;
 
         synchronized (igniteMap) {
-            ignite = igniteMap.remove(cacheName);
+            tuple = igniteMap.remove(cacheName);
         }
 
-        if (ignite != null) {
+        if (tuple != null) {
             try {
-                ignite.close();
+                tuple.get1().close();
             }
             catch (Exception ignored) {
 
             }
+
+            ObjectName objName = getObjectName(cacheName);
+
+            MBeanServer mBeanSrv = tuple.get1().configuration().getMBeanServer();
+
+            for (ObjectName n : mBeanSrv.queryNames(objName, null)) {
+                try {
+                    mBeanSrv.unregisterMBean(n);
+                }
+                catch (Exception ignored) {
+
+                }
+            }
+        }
+    }
+
+    /**
+     * @param cacheName Cache name.
+     */
+    private ObjectName getObjectName(String cacheName) {
+        String mBeanName = "javax.cache:type=CacheConfiguration,CacheManager="
+            + uri.toString().replaceAll(",|:|=|\n", ".")
+            + ",Cache=" + cacheName.replaceAll(",|:|=|\n", ".");
+
+        try {
+            return new ObjectName(mBeanName);
+        }
+        catch (MalformedObjectNameException e) {
+            throw new CacheException("Failed to create MBean name: " + mBeanName, e);
         }
     }
 
@@ -236,7 +280,32 @@ public class IgniteCacheManager implements CacheManager {
         if (cacheName == null)
             throw new NullPointerException();
 
-        throw new UnsupportedOperationException();
+        IgniteBiTuple<Ignite, IgniteCacheMXBean> tuple;
+
+        synchronized (igniteMap) {
+            tuple = igniteMap.get(cacheName);
+        }
+
+        ObjectName objName = getObjectName(cacheName);
+        MBeanServer mBeanSrv = tuple.get1().configuration().getMBeanServer();
+
+        try {
+            if (enabled) {
+                if(mBeanSrv.queryNames(objName, null).isEmpty())
+                    mBeanSrv.registerMBean(tuple.get2(), objName);
+            }
+            else {
+                for (ObjectName n : mBeanSrv.queryNames(objName, null))
+                    mBeanSrv.unregisterMBean(n);
+
+            }
+        }
+        catch (InstanceAlreadyExistsException | InstanceNotFoundException ignored) {
+
+        }
+        catch (MBeanRegistrationException | NotCompliantMBeanException e) {
+            throw new CacheException(e);
+        }
     }
 
     /** {@inheritDoc} */
@@ -260,15 +329,15 @@ public class IgniteCacheManager implements CacheManager {
     /** {@inheritDoc} */
     @Override public void close() {
         if (closed.compareAndSet(false, true)) {
-            Ignite[] ignites;
+            IgniteBiTuple<Ignite, IgniteCacheMXBean>[] ignites;
 
             synchronized (igniteMap) {
-                ignites = igniteMap.values().toArray(new Ignite[igniteMap.values().size()]);
+                ignites = igniteMap.values().toArray(new IgniteBiTuple[igniteMap.values().size()]);
             }
 
-            for (Ignite ignite : ignites) {
+            for (IgniteBiTuple<Ignite, IgniteCacheMXBean> tuple : ignites) {
                 try {
-                    ignite.close();
+                    tuple.get1().close();
                 }
                 catch (Exception ignored) {
                     // Ignore any exceptions according to javadoc of javax.cache.CacheManager#close()

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5800a756/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
index 7d0bf2d..2f47697 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
@@ -747,6 +747,7 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
 
     /** {@inheritDoc} */
     @Override public CacheManager getCacheManager() {
+        // TODO IGNITE-45 (Support start/close/destroy cache correctly)
         IgniteCachingProvider provider = (IgniteCachingProvider)Caching.getCachingProvider(
             IgniteCachingProvider.class.getName(),
             IgniteCachingProvider.class.getClassLoader());
@@ -759,14 +760,14 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
 
     /** {@inheritDoc} */
     @Override public void close() {
-        // TODO IGNITE-1.
-        throw new UnsupportedOperationException();
+        // TODO IGNITE-45 (Support start/close/destroy cache correctly)
+        getCacheManager().destroyCache(getName());
     }
 
     /** {@inheritDoc} */
     @Override public boolean isClosed() {
-        // TODO IGNITE-1.
-        throw new UnsupportedOperationException();
+        // TODO IGNITE-45 (Support start/close/destroy cache correctly)
+        return getCacheManager() == null;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5800a756/modules/core/src/main/java/org/apache/ignite/tck/TCKMBeanServerBuilder.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/tck/TCKMBeanServerBuilder.java b/modules/core/src/main/java/org/apache/ignite/tck/TCKMBeanServerBuilder.java
new file mode 100644
index 0000000..8123504
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/tck/TCKMBeanServerBuilder.java
@@ -0,0 +1,124 @@
+/* @java.file.header */
+
+/*  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.tck;
+
+import com.sun.jmx.mbeanserver.*;
+
+import javax.management.*;
+
+/**
+ *
+ */
+public class TCKMBeanServerBuilder extends MBeanServerBuilder {
+    /** {@inheritDoc} */
+    @Override public MBeanServer newMBeanServer(String dfltDomain, MBeanServer outer, MBeanServerDelegate delegate) {
+        MBeanServerDelegate decoratingDelegate = new ServerDelegate(delegate);
+        return JmxMBeanServer.newMBeanServer(dfltDomain, outer,
+            decoratingDelegate, false);
+    }
+
+    /**
+     *
+     */
+    private static class ServerDelegate extends MBeanServerDelegate {
+        /** */
+        private final MBeanServerDelegate delegate;
+
+        /**
+         * Constructor
+         *
+         * @param delegate the provided delegate
+         */
+        ServerDelegate(MBeanServerDelegate delegate) {
+            this.delegate = delegate;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String getSpecificationName() {
+            return delegate.getSpecificationName();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public String getSpecificationVersion() {
+            return delegate.getSpecificationVersion();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public String getSpecificationVendor() {
+            return delegate.getSpecificationVendor();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public String getImplementationName() {
+            return delegate.getImplementationName();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public String getImplementationVersion() {
+            return delegate.getImplementationVersion();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public String getImplementationVendor() {
+            return delegate.getImplementationVendor();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public MBeanNotificationInfo[] getNotificationInfo() {
+            return delegate.getNotificationInfo();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public synchronized void addNotificationListener(NotificationListener listener,
+                                                         NotificationFilter filter,
+                                                         Object handback) throws
+            IllegalArgumentException {
+            delegate.addNotificationListener(listener, filter, handback);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public synchronized void removeNotificationListener(NotificationListener
+                                                                listener,
+                                                            NotificationFilter
+                                                                filter,
+                                                            Object handback) throws
+            ListenerNotFoundException {
+            delegate.removeNotificationListener(listener, filter, handback);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public synchronized void removeNotificationListener(NotificationListener
+                                                                listener) throws
+            ListenerNotFoundException {
+            delegate.removeNotificationListener(listener);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public void sendNotification(Notification notification) {
+            delegate.sendNotification(notification);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public synchronized String getMBeanServerId() {
+            return System.getProperty("org.jsr107.tck.management.agentId");
+        }
+    }
+}