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 {