Repository: incubator-ignite Updated Branches: refs/heads/ignite-30 cb21533eb -> c31dbd2a2
Merge branches 'ignite-639' and 'ignite-sprint-3' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-639 Conflicts: modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/f600e7e8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/f600e7e8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/f600e7e8 Branch: refs/heads/ignite-30 Commit: f600e7e833055e9965209dcd8cdfc933b9cfe01a Parents: f1eaf29 e144a68 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Tue Apr 7 11:29:54 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Tue Apr 7 11:29:54 2015 +0700 ---------------------------------------------------------------------- .../ignite/internal/visor/cache/VisorCache.java | 17 ++++- .../VisorCacheConfigurationCollectorJob.java | 76 ++++++++++++++++++++ .../VisorCacheConfigurationCollectorTask.java | 39 ++++++++++ .../VisorIgfsProfilerUniformityCounters.java | 6 +- .../visor/node/VisorGridConfiguration.java | 38 ---------- .../visor/node/VisorIgfsConfiguration.java | 2 +- .../visor/node/VisorRestConfiguration.java | 1 + .../internal/visor/util/VisorTaskUtils.java | 3 +- .../h2/twostep/GridReduceQueryExecutor.java | 2 +- .../commands/cache/VisorCacheCommand.scala | 20 +++--- .../config/VisorConfigurationCommand.scala | 15 ++-- .../visor/commands/gc/VisorGcCommand.scala | 15 ++-- .../scala/org/apache/ignite/visor/visor.scala | 34 +++++++-- 13 files changed, 191 insertions(+), 77 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f600e7e8/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f600e7e8/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala ---------------------------------------------------------------------- diff --cc modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala index 4d35b35,91317c9..055931b --- 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 @@@ -214,229 -200,202 +214,229 @@@ 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() + case None => return } - val node = parseNode(argLst) match { - case Left(msg) => - scold(msg) - - break() - - case Right(n) => n - } + return + } - val 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 node = parseNode(argLst) match { + case Left(msg) => + scold(msg) - Some(null) + return - case cn => cn - } + case Right(n) => n + } - if (Seq("clear", "swap", "scan").exists(hasArgFlag(_, argLst))) { - if (cacheName.isEmpty) - askForCache("Select cache from:", node) match { - case Some(name) => argLst = argLst ++ Seq("c" -> name) - case None => break() - } + val showSystem = hasArgFlag("system", argLst) - 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) + 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) - break() - } + Some(null) - val all = hasArgFlag("a", argLst) - - val sortType = argValue("s", argLst) - val reversed = hasArgName("r", argLst) + case cn => cn + } - if (sortType.isDefined && !isValidSortType(sortType.get)) - scold("Invalid '-s' argument in: " + args).^^ + /** Check that argument list has flag from list. */ + def hasArgFlagIn(flags: String *) = { + flags.exists(hasArgFlag(_, argLst)) + } - // Get cache stats data from all nodes. - val aggrData = cacheData(node, cacheName) + // Get cache stats data from all nodes. + val aggrData = cacheData(node, cacheName, showSystem) - 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"), + aggrData) 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 (!aggrData.exists(cache => safeEquals(cache.name(), name) && cache.system())) { + 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).^^ + + if (aggrData.isEmpty) + scold("No caches found.").^^ + + println("Time of the snapshot: " + formatDateTime(System.currentTimeMillis)) + + val sumT = VisorTextTable() + + sumT #= ("Name(@)", "Mode", "Nodes", "Entries", "Hits", "Misses", "Reads", "Writes") + + sortAggregatedData(aggrData, sortType.getOrElse("cn"), reversed).foreach( + ad => { + // Add cache host as visor variable. + registerCacheName(ad.name()) + + sumT += ( + mkCacheName(ad.name()), + ad.mode(), + 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.name() == null) + true + else if (k2.name() == null) + false + else k1.name().compareTo(k2.name()) < 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.name()) - 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.name()).foreach(cfg => { - nl() - gCfg.foreach(ccfgs => ccfgs.find(ccfg => safeEquals(ccfg.name(), ad.cacheName())) - .foreach(ccfg => { - nl() ++ gCfg.foreach(ccfgs => ccfgs.find(ccfg => safeEquals(ccfg.name(), ad.name())) ++ .foreach(ccfg => { ++ nl() - showCacheConfiguration("Cache configuration:", cfg) - showCacheConfiguration("Cache configuration:", ccfg) - })) - }) - } - else - println("\nUse \"-a\" flag to see detailed statistics.") ++ showCacheConfiguration("Cache configuration:", ccfg) + })) + }) - } + else + println("\nUse \"-a\" flag to see detailed statistics.") } } @@@ -506,15 -459,15 +506,15 @@@ } /** - * Gets configuration of grid from specified node for callecting of node cache's configuration. + * Gets configuration of grid from specified node for collecting of node cache's configuration. * * @param node Specified node. - * @return Grid configuration for specified node. + * @return Cache configurations for specified node. */ - private def config(node: ClusterNode): VisorGridConfiguration = { - try - ignite.compute(ignite.cluster.forNode(node)).withNoFailover() - .execute(classOf[VisorNodeConfigurationCollectorTask], emptyTaskArgument(node.id())) + private def config(node: ClusterNode): JavaCollection[VisorCacheConfiguration] = { + try { + cacheConfigurations(node.id()) + } catch { case e: IgniteException => scold(e.getMessage)