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; + } }
