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: 江天 <[email protected]>
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;
+  }
 }

Reply via email to