You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2020/02/18 05:57:31 UTC

[incubator-iotdb] 01/02: fix activeTimeseries null pointer

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

hxd pushed a commit to branch ut_close_socket
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 4c81b0c930cedbdd8b11730b245983072fb62ba2
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Feb 18 13:56:52 2020 +0800

    fix activeTimeseries null pointer
---
 .../db/conf/adapter/ActiveTimeSeriesCounter.java      | 19 ++++++++++++++++---
 .../db/writelog/recover/SeqTsFileRecoverTest.java     |  5 +++--
 .../java/org/apache/iotdb/session/IoTDBSessionIT.java | 12 +++++++-----
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/adapter/ActiveTimeSeriesCounter.java b/server/src/main/java/org/apache/iotdb/db/conf/adapter/ActiveTimeSeriesCounter.java
index 9ed72ce..7251924 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/adapter/ActiveTimeSeriesCounter.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/adapter/ActiveTimeSeriesCounter.java
@@ -62,10 +62,16 @@ public class ActiveTimeSeriesCounter implements IActiveTimeSeriesCounter {
   public void offer(String storageGroup, String device, String measurement) {
     String path = device + IoTDBConstant.PATH_SEPARATOR + measurement;
     try {
-      storageGroupHllMap.get(storageGroup).offer(path);
+      HyperLogLog log = storageGroupHllMap.get(storageGroup);
+      if (log != null) {
+        log.offer(path);
+      } else {
+        LOGGER.warn(
+            "Unknown SG {} is calling HyperLogLog.offer(). It can be ignored the sg is deleted recently",
+            storageGroup);
+      }
     } catch (Exception e) {
-      storageGroupHllMap.putIfAbsent(storageGroup, new HyperLogLog(LOG2M));
-      storageGroupHllMap.get(storageGroup).offer(path);
+      //we do not register it if there is no the storage group.
       LOGGER.error("Storage group {} registers active time series {} failed", storageGroup, path,
           e);
     }
@@ -75,6 +81,13 @@ public class ActiveTimeSeriesCounter implements IActiveTimeSeriesCounter {
   public void updateActiveRatio(String storageGroup) {
     lock.writeLock().lock();
     try {
+      HyperLogLog log = storageGroupHllMap.get(storageGroup);
+      if (log == null) {
+        LOGGER.warn(
+            "Unknown SG {} is calling updateActiveRatio. It can be ignored the sg is deleted recently",
+            storageGroup);
+        return;
+      }
       long activeTimeSeriesNum = storageGroupHllMap.get(storageGroup).cardinality();
       if (activeTimeSeriesNum != activeTimeSeriesNumMap.get(storageGroup)) {
         // update the active time series number in the newest memtable to be flushed
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index eb6906c..95413d4 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -64,6 +64,7 @@ public class SeqTsFileRecoverTest {
   private TsFileWriter writer;
   private WriteLogNode node;
   private String logNodePrefix = "testNode/0";
+  private String storageGroup = "testNode";
   private Schema schema;
   private TsFileResource resource;
   private VersionController versionController = new VersionController() {
@@ -142,7 +143,7 @@ public class SeqTsFileRecoverTest {
   public void testNonLastRecovery() throws StorageGroupProcessorException, IOException {
     TsFileRecoverPerformer performer = new TsFileRecoverPerformer(logNodePrefix, schema,
         versionController, resource, true, false);
-    ActiveTimeSeriesCounter.getInstance().init(logNodePrefix);
+    ActiveTimeSeriesCounter.getInstance().init(storageGroup);
     RestorableTsFileIOWriter writer = performer.recover();
     assertFalse(writer.canWrite());
 
@@ -191,7 +192,7 @@ public class SeqTsFileRecoverTest {
   public void testLastRecovery() throws StorageGroupProcessorException, IOException {
     TsFileRecoverPerformer performer = new TsFileRecoverPerformer(logNodePrefix, schema,
         versionController, resource, true, true);
-    ActiveTimeSeriesCounter.getInstance().init(logNodePrefix);
+    ActiveTimeSeriesCounter.getInstance().init(storageGroup);
     RestorableTsFileIOWriter writer = performer.recover();
     assertTrue(writer.canWrite());
     writer.endFile(schema);
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
index acc936b..b1aef0d 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
@@ -43,6 +43,8 @@ import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class IoTDBSessionIT {
 
@@ -203,10 +205,12 @@ public class IoTDBSessionIT {
     session.setStorageGroup("root.sg1");
 
     createTimeseries();
+
     insert();
 
     // sql test
     insert_via_sql();
+
     query3();
 
 //    insertRowBatchTest1();
@@ -221,7 +225,6 @@ public class IoTDBSessionIT {
     insertInBatch();
 
     query4();
-
     // Add another storage group to test the deletion of storage group
     session.setStorageGroup("root.sg2");
     session.createTimeseries("root.sg2.d1.s1", TSDataType.INT64, TSEncoding.RLE,
@@ -764,7 +767,6 @@ public class IoTDBSessionIT {
       int errorCount = 0;
       while (resultSet.next()) {
         long curTime = resultSet.getLong(1);
-        System.out.println(curTime);
         if (beforeTime < curTime) {
           beforeTime = curTime;
         } else {
@@ -804,9 +806,9 @@ public class IoTDBSessionIT {
       int count = 0;
       while (resultSet.next()) {
         for (int i = 1; i <= colCount; i++) {
-          if (i == 1) {
-            System.out.println(resultSet.getString("Time"));
-          }
+//          if (i == 1) {
+//            System.out.println(resultSet.getString("Time"));
+//          }
           count++;
         }
       }