[강운덕] [LUCYSUS-1744] 비동기 메시지일때도 event를 모아서 io에 flush하도록 수정.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@1053 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Woonduk Kang
2012-12-21 03:02:50 +00:00
parent 6b34149999
commit 895aec01ef
10 changed files with 86 additions and 75 deletions
@@ -10,13 +10,16 @@ import java.util.logging.Logger;
*
*/
public class TimeBaseStorage implements Storage {
private static final int RESERVE_BUFFER_SIZE = 2;
private boolean discard = true;
private boolean limit;
private long limitTime = 1000;
private int bufferSize = 20;
private List<SubSpan> storage = new ArrayList<SubSpan>(bufferSize);
private List<SubSpan> storage = new ArrayList<SubSpan>(bufferSize + RESERVE_BUFFER_SIZE);
private DataSender dataSender;
public TimeBaseStorage() {
@@ -46,29 +49,42 @@ public class TimeBaseStorage implements Storage {
@Override
public void store(SubSpan subSpan) {
addSubSpan(subSpan);
// flush유무 확인
if (!limit) {
// 절대 시간만 체크한다. 1초 이내 라서 절대 데이터를 flush하지 않는다.
synchronized (this) {
addSubSpan(subSpan);
}
limit = checkLimit(subSpan);
} else {
// 1초가 지났다면.
// 데이터가 flushCount이상일 경우 먼저 flush한다.
if (storage.size() >= bufferSize) {
SubSpanList subSpanList = new SubSpanList(storage);
storage = new ArrayList<SubSpan>(bufferSize);
dataSender.send(subSpanList);
List<SubSpan> flushData = null;
synchronized (this) {
if (!addSubSpan(subSpan)) {
dataSender.send(subSpan);
return;
}
if (storage.size() >= bufferSize) {
flushData = storage;
storage = new ArrayList<SubSpan>(bufferSize + RESERVE_BUFFER_SIZE);
}
}
if (flushData != null) {
dataSender.send(new SubSpanList(flushData));
}
}
}
private void addSubSpan(SubSpan subSpan) {
private boolean addSubSpan(SubSpan subSpan) {
if (storage == null) {
Logger logger = Logger.getLogger(this.getClass().getName());
logger.warning("storage is null.");
return;
logger.fine("storage is null. direct send");
// 이미 span이 와서 flush된 상황임.
return false;
}
storage.add(subSpan);
return true;
}
private boolean checkLimit(SubSpan subSpan) {
@@ -89,7 +105,9 @@ public class TimeBaseStorage implements Storage {
limit = checkLimit(span);
if (!limit) {
// 제한시간내 빨리 끝난 경우는 subspan을 버린다.
this.storage = null;
synchronized (this) {
this.storage = null;
}
dataSender.send(span);
} else {
@@ -102,11 +120,14 @@ public class TimeBaseStorage implements Storage {
}
private void flushAll(Span span) {
List<SubSpan> subSpanList = storage;
List<SubSpan> subSpanList;
synchronized (this) {
subSpanList = storage;
this.storage = null;
}
if (subSpanList != null && subSpanList.size() != 0) {
span.setSubSpanList(subSpanList);
}
this.storage = null;
dataSender.send(span);
}