You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2019/02/15 09:05:43 UTC

[ignite] branch master updated: IGNITE-11177: SQL: Fixed time overflow for IGNITE.NODE_METRICS view. This closes #6044.

This is an automated email from the ASF dual-hosted git repository.

vozerov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 26577ee  IGNITE-11177: SQL: Fixed time overflow for IGNITE.NODE_METRICS view. This closes #6044.
26577ee is described below

commit 26577eefc84dbb3a9f434fbc4143de24864a7956
Author: palmuhal <pa...@gmail.ru>
AuthorDate: Fri Feb 15 12:05:34 2019 +0300

    IGNITE-11177: SQL: Fixed time overflow for IGNITE.NODE_METRICS view. This closes #6044.
---
 .../h2/sys/view/SqlAbstractLocalSystemView.java    |  14 --
 .../h2/sys/view/SqlSystemViewNodeMetrics.java      |  44 ++---
 .../processors/query/SqlSystemViewsSelfTest.java   | 205 ++++++++++++++++++---
 3 files changed, 197 insertions(+), 66 deletions(-)

diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java
index cfc1ba9..1446f91 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java
@@ -28,7 +28,6 @@ import org.h2.util.DateTimeUtils;
 import org.h2.value.Value;
 import org.h2.value.ValueNull;
 import org.h2.value.ValueString;
-import org.h2.value.ValueTime;
 import org.h2.value.ValueTimestamp;
 import org.h2.value.ValueTimestampTimeZone;
 
@@ -144,19 +143,6 @@ public abstract class SqlAbstractLocalSystemView extends SqlAbstractSystemView {
     }
 
     /**
-     * Converts millis to ValueTime
-     *
-     * @param millis Millis.
-     */
-    protected static Value valueTimeFromMillis(long millis) {
-        if (millis == -1L || millis == Long.MAX_VALUE)
-            return ValueNull.INSTANCE;
-        else
-            // Note: ValueTime.fromMillis(long) method trying to convert time using timezone and return wrong result.
-            return ValueTime.fromNanos(millis * 1_000_000L);
-    }
-
-    /**
      * Converts millis to ValueTimestamp
      *
      * @param millis Millis.
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeMetrics.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeMetrics.java
index b67423f..6183907 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeMetrics.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeMetrics.java
@@ -57,18 +57,18 @@ public class SqlSystemViewNodeMetrics extends SqlAbstractLocalSystemView {
             newColumn("CUR_CANCELED_JOBS", Value.INT),
             newColumn("AVG_CANCELED_JOBS", Value.FLOAT),
             newColumn("TOTAL_CANCELED_JOBS", Value.INT),
-            newColumn("MAX_JOBS_WAIT_TIME", Value.TIME),
-            newColumn("CUR_JOBS_WAIT_TIME", Value.TIME),
-            newColumn("AVG_JOBS_WAIT_TIME", Value.TIME),
-            newColumn("MAX_JOBS_EXECUTE_TIME", Value.TIME),
-            newColumn("CUR_JOBS_EXECUTE_TIME", Value.TIME),
-            newColumn("AVG_JOBS_EXECUTE_TIME", Value.TIME),
-            newColumn("TOTAL_JOBS_EXECUTE_TIME", Value.TIME),
+            newColumn("MAX_JOBS_WAIT_TIME", Value.LONG),
+            newColumn("CUR_JOBS_WAIT_TIME", Value.LONG),
+            newColumn("AVG_JOBS_WAIT_TIME", Value.LONG),
+            newColumn("MAX_JOBS_EXECUTE_TIME", Value.LONG),
+            newColumn("CUR_JOBS_EXECUTE_TIME", Value.LONG),
+            newColumn("AVG_JOBS_EXECUTE_TIME", Value.LONG),
+            newColumn("TOTAL_JOBS_EXECUTE_TIME", Value.LONG),
             newColumn("TOTAL_EXECUTED_JOBS", Value.INT),
             newColumn("TOTAL_EXECUTED_TASKS", Value.INT),
-            newColumn("TOTAL_BUSY_TIME", Value.TIME),
-            newColumn("TOTAL_IDLE_TIME", Value.TIME),
-            newColumn("CUR_IDLE_TIME", Value.TIME),
+            newColumn("TOTAL_BUSY_TIME", Value.LONG),
+            newColumn("TOTAL_IDLE_TIME", Value.LONG),
+            newColumn("CUR_IDLE_TIME", Value.LONG),
             newColumn("BUSY_TIME_PERCENTAGE", Value.FLOAT),
             newColumn("IDLE_TIME_PERCENTAGE", Value.FLOAT),
             newColumn("TOTAL_CPU", Value.INT),
@@ -85,7 +85,7 @@ public class SqlSystemViewNodeMetrics extends SqlAbstractLocalSystemView {
             newColumn("NONHEAP_MEMORY_COMMITED", Value.LONG),
             newColumn("NONHEAP_MEMORY_MAX", Value.LONG),
             newColumn("NONHEAP_MEMORY_TOTAL", Value.LONG),
-            newColumn("UPTIME", Value.TIME),
+            newColumn("UPTIME", Value.LONG),
             newColumn("JVM_START_TIME", Value.TIMESTAMP),
             newColumn("NODE_START_TIME", Value.TIMESTAMP),
             newColumn("LAST_DATA_VERSION", Value.LONG),
@@ -150,18 +150,18 @@ public class SqlSystemViewNodeMetrics extends SqlAbstractLocalSystemView {
                         metrics.getCurrentCancelledJobs(),
                         metrics.getAverageCancelledJobs(),
                         metrics.getTotalCancelledJobs(),
-                        valueTimeFromMillis(metrics.getMaximumJobWaitTime()),
-                        valueTimeFromMillis(metrics.getCurrentJobWaitTime()),
-                        valueTimeFromMillis((long)metrics.getAverageJobWaitTime()),
-                        valueTimeFromMillis(metrics.getMaximumJobExecuteTime()),
-                        valueTimeFromMillis(metrics.getCurrentJobExecuteTime()),
-                        valueTimeFromMillis((long)metrics.getAverageJobExecuteTime()),
-                        valueTimeFromMillis(metrics.getTotalJobsExecutionTime()),
+                        metrics.getMaximumJobWaitTime(),
+                        metrics.getCurrentJobWaitTime(),
+                        (long)metrics.getAverageJobWaitTime(),
+                        metrics.getMaximumJobExecuteTime(),
+                        metrics.getCurrentJobExecuteTime(),
+                        (long)metrics.getAverageJobExecuteTime(),
+                        metrics.getTotalJobsExecutionTime(),
                         metrics.getTotalExecutedJobs(),
                         metrics.getTotalExecutedTasks(),
-                        valueTimeFromMillis(metrics.getTotalBusyTime()),
-                        valueTimeFromMillis(metrics.getTotalIdleTime()),
-                        valueTimeFromMillis(metrics.getCurrentIdleTime()),
+                        metrics.getTotalBusyTime(),
+                        metrics.getTotalIdleTime(),
+                        metrics.getCurrentIdleTime(),
                         metrics.getBusyTimePercentage(),
                         metrics.getIdleTimePercentage(),
                         metrics.getTotalCpus(),
@@ -178,7 +178,7 @@ public class SqlSystemViewNodeMetrics extends SqlAbstractLocalSystemView {
                         metrics.getNonHeapMemoryCommitted(),
                         metrics.getNonHeapMemoryMaximum(),
                         metrics.getNonHeapMemoryTotal(),
-                        valueTimeFromMillis(metrics.getUpTime()),
+                        metrics.getUpTime(),
                         valueTimestampFromMillis(metrics.getStartTime()),
                         valueTimestampFromMillis(metrics.getNodeStartTime()),
                         metrics.getLastDataVersion(),
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
index 3c384c0..6e990d5 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.processors.query;
 
-import java.sql.Time;
+import java.lang.reflect.Field;
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.util.Collection;
@@ -28,7 +28,9 @@ import java.util.Random;
 import java.util.TimeZone;
 import java.util.UUID;
 import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.LongStream;
 import javax.cache.Cache;
 import javax.cache.configuration.Factory;
 import org.apache.ignite.Ignite;
@@ -54,6 +56,7 @@ import org.apache.ignite.configuration.TopologyValidator;
 import org.apache.ignite.internal.ClusterMetricsSnapshot;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteNodeAttributes;
+import org.apache.ignite.internal.managers.discovery.ClusterMetricsImpl;
 import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
 import org.apache.ignite.internal.processors.cache.index.AbstractIndexingCommonTest;
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
@@ -64,6 +67,7 @@ import org.apache.ignite.internal.util.typedef.G;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.h2.api.TimestampWithTimeZone;
 import org.junit.Test;
@@ -447,14 +451,14 @@ public class SqlSystemViewsSelfTest extends AbstractIndexingCommonTest {
             Integer.class, Integer.class, Float.class, // Waiting jobs.
             Integer.class, Integer.class, Float.class, Integer.class, // Rejected jobs.
             Integer.class, Integer.class, Float.class, Integer.class, // Canceled jobs.
-            Time.class, Time.class, Time.class, // Jobs wait time.
-            Time.class, Time.class, Time.class, Time.class, // Jobs execute time.
+            Long.class, Long.class, Long.class, // Jobs wait time.
+            Long.class, Long.class, Long.class, Long.class, // Jobs execute time.
             Integer.class, Integer.class, // Executed jobs/task.
-            Time.class, Time.class, Time.class, Float.class, Float.class, // Busy/idle time.
+            Long.class, Long.class, Long.class, Float.class, Float.class, // Busy/idle time.
             Integer.class, Double.class, Double.class, Double.class, // CPU.
             Long.class, Long.class, Long.class, Long.class, Long.class, // Heap memory.
             Long.class, Long.class, Long.class, Long.class, Long.class, // Nonheap memory.
-            Time.class, Timestamp.class, Timestamp.class, Long.class, // Uptime.
+            Long.class, Timestamp.class, Timestamp.class, Long.class, // Uptime.
             Integer.class, Integer.class, Long.class, Integer.class, // Threads.
             Integer.class, Long.class, Integer.class, Long.class, // Sent/received messages.
             Integer.class); // Outbound message queue.
@@ -531,18 +535,18 @@ public class SqlSystemViewsSelfTest extends AbstractIndexingCommonTest {
                     assertEquals(metrics.getCurrentCancelledJobs(), resMetrics.get(0).get(13));
                     assertEquals(metrics.getAverageCancelledJobs(), resMetrics.get(0).get(14));
                     assertEquals(metrics.getTotalCancelledJobs(), resMetrics.get(0).get(15));
-                    assertEquals(metrics.getMaximumJobWaitTime(), convertToMilliseconds(resMetrics.get(0).get(16)));
-                    assertEquals(metrics.getCurrentJobWaitTime(), convertToMilliseconds(resMetrics.get(0).get(17)));
-                    assertEquals((long)metrics.getAverageJobWaitTime(), convertToMilliseconds(resMetrics.get(0).get(18)));
-                    assertEquals(metrics.getMaximumJobExecuteTime(), convertToMilliseconds(resMetrics.get(0).get(19)));
-                    assertEquals(metrics.getCurrentJobExecuteTime(), convertToMilliseconds(resMetrics.get(0).get(20)));
-                    assertEquals((long)metrics.getAverageJobExecuteTime(), convertToMilliseconds(resMetrics.get(0).get(21)));
-                    assertEquals(metrics.getTotalJobsExecutionTime(), convertToMilliseconds(resMetrics.get(0).get(22)));
+                    assertEquals(metrics.getMaximumJobWaitTime(), resMetrics.get(0).get(16));
+                    assertEquals(metrics.getCurrentJobWaitTime(), resMetrics.get(0).get(17));
+                    assertEquals((long)metrics.getAverageJobWaitTime(), resMetrics.get(0).get(18));
+                    assertEquals(metrics.getMaximumJobExecuteTime(), resMetrics.get(0).get(19));
+                    assertEquals(metrics.getCurrentJobExecuteTime(), resMetrics.get(0).get(20));
+                    assertEquals((long)metrics.getAverageJobExecuteTime(), resMetrics.get(0).get(21));
+                    assertEquals(metrics.getTotalJobsExecutionTime(), resMetrics.get(0).get(22));
                     assertEquals(metrics.getTotalExecutedJobs(), resMetrics.get(0).get(23));
                     assertEquals(metrics.getTotalExecutedTasks(), resMetrics.get(0).get(24));
-                    assertEquals(metrics.getTotalBusyTime(), convertToMilliseconds(resMetrics.get(0).get(25)));
-                    assertEquals(metrics.getTotalIdleTime(), convertToMilliseconds(resMetrics.get(0).get(26)));
-                    assertEquals(metrics.getCurrentIdleTime(), convertToMilliseconds(resMetrics.get(0).get(27)));
+                    assertEquals(metrics.getTotalBusyTime(), resMetrics.get(0).get(25));
+                    assertEquals(metrics.getTotalIdleTime(), resMetrics.get(0).get(26));
+                    assertEquals(metrics.getCurrentIdleTime(), resMetrics.get(0).get(27));
                     assertEquals(metrics.getBusyTimePercentage(), resMetrics.get(0).get(28));
                     assertEquals(metrics.getIdleTimePercentage(), resMetrics.get(0).get(29));
                     assertEquals(metrics.getTotalCpus(), resMetrics.get(0).get(30));
@@ -559,7 +563,7 @@ public class SqlSystemViewsSelfTest extends AbstractIndexingCommonTest {
                     assertEquals(metrics.getNonHeapMemoryCommitted(), resMetrics.get(0).get(41));
                     assertEquals(metrics.getNonHeapMemoryMaximum(), resMetrics.get(0).get(42));
                     assertEquals(metrics.getNonHeapMemoryTotal(), resMetrics.get(0).get(43));
-                    assertEquals(metrics.getUpTime(), convertToMilliseconds(resMetrics.get(0).get(44)));
+                    assertEquals(metrics.getUpTime(), resMetrics.get(0).get(44));
                     assertEquals(metrics.getStartTime(), ((Timestamp)resMetrics.get(0).get(45)).getTime());
                     assertEquals(metrics.getNodeStartTime(), ((Timestamp)resMetrics.get(0).get(46)).getTime());
                     assertEquals(metrics.getLastDataVersion(), resMetrics.get(0).get(47));
@@ -1120,6 +1124,161 @@ public class SqlSystemViewsSelfTest extends AbstractIndexingCommonTest {
     }
 
     /**
+     * Regression test. Verifies that duration metrics is able to be longer than 24 hours.
+     */
+    @Test
+    public void testDurationMetricsCanBeLonger24Hours() throws Exception {
+        Ignite ign = startGrid("MockedMetrics", getConfiguration().setMetricsUpdateFrequency(500));
+
+        ClusterNode node = ign.cluster().localNode();
+
+        assert node instanceof TcpDiscoveryNode : "Setup failed, test is incorrect.";
+
+        // Get rid of metrics provider: current logic ignores metrics field if provider != null.
+        setField(node, "metricsProvider", null);
+
+        ClusterMetricsImpl original = getField(node, "metrics");
+        
+        setField(node, "metrics", new MockedClusterMetrics(original));;
+
+        List<?> durationMetrics = execSql(ign,
+            "SELECT " +
+                "MAX_JOBS_WAIT_TIME, " +
+                "CUR_JOBS_WAIT_TIME, " +
+                "AVG_JOBS_WAIT_TIME, " +
+
+                "MAX_JOBS_EXECUTE_TIME, " +
+                "CUR_JOBS_EXECUTE_TIME, " +
+                "AVG_JOBS_EXECUTE_TIME, " +
+                "TOTAL_JOBS_EXECUTE_TIME, " +
+
+                "TOTAL_BUSY_TIME, " +
+
+                "TOTAL_IDLE_TIME, " +
+                "CUR_IDLE_TIME, " +
+                "UPTIME " +
+
+                "FROM IGNITE.NODE_METRICS").get(0);
+
+        List<Long> elevenExpVals = LongStream
+            .generate(() -> MockedClusterMetrics.LONG_DURATION_MS)
+            .limit(11)
+            .boxed()
+            .collect(Collectors.toList());
+
+        assertEqualsCollections(elevenExpVals, durationMetrics);
+    }
+
+    /**
+     * Mock for {@link ClusterMetricsImpl} that always returns big (more than 24h) duration for all duration metrics.
+     */
+    public static class MockedClusterMetrics extends ClusterMetricsImpl {
+        /** Some long (> 24h) duration. */
+        public static final long LONG_DURATION_MS = TimeUnit.DAYS.toMillis(365);
+
+        /**
+         * Constructor.
+         *
+         * @param original - original cluster metrics object. Required to leave the original behaviour for not overriden
+         * methods.
+         */
+        public MockedClusterMetrics(ClusterMetricsImpl original) throws Exception {
+            super(
+                getField(original, "ctx"),
+                getField(original, "vmMetrics"),
+                getField(original, "nodeStartTime"));
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getMaximumJobWaitTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getCurrentJobWaitTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public double getAverageJobWaitTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getMaximumJobExecuteTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getCurrentJobExecuteTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public double getAverageJobExecuteTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getTotalJobsExecutionTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getTotalBusyTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getTotalIdleTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getCurrentIdleTime() {
+            return LONG_DURATION_MS;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getUpTime() {
+            return LONG_DURATION_MS;
+        }
+    }
+
+    /**
+     * Get field value using reflection.
+     * 
+     * @param target object containing the field. 
+     * @param fieldName name of the field.
+     */
+    private static <T> T getField(Object target, String fieldName) throws Exception {
+        Class clazz = target.getClass();
+
+        Field fld = clazz.getDeclaredField(fieldName);
+
+        fld.setAccessible(true);
+
+        return (T) fld.get(target);
+    }
+
+    /**
+     * Set field using reflection.
+     * 
+     * @param target object containing the field.
+     * @param fieldName name of the field.
+     * @param val new field value.
+     */
+    private static void setField(Object target, String fieldName, Object val) throws Exception {
+        Class clazz = target.getClass();
+
+        Field fld = clazz.getDeclaredField(fieldName);
+
+        fld.setAccessible(true);
+
+        fld.set(target, val);
+    }
+
+    /**
      * Gets ignite configuration with persistence enabled.
      */
     private IgniteConfiguration getPdsConfiguration(String consistentId) throws Exception {
@@ -1136,20 +1295,6 @@ public class SqlSystemViewsSelfTest extends AbstractIndexingCommonTest {
     }
 
     /**
-     * Convert Time to milliseconds.
-     *
-     * Note: Returned Time values from SQL it's milliseconds since January 1, 1970, 00:00:00 GMT. To get right interval
-     * in milliseconds this value must be adjusted to current time zone.
-     *
-     * @param sqlTime Time value returned from SQL.
-     */
-    private long convertToMilliseconds(Object sqlTime) {
-        Time time0 = (Time)sqlTime;
-
-        return time0.getTime() + TimeZone.getDefault().getOffset(time0.getTime());
-    }
-
-    /**
      *
      */
     private static class TestNodeFilter extends GridNodePredicate {