You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/06/18 07:21:33 UTC
[incubator-iotdb] 01/03: modify mem table pool
This is an automated email from the ASF dual-hosted git repository.
lta pushed a commit to branch feature_async_close_tsfile
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit b0db03a0616d0c3d27d718bd221b4450e574410e
Author: lta <li...@163.com>
AuthorDate: Mon Jun 17 21:42:09 2019 +0800
modify mem table pool
---
.../iotdb/db/engine/memtable/MemTablePool.java | 58 ++++++++++------------
1 file changed, 26 insertions(+), 32 deletions(-)
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/memtable/MemTablePool.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/memtable/MemTablePool.java
index a1b8e7c..e50be7f 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/memtable/MemTablePool.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/memtable/MemTablePool.java
@@ -1,22 +1,23 @@
package org.apache.iotdb.db.engine.memtable;
-import java.util.Stack;
-import org.apache.iotdb.tsfile.common.constant.SystemConstant;
+import java.util.ArrayDeque;
+import java.util.Deque;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MemTablePool {
private static final Logger LOGGER = LoggerFactory.getLogger(MemTablePool.class);
- private Stack<IMemTable> emptyMemTables;
+ private Deque<IMemTable> emptyMemTables;
// >= number of storage group * 2
private int capacity = 20;
private int size = 0;
+ private static final int WAIT_TIME = 2000;
private static final MemTablePool INSTANCE = new MemTablePool();
- public MemTablePool() {
- emptyMemTables = new Stack<>();
+ private MemTablePool() {
+ emptyMemTables = new ArrayDeque<>();
}
public IMemTable getEmptyMemTable(Object applier) {
@@ -26,44 +27,37 @@ public class MemTablePool {
LOGGER.info("generated a new memtable for {}, system memtable size: {}, stack size: {}",
applier, size, emptyMemTables.size());
return new PrimitiveMemTable();
- } else if (!emptyMemTables.isEmpty()){
- LOGGER.info("system memtable size: {}, stack size: {}, then get a memtable from stack for {}",
- size, emptyMemTables.size(), applier);
+ } else if (!emptyMemTables.isEmpty()) {
+ LOGGER
+ .info("system memtable size: {}, stack size: {}, then get a memtable from stack for {}",
+ size, emptyMemTables.size(), applier);
return emptyMemTables.pop();
}
- }
- // wait until some one has released a memtable
- long waitStartTime = System.currentTimeMillis();
- long lastPrintIdx = 0;
- while (true) {
- if(!emptyMemTables.isEmpty()) {
- synchronized (emptyMemTables) {
- if (!emptyMemTables.isEmpty()){
- LOGGER.info("system memtable size: {}, stack size: {}, then get a memtable from stack for {}",
- size, emptyMemTables.size(), applier);
- return emptyMemTables.pop();
- }
+
+ // wait until some one has released a memtable
+ int waitCount = 1;
+ while (true) {
+ if (!emptyMemTables.isEmpty()) {
+ LOGGER.info(
+ "system memtable size: {}, stack size: {}, then get a memtable from stack for {}",
+ size, emptyMemTables.size(), applier);
+ return emptyMemTables.pop();
}
- }
- try {
- Thread.sleep(20);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- LOGGER.error("Unexpected interruption", e);
- }
- long waitedTime = System.currentTimeMillis() - waitStartTime;
- if (waitedTime / 2000 > lastPrintIdx) {
- lastPrintIdx = waitedTime / 2000;
- LOGGER.info("{} has waited for a memtable for {}ms", applier, waitedTime);
+ try {
+ emptyMemTables.wait(WAIT_TIME);
+ } catch (InterruptedException e) {
+ LOGGER.error("{} fails to wait fot memtables {}, continue to wait", applier, e);
+ }
+ LOGGER.info("{} has waited for a memtable for {}ms", applier, waitCount * WAIT_TIME);
}
}
}
-
public void release(IMemTable memTable) {
synchronized (emptyMemTables) {
memTable.clear();
emptyMemTables.push(memTable);
+ emptyMemTables.notify();
LOGGER.info("a memtable returned, stack size {}", emptyMemTables.size());
}
}