# IGNITE-639 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/6011305b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/6011305b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/6011305b

Branch: refs/heads/ignite-639
Commit: 6011305b72610eb42290d090ccbf674324df5ddd
Parents: 8e21725
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Wed Apr 1 15:32:10 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Wed Apr 1 15:32:10 2015 +0700

----------------------------------------------------------------------
 .../org/apache/ignite/internal/IgniteEx.java    |   8 +
 .../apache/ignite/internal/IgniteKernal.java    |   5 +
 .../visor/cache/VisorCacheConfiguration.java    |  17 +-
 .../cache/VisorCacheMetricsCollectorTask.java   |  75 +++-
 .../HadoopDefaultMapReducePlannerSelfTest.java  |   5 +
 .../commands/cache/VisorCacheCommand.scala      | 374 ++++++++++---------
 6 files changed, 296 insertions(+), 188 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
index b8c1e11..6604050 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
@@ -69,6 +69,14 @@ public interface IgniteEx extends Ignite {
     public Collection<GridCache<?, ?>> cachesx(@Nullable IgnitePredicate<? 
super GridCache<?, ?>>... p);
 
     /**
+     * Gets system state of cache with specified name.
+     *
+     * @param name Cache name.
+     * @return {@code true} if cache with specified name is system.
+     */
+    public boolean systemCache(@Nullable String name);
+
+    /**
      * Checks if the event type is user-recordable.
      *
      * @param type Event type to check.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 5f35d16..c8cd372 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -2448,6 +2448,11 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
     }
 
     /** {@inheritDoc} */
+    @Override public boolean systemCache(@Nullable String name) {
+        return ctx.cache().systemCache(name);
+    }
+
+    /** {@inheritDoc} */
     @Override public <K, V> GridCache<K, V> cachex() {
         guard();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
index 98a8bc2..7afdb0d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import org.apache.ignite.*;
 import org.apache.ignite.cache.*;
 import org.apache.ignite.configuration.*;
+import org.apache.ignite.internal.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
 import org.jetbrains.annotations.*;
 
@@ -116,12 +116,15 @@ public class VisorCacheConfiguration implements 
Serializable {
     /** Query configuration. */
     private VisorCacheQueryConfiguration qryCfg;
 
+    /** System cache state. */
+    private boolean system;
+
     /**
      * @param ignite Grid.
      * @param ccfg Cache configuration.
      * @return Data transfer object for cache configuration properties.
      */
-    public static VisorCacheConfiguration from(Ignite ignite, 
CacheConfiguration ccfg) {
+    public static VisorCacheConfiguration from(IgniteEx ignite, 
CacheConfiguration ccfg) {
         VisorCacheConfiguration cfg = new VisorCacheConfiguration();
 
         cfg.name = ccfg.getName();
@@ -144,6 +147,7 @@ public class VisorCacheConfiguration implements 
Serializable {
         cfg.ldrFactory = compactClass(ccfg.getCacheLoaderFactory());
         cfg.writerFactory = compactClass(ccfg.getCacheWriterFactory());
         cfg.expiryPlcFactory = compactClass(ccfg.getExpiryPolicyFactory());
+        cfg.system = ignite.systemCache(ccfg.getName());
 
         cfg.affinityCfg = VisorCacheAffinityConfiguration.from(ccfg);
         cfg.rebalanceCfg = VisorCacheRebalanceConfiguration.from(ccfg);
@@ -161,7 +165,7 @@ public class VisorCacheConfiguration implements 
Serializable {
      * @param caches Cache configurations.
      * @return Data transfer object for cache configurations properties.
      */
-    public static Iterable<VisorCacheConfiguration> list(Ignite ignite, 
CacheConfiguration[] caches) {
+    public static Iterable<VisorCacheConfiguration> list(IgniteEx ignite, 
CacheConfiguration[] caches) {
         if (caches == null)
             return Collections.emptyList();
 
@@ -369,6 +373,13 @@ public class VisorCacheConfiguration implements 
Serializable {
         return qryCfg;
     }
 
+    /**
+     * @return System cache state.
+     */
+    public boolean system() {
+        return system;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(VisorCacheConfiguration.class, this);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
index de232f7..f29d47a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
@@ -26,19 +26,21 @@ import org.apache.ignite.internal.visor.*;
 import org.apache.ignite.lang.*;
 import org.jetbrains.annotations.*;
 
+import java.io.*;
 import java.util.*;
 
 /**
  * Task that collect cache metrics from all nodes.
  */
 @GridInternal
-public class VisorCacheMetricsCollectorTask extends 
VisorMultiNodeTask<IgniteBiTuple<Boolean, String>,
-    Iterable<VisorCacheAggregatedMetrics>, Map<String, VisorCacheMetrics>> {
+public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<
+    VisorCacheMetricsCollectorTask.VisorCacheMetricsCollectorArg, 
Iterable<VisorCacheAggregatedMetrics>,
+    Map<String, VisorCacheMetrics>> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorCacheMetricsCollectorJob 
job(IgniteBiTuple<Boolean, String> arg) {
+    @Override protected VisorCacheMetricsCollectorJob 
job(VisorCacheMetricsCollectorArg arg) {
         return new VisorCacheMetricsCollectorJob(arg, debug);
     }
 
@@ -72,7 +74,7 @@ public class VisorCacheMetricsCollectorTask extends 
VisorMultiNodeTask<IgniteBiT
      * Job that collect cache metrics from node.
      */
     private static class VisorCacheMetricsCollectorJob
-        extends VisorJob<IgniteBiTuple<Boolean, String>, Map<String, 
VisorCacheMetrics>> {
+        extends VisorJob<VisorCacheMetricsCollectorArg, Map<String, 
VisorCacheMetrics>> {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -82,15 +84,15 @@ public class VisorCacheMetricsCollectorTask extends 
VisorMultiNodeTask<IgniteBiT
          * @param arg Whether to collect metrics for all caches or for 
specified cache name only.
          * @param debug Debug flag.
          */
-        private VisorCacheMetricsCollectorJob(IgniteBiTuple<Boolean, String> 
arg, boolean debug) {
+        private VisorCacheMetricsCollectorJob(VisorCacheMetricsCollectorArg 
arg, boolean debug) {
             super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected Map<String, VisorCacheMetrics> 
run(IgniteBiTuple<Boolean, String> arg) {
-            Collection<? extends GridCache<?, ?>> caches = arg.get1()
-                ? ignite.cachesx()
-                : F.asList(ignite.cachex(arg.get2()));
+        @Override protected Map<String, VisorCacheMetrics> run(final 
VisorCacheMetricsCollectorArg arg) {
+            Collection<? extends GridCache<?, ?>> caches = arg.allCaches
+                ? ignite.cachesx(new 
VisorSystemCachesPredicate(arg.systemCaches))
+                : F.asList(ignite.cachex(arg.cacheName));
 
             if (caches != null) {
                 Map<String, VisorCacheMetrics> res = 
U.newHashMap(caches.size());
@@ -109,4 +111,59 @@ public class VisorCacheMetricsCollectorTask extends 
VisorMultiNodeTask<IgniteBiT
             return S.toString(VisorCacheMetricsCollectorJob.class, this);
         }
     }
+
+    /**
+     * Arguments for {@link VisorCacheMetricsCollectorTask}.
+     */
+    @SuppressWarnings("PublicInnerClass")
+    public static class VisorCacheMetricsCollectorArg implements Serializable {
+        /** Collect metrics for all caches. */
+        private final Boolean allCaches;
+
+        /** Include system cache metrics. */
+        private final Boolean systemCaches;
+
+        /** Collect metrics for cache with name only. */
+        private final String cacheName;
+
+        /**
+         * Create task arguments with given parameters.
+         *
+         * @param allCaches Collect metrics for all caches.
+         * @param systemCaches Include system cache metrics.
+         * @param cacheName Collect metrics for cache with name only.
+         */
+        public VisorCacheMetricsCollectorArg(Boolean allCaches, Boolean 
systemCaches, String cacheName) {
+            this.allCaches = allCaches;
+            this.systemCaches = systemCaches;
+            this.cacheName = cacheName;
+        }
+
+        /** @return Collect metrics for all caches. */
+        public Boolean allCaches() {
+            return allCaches;
+        }
+
+        /** @return Include system cache metrics. */
+        public Boolean systemCaches() {
+            return systemCaches;
+        }
+
+        /** @return Collect metrics for cache with name only. */
+        public String cacheName() {
+            return cacheName;
+        }
+    }
+
+    private static class VisorSystemCachesPredicate implements 
IgnitePredicate<GridCache<?,?>> {
+        private final Boolean showSystem;
+
+        VisorSystemCachesPredicate(Boolean showSystem) {
+            this.showSystem = showSystem;
+        }
+
+        @Override public boolean apply(GridCache<?, ?> cache) {
+            return showSystem || !CU.isSystemCache(cache.name());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultMapReducePlannerSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultMapReducePlannerSelfTest.java
 
b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultMapReducePlannerSelfTest.java
index 7075f2e..bd84be2 100644
--- 
a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultMapReducePlannerSelfTest.java
+++ 
b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopDefaultMapReducePlannerSelfTest.java
@@ -961,6 +961,11 @@ public class HadoopDefaultMapReducePlannerSelfTest extends 
HadoopAbstractSelfTes
         }
 
         /** {@inheritDoc} */
+        @Override public boolean systemCache(@Nullable String name) {
+            return false;
+        }
+
+        /** {@inheritDoc} */
         @SuppressWarnings("unchecked")
         @Override public Collection<GridCache<?, ?>> cachesx(@Nullable 
IgnitePredicate<? super GridCache<?, ?>>... p) {
             return null;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6011305b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
----------------------------------------------------------------------
diff --git 
a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
 
b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
index e11c197..53792f1 100644
--- 
a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
+++ 
b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
@@ -21,7 +21,6 @@ import org.apache.ignite._
 import org.apache.ignite.cluster.ClusterNode
 import org.apache.ignite.internal.processors.cache.{GridCacheUtils => CU}
 import org.apache.ignite.internal.util.typedef._
-import org.apache.ignite.lang.IgniteBiTuple
 import org.apache.ignite.visor.VisorTag
 import org.apache.ignite.visor.commands.cache.VisorCacheCommand._
 import org.apache.ignite.visor.commands.{VisorConsoleCommand, VisorTextTable}
@@ -32,13 +31,13 @@ import org.jetbrains.annotations._
 import java.lang.{Boolean => JavaBoolean}
 import java.util.UUID
 
+import 
org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTask.VisorCacheMetricsCollectorArg
 import org.apache.ignite.internal.visor.cache._
 import org.apache.ignite.internal.visor.node.{VisorGridConfiguration, 
VisorNodeConfigurationCollectorTask}
 import org.apache.ignite.internal.visor.util.VisorTaskUtils._
 
 import scala.collection.JavaConversions._
 import scala.language.{implicitConversions, reflectiveCalls}
-import scala.util.control.Breaks._
 
 /**
  * ==Overview==
@@ -67,11 +66,11 @@ import scala.util.control.Breaks._
  *
  * ====Specification====
  * {{{
- *     cache
- *     cache -i
- *     cache {-c=<cache-name>} {-id=<node-id>|id8=<node-id8>} 
{-s=hi|mi|rd|wr|cn} {-a} {-r}
+ *     cache {-system}
+ *     cache -i {-system}
+ *     cache {-c=<cache-name>} {-id=<node-id>|id8=<node-id8>} 
{-s=hi|mi|rd|wr|cn} {-a} {-r} {-system}
  *     cache -clear {-c=<cache-name>}
- *     cache -scan -c=<cache-name> {-id=<node-id>|id8=<node-id8>} {-p=<page 
size>}
+ *     cache -scan -c=<cache-name> {-id=<node-id>|id8=<node-id8>} {-p=<page 
size>} {-system}
  *     cache -swap {-c=<cache-name>} {-id=<node-id>|id8=<node-id8>}
  *     cache -stop -c=<cache-name>
  * }}}
@@ -105,6 +104,8 @@ import scala.util.control.Breaks._
  *     -a
  *         Prints details statistics about each cache.
  *         By default only aggregated summary is printed.
+ *     -system
+ *         Enable showing of information about system caches.
  *     -clear
  *          Clears cache.
  *     -scan
@@ -122,6 +123,8 @@ import scala.util.control.Breaks._
  * ====Examples====
  * {{{
  *     cache
+ *         Prints summary statistics about all no system caches.
+ *     cache -system
  *         Prints summary statistics about all caches.
  *     cache -id8=12345678 -s=hi -r
  *         Prints summary statistics about caches from node with specified id8
@@ -212,213 +215,227 @@ class VisorCacheCommand {
      * @param args Command arguments.
      */
     def cache(args: String) {
-        breakable {
-            if (!isConnected)
-                adviseToConnect()
-            else {
-                var argLst = parseArgs(args)
-
-                if (hasArgFlag("i", argLst)) {
-                    askForNode("Select node from:") match {
-                        case Some(nid) => ask("Detailed statistics (y/n) [n]: 
", "n") match {
-                            case "n" | "N" => nl(); cache("-id=" + nid).^^
-                            case "y" | "Y" => nl(); cache("-a -id=" + nid).^^
-                            case x => nl(); warn("Invalid answer: " + x).^^
-                        }
-                        case None => break()
+        if (!isConnected)
+            adviseToConnect()
+        else {
+            var argLst = parseArgs(args)
+
+            if (hasArgFlag("i", argLst)) {
+                askForNode("Select node from:") match {
+                    case Some(nid) => ask("Detailed statistics (y/n) [n]: ", 
"n") match {
+                        case "n" | "N" => nl(); cache("-id=" + nid).^^
+                        case "y" | "Y" => nl(); cache("-a -id=" + nid).^^
+                        case x => nl(); warn("Invalid answer: " + x).^^
                     }
-
-                    break()
-                }
-
-                val node = parseNode(argLst) match {
-                    case Left(msg) =>
-                        scold(msg)
-
-                        break()
-
-                    case Right(n) => n
+                    case None => return
                 }
 
-                var cacheName = argValue("c", argLst) match {
-                    case Some(dfltName) if dfltName == DFLT_CACHE_KEY || 
dfltName == DFLT_CACHE_NAME =>
-                        argLst = argLst.filter(_._1 != "c") ++ Seq("c" -> null)
-
-                        Some(null)
-
-                    case cn => cn
-                }
+                return
+            }
 
-                if (Seq("clear", "swap", "scan", "stop").exists(hasArgFlag(_, 
argLst))) {
-                    if (cacheName.isEmpty)
-                        askForCache("Select cache from:", node) match {
-                            case Some(name) =>
-                                argLst = argLst ++ Seq("c" -> name)
+            val node = parseNode(argLst) match {
+                case Left(msg) =>
+                    scold(msg)
 
-                                cacheName = Some(name)
-                            case None => break()
-                        }
+                    return
 
-                    if (hasArgFlag("clear", argLst))
-                        VisorCacheClearCommand().clear(argLst, node)
-                    else if (hasArgFlag("swap", argLst))
-                        VisorCacheSwapCommand().swap(argLst, node)
-                    else if (hasArgFlag("scan", argLst))
-                        VisorCacheScanCommand().scan(argLst, node)
-                    else if (hasArgFlag("stop", argLst)) {
-                        cacheName.foreach(name => {
-                            if (!CU.isSystemCache(name))
-                                VisorCacheStopCommand().scan(argLst, node)
-                            else
-                                warn("Stopping of system cache is not allowed: 
" + name)
-                        })
-                    }
+                case Right(n) => n
+            }
 
-                    break()
-                }
+            val showSystem = hasArgFlag("system", argLst)
 
-                val all = hasArgFlag("a", argLst)
+            var cacheName = argValue("c", argLst) match {
+                case Some(dfltName) if dfltName == DFLT_CACHE_KEY || dfltName 
== DFLT_CACHE_NAME =>
+                    argLst = argLst.filter(_._1 != "c") ++ Seq("c" -> null)
 
-                val sortType = argValue("s", argLst)
-                val reversed = hasArgName("r", argLst)
+                    Some(null)
 
-                if (sortType.isDefined && !isValidSortType(sortType.get))
-                    scold("Invalid '-s' argument in: " + args).^^
+                case cn => cn
+            }
 
-                // Get cache stats data from all nodes.
-                val aggrData = cacheData(node, cacheName)
+            /** Check that argument list has flag from list. */
+            def hasArgFlagIn(flags: String *) = {
+                flags.exists(hasArgFlag(_, argLst))
+            }
 
-                if (aggrData.isEmpty)
-                    scold("No caches found.").^^
+            if (hasArgFlagIn("clear", "swap", "scan", "stop")) {
+                if (cacheName.isEmpty)
+                    askForCache("Select cache from:", node, showSystem && 
!hasArgFlagIn("clear", "swap", "stop")) match {
+                        case Some(name) =>
+                            argLst = argLst ++ Seq("c" -> name)
 
-                println("Time of the snapshot: " + 
formatDateTime(System.currentTimeMillis))
+                            cacheName = Some(name)
 
-                val sumT = VisorTextTable()
+                        case None => return
+                    }
 
-                sumT #= ("Name(@)", "Nodes", "Entries", "Hits", "Misses", 
"Reads", "Writes")
+                cacheName.foreach(name => {
+                    if (hasArgFlag("scan", argLst))
+                        VisorCacheScanCommand().scan(argLst, node)
+                    else {
+                        if (!CU.isSystemCache(name)) {
+                            if (hasArgFlag("clear", argLst))
+                                VisorCacheClearCommand().clear(argLst, node)
+                            else if (hasArgFlag("swap", argLst))
+                                VisorCacheSwapCommand().swap(argLst, node)
+                            else if (hasArgFlag("stop", argLst))
+                                VisorCacheStopCommand().scan(argLst, node)
+                        }
+                        else {
+                            if (hasArgFlag("clear", argLst))
+                                warn("Clearing of system cache is not allowed: 
" + name)
+                            else if (hasArgFlag("swap", argLst))
+                                warn("Backup swapping of system cache is not 
allowed: " + name)
+                            else if (hasArgFlag("stop", argLst))
+                                warn("Stopping of system cache is not allowed: 
" + name)
+                        }
+                    }
+                })
 
-                sortAggregatedData(aggrData, sortType.getOrElse("cn"), 
reversed).foreach(
-                    ad => {
-                        // Add cache host as visor variable.
-                        registerCacheName(ad.cacheName)
+                return
+            }
 
-                        sumT += (
-                            mkCacheName(ad.cacheName),
-                            ad.nodes,
-                            (
-                                "min: " + ad.minimumSize,
-                                "avg: " + formatDouble(ad.averageSize),
-                                "max: " + ad.maximumSize
-                                ),
-                            (
-                                "min: " + ad.minimumHits,
-                                "avg: " + formatDouble(ad.averageHits),
-                                "max: " + ad.maximumHits
-                                ),
-                            (
-                                "min: " + ad.minimumMisses,
-                                "avg: " + formatDouble(ad.averageMisses),
-                                "max: " + ad.maximumMisses
-                                ),
-                            (
-                                "min: " + ad.minimumReads,
-                                "avg: " + formatDouble(ad.averageReads),
-                                "max: " + ad.maximumReads
-                                ),
-                            (
-                                "min: " + ad.minimumWrites,
-                                "avg: " + formatDouble(ad.averageWrites),
-                                "max: " + ad.maximumWrites
-                                )
+            val all = hasArgFlag("a", argLst)
+
+            val sortType = argValue("s", argLst)
+            val reversed = hasArgName("r", argLst)
+
+            if (sortType.isDefined && !isValidSortType(sortType.get))
+                scold("Invalid '-s' argument in: " + args).^^
+
+            // Get cache stats data from all nodes.
+            val aggrData = cacheData(node, cacheName, showSystem)
+
+            if (aggrData.isEmpty)
+                scold("No caches found.").^^
+
+            println("Time of the snapshot: " + 
formatDateTime(System.currentTimeMillis))
+
+            val sumT = VisorTextTable()
+
+            sumT #= ("Name(@)", "Nodes", "Entries", "Hits", "Misses", "Reads", 
"Writes")
+
+            sortAggregatedData(aggrData, sortType.getOrElse("cn"), 
reversed).foreach(
+                ad => {
+                    // Add cache host as visor variable.
+                    registerCacheName(ad.cacheName)
+
+                    sumT += (
+                        mkCacheName(ad.cacheName),
+                        ad.nodes,
+                        (
+                            "min: " + ad.minimumSize,
+                            "avg: " + formatDouble(ad.averageSize),
+                            "max: " + ad.maximumSize
+                            ),
+                        (
+                            "min: " + ad.minimumHits,
+                            "avg: " + formatDouble(ad.averageHits),
+                            "max: " + ad.maximumHits
+                            ),
+                        (
+                            "min: " + ad.minimumMisses,
+                            "avg: " + formatDouble(ad.averageMisses),
+                            "max: " + ad.maximumMisses
+                            ),
+                        (
+                            "min: " + ad.minimumReads,
+                            "avg: " + formatDouble(ad.averageReads),
+                            "max: " + ad.maximumReads
+                            ),
+                        (
+                            "min: " + ad.minimumWrites,
+                            "avg: " + formatDouble(ad.averageWrites),
+                            "max: " + ad.maximumWrites
                             )
-                    }
-                )
+                        )
+                }
+            )
 
-                sumT.render()
+            sumT.render()
 
-                if (all) {
-                    val sorted = aggrData.sortWith((k1, k2) => {
-                        if (k1.cacheName == null)
-                            true
-                        else if (k2.cacheName == null)
-                            false
-                        else k1.cacheName.compareTo(k2.cacheName) < 0
-                    })
+            if (all) {
+                val sorted = aggrData.sortWith((k1, k2) => {
+                    if (k1.cacheName == null)
+                        true
+                    else if (k2.cacheName == null)
+                        false
+                    else k1.cacheName.compareTo(k2.cacheName) < 0
+                })
 
-                    val gCfg = node.map(config).collect {
-                        case cfg if cfg != null => cfg
-                    }
+                val gCfg = node.map(config).collect {
+                    case cfg if cfg != null => cfg
+                }
 
-                    sorted.foreach(ad => {
-                        val cacheNameVar = mkCacheName(ad.cacheName)
+                sorted.foreach(ad => {
+                    val cacheNameVar = mkCacheName(ad.cacheName)
 
-                        println("\nCache '" + cacheNameVar + "':")
+                    println("\nCache '" + cacheNameVar + "':")
 
-                        val m = ad.metrics()
+                    val m = ad.metrics()
 
-                        val csT = VisorTextTable()
+                    val csT = VisorTextTable()
 
-                        csT += ("Name(@)", cacheNameVar)
-                        csT += ("Nodes", m.size())
-                        csT += ("Size Min/Avg/Max", ad.minimumSize + " / " + 
formatDouble(ad.averageSize) + " / " + ad.maximumSize)
+                    csT += ("Name(@)", cacheNameVar)
+                    csT += ("Nodes", m.size())
+                    csT += ("Size Min/Avg/Max", ad.minimumSize + " / " + 
formatDouble(ad.averageSize) + " / " + ad.maximumSize)
 
-                        val ciT = VisorTextTable()
+                    val ciT = VisorTextTable()
 
-                        ciT #= ("Node ID8(@), IP", "CPUs", "Heap Used", "CPU 
Load", "Up Time", "Size", "Hi/Mi/Rd/Wr")
+                    ciT #= ("Node ID8(@), IP", "CPUs", "Heap Used", "CPU 
Load", "Up Time", "Size", "Hi/Mi/Rd/Wr")
 
-                        sortData(m.toMap, sortType.getOrElse("hi"), 
reversed).foreach { case (nid, cm) =>
-                            val nm = ignite.cluster.node(nid).metrics()
+                    sortData(m.toMap, sortType.getOrElse("hi"), 
reversed).foreach { case (nid, cm) =>
+                        val nm = ignite.cluster.node(nid).metrics()
 
-                            ciT += (
-                                nodeId8Addr(nid),
-                                nm.getTotalCpus,
-                                formatDouble(100d * nm.getHeapMemoryUsed / 
nm.getHeapMemoryMaximum) + " %",
+                        ciT += (
+                            nodeId8Addr(nid),
+                            nm.getTotalCpus,
+                            formatDouble(100d * nm.getHeapMemoryUsed / 
nm.getHeapMemoryMaximum) + " %",
 
-                                formatDouble(nm.getCurrentCpuLoad * 100d) + " 
%",
-                                X.timeSpan2HMSM(nm.getUpTime),
-                                cm.keySize(),
-                                (
-                                    "Hi: " + cm.hits(),
-                                    "Mi: " + cm.misses(),
-                                    "Rd: " + cm.reads(),
-                                    "Wr: " + cm.writes()
-                                )
+                            formatDouble(nm.getCurrentCpuLoad * 100d) + " %",
+                            X.timeSpan2HMSM(nm.getUpTime),
+                            cm.keySize(),
+                            (
+                                "Hi: " + cm.hits(),
+                                "Mi: " + cm.misses(),
+                                "Rd: " + cm.reads(),
+                                "Wr: " + cm.writes()
                             )
-                        }
+                        )
+                    }
 
-                        csT.render()
+                    csT.render()
 
-                        nl()
-                        println("Nodes for: " + cacheNameVar)
+                    nl()
+                    println("Nodes for: " + cacheNameVar)
 
-                        ciT.render()
+                    ciT.render()
 
-                        // Print footnote.
-                        println("'Hi' - Number of cache hits.")
-                        println("'Mi' - Number of cache misses.")
-                        println("'Rd' - number of cache reads.")
-                        println("'Wr' - Number of cache writes.")
+                    // Print footnote.
+                    println("'Hi' - Number of cache hits.")
+                    println("'Mi' - Number of cache misses.")
+                    println("'Rd' - number of cache reads.")
+                    println("'Wr' - Number of cache writes.")
 
-                        // Print metrics.
-                        nl()
-                        println("Aggregated queries metrics:")
-                        println("  Minimum execution time: " + 
X.timeSpan2HMSM(ad.minimumQueryTime()))
-                        println("  Maximum execution time: " + 
X.timeSpan2HMSM(ad.maximumQueryTime))
-                        println("  Average execution time: " + 
X.timeSpan2HMSM(ad.averageQueryTime.toLong))
-                        println("  Total number of executions: " + 
ad.execsQuery)
-                        println("  Total number of failures:   " + 
ad.failsQuery)
+                    // Print metrics.
+                    nl()
+                    println("Aggregated queries metrics:")
+                    println("  Minimum execution time: " + 
X.timeSpan2HMSM(ad.minimumQueryTime()))
+                    println("  Maximum execution time: " + 
X.timeSpan2HMSM(ad.maximumQueryTime))
+                    println("  Average execution time: " + 
X.timeSpan2HMSM(ad.averageQueryTime.toLong))
+                    println("  Total number of executions: " + ad.execsQuery)
+                    println("  Total number of failures:   " + ad.failsQuery)
 
-                        gCfg.foreach(_.caches().find(_.name() == 
ad.cacheName()).foreach(cfg => {
-                            nl()
+                    gCfg.foreach(_.caches().find(_.name() == 
ad.cacheName()).foreach(cfg => {
+                        nl()
 
-                            showCacheConfiguration("Cache configuration:", cfg)
-                        }))
-                    })
+                        showCacheConfiguration("Cache configuration:", cfg)
+                    }))
+                })
 
-                }
-                else
-                    println("\nUse \"-a\" flag to see detailed statistics.")
             }
+            else
+                println("\nUse \"-a\" flag to see detailed statistics.")
         }
     }
 
@@ -463,9 +480,12 @@ class VisorCacheCommand {
     /**
      * Get metrics data for all caches from all node or from specified node.
      *
+     * @param node Option of node for cache names extracting. All nodes if 
`None`.
+     * @param systemCaches Allow selection of system caches.
      * @return Caches metrics data.
      */
-    private def cacheData(node: Option[ClusterNode], name: Option[String]): 
List[VisorCacheAggregatedMetrics] = {
+    private def cacheData(node: Option[ClusterNode], name: Option[String], 
systemCaches: Boolean = false):
+        List[VisorCacheAggregatedMetrics] = {
         assert(node != null)
 
         try {
@@ -474,7 +494,7 @@ class VisorCacheCommand {
             val nids = prj.nodes().map(_.id())
 
             
ignite.compute(prj).execute(classOf[VisorCacheMetricsCollectorTask], 
toTaskArgument(nids,
-                new IgniteBiTuple(JavaBoolean.valueOf(name.isEmpty), 
name.orNull))).toList
+                new 
VisorCacheMetricsCollectorArg(JavaBoolean.valueOf(name.isEmpty), systemCaches, 
name.orNull))).toList
         }
         catch {
             case e: IgniteException => Nil
@@ -570,14 +590,16 @@ class VisorCacheCommand {
      * Asks user to select a cache from the list.
      *
      * @param title Title displayed before the list of caches.
+     * @param node Option of node for cache names extracting. All nodes if 
`None`.
+     * @param showSystem Allow selection of system caches.
      * @return `Option` for ID of selected cache.
      */
-    def askForCache(title: String, node: Option[ClusterNode]): Option[String] 
= {
+    def askForCache(title: String, node: Option[ClusterNode], showSystem: 
Boolean = false): Option[String] = {
         assert(title != null)
         assert(visor.visor.isConnected)
 
         // Get cache stats data from all nodes.
-        val aggrData = cacheData(node, None)
+        val aggrData = cacheData(node, None, showSystem)
 
         if (aggrData.isEmpty)
             scold("No caches found.").^^

Reply via email to