You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/04/25 11:17:27 UTC

[incubator-iotdb] branch mem_debug created (now f02fb1c)

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

jiangtian pushed a change to branch mem_debug
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at f02fb1c  add mem report thread

This branch includes the following new commits:

     new f02fb1c  add mem report thread

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 01/01: add mem report thread

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f02fb1c55fa613f1f9d1e16e214acb3828bfa5d8
Author: 江天 <jt...@163.com>
AuthorDate: Thu Apr 25 19:16:05 2019 +0800

    add mem report thread
---
 .../db/engine/memcontrol/BasicMemController.java   |  5 ++
 .../db/engine/memcontrol/MemReportThread.java      | 64 ++++++++++++++++++++++
 .../db/engine/memcontrol/RecordMemController.java  | 10 ++++
 3 files changed, 79 insertions(+)

diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/BasicMemController.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/BasicMemController.java
index e490044..73adffd 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/BasicMemController.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/BasicMemController.java
@@ -33,6 +33,7 @@ public abstract class BasicMemController implements IService {
   protected long dangerouseThreshold;
   protected MemMonitorThread monitorThread;
   protected MemStatisticThread memStatisticThread;
+  protected MemReportThread memReportThread;
   private IoTDBConfig config;
 
   BasicMemController(IoTDBConfig config) {
@@ -75,6 +76,10 @@ public abstract class BasicMemController implements IService {
         } else {
           logger.warn("Attempt to start MemController but it has already started");
         }
+        if (memReportThread == null) {
+          memReportThread = new MemReportThread();
+          memReportThread.start();
+        }
       }
       logger.info("MemController starts");
     } catch (Exception e) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/MemReportThread.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/MemReportThread.java
new file mode 100644
index 0000000..00e2842
--- /dev/null
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/MemReportThread.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.memcontrol;
+
+import java.util.ConcurrentModificationException;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.iotdb.db.utils.MemUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MemReportThread extends Thread {
+
+  private static Logger logger = LoggerFactory.getLogger(MemReportThread.class);
+  private static RecordMemController memController = RecordMemController.getInstance();
+
+  @Override
+  public void run() {
+    while (true) {
+      try {
+        Thread.sleep(5 * 60 * 1000);
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+        return;
+      }
+      report();
+    }
+  }
+
+  public static void report() {
+    Map<Object, AtomicLong> memMap = memController.getMemMap();
+    StringBuilder report = new StringBuilder();
+    boolean constructed = false;
+    while (!constructed) {
+      report = new StringBuilder();
+      constructed = true;
+      try {
+        StringBuilder finalReport = report;
+        memMap.forEach((key, value) -> finalReport.append(String.format("%s used %s%n", key.toString(),
+            MemUtils.bytesCntToStr(value.get()))));
+      } catch (ConcurrentModificationException e) {
+        constructed = false;
+      }
+    }
+    logger.info("Memory usages:\n{}", report);
+  }
+}
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/RecordMemController.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/RecordMemController.java
index 80a8014..5a361d5 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/RecordMemController.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/memcontrol/RecordMemController.java
@@ -146,6 +146,12 @@ public class RecordMemController extends BasicMemController {
     AtomicLong usage = memMap.get(user);
     if (usage == null) {
       LOGGER.error("Unregistered memory usage from {}", user);
+      try {
+        throw new Exception();
+      } catch (Exception e) {
+        LOGGER.error("Release stack trace ", e);
+      }
+      MemReportThread.report();
       return;
     }
     long usageLong = usage.get();
@@ -174,4 +180,8 @@ public class RecordMemController extends BasicMemController {
     private static final RecordMemController INSTANCE = new RecordMemController(
         IoTDBDescriptor.getInstance().getConfig());
   }
+
+  public Map<Object, AtomicLong> getMemMap() {
+    return memMap;
+  }
 }