Skip to content

Commit 7e0651f

Browse files
author
robbins
committed
Limit bucket size by spilling
1 parent 715bab1 commit 7e0651f

File tree

6 files changed

+58
-27
lines changed

6 files changed

+58
-27
lines changed

java/src/com/ibm/javametrics/agent/JsonDataBucket.java renamed to java/src/com/ibm/javametrics/agent/ArrayDataBucket.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717

1818
import java.util.ArrayList;
1919

20-
public class JsonDataBucket implements Bucket {
20+
public class ArrayDataBucket implements Bucket {
2121

22-
private static final int MAX_SIZE = 4 * 1024;
23-
private ArrayList<String> bucket = new ArrayList<String>(100);
22+
private ArrayList<String> bucket;
2423
int size = 0;
2524
int cursor = 0;
25+
private int maxBucketSize;
26+
27+
public ArrayDataBucket(int maxBucketSize) {
28+
this.maxBucketSize = maxBucketSize;
29+
bucket = new ArrayList<>(100);
30+
}
2631

2732
@Override
2833
public int getSize() {
@@ -39,18 +44,26 @@ public void empty() {
3944
}
4045

4146
@Override
42-
public void pushData(String data) {
47+
public boolean addData(String data) {
4348
synchronized (bucket) {
44-
bucket.add(data);
45-
size += data.length();
4649

47-
System.err.println("pushed " + cursor + " " + bucket.size() + " " + size);
48-
while (size > MAX_SIZE && cursor > 0) {
50+
int newSize = size + data.length();
51+
/*
52+
* Spill data if necessary
53+
*/
54+
while (newSize > maxBucketSize && cursor > 0) {
4955
String removed = bucket.remove(0);
5056
cursor--;
51-
size -= removed.length();
52-
System.err.println("trimmed " + cursor + " " + bucket.size() + " " + size);
57+
newSize -= removed.length();
5358
}
59+
60+
if (newSize > maxBucketSize) {
61+
return false;
62+
}
63+
64+
bucket.add(data);
65+
size = newSize;
66+
return true;
5467
}
5568
}
5669

@@ -61,7 +74,6 @@ public String getNext() {
6174
if (cursor < bucket.size()) {
6275
data = bucket.get(cursor);
6376
cursor++;
64-
System.err.println("returned " + cursor + " " + bucket.size() + " " + size);
6577
}
6678
}
6779
return data;

java/src/com/ibm/javametrics/agent/Bucket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package com.ibm.javametrics.agent;
1717

1818
public interface Bucket {
19-
public void pushData(String data);
19+
public boolean addData(String data);
2020

2121
public String getNext();
2222

java/src/com/ibm/javametrics/agent/JavaAgent.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
public class JavaAgent implements Agent {
2929

30-
private static final int MAX_BUCKET_SIZE = 1024 * 1024;
30+
private static final int MAX_BUCKET_SIZE = 2 * 1024 * 1024;
3131
private Map<String, Bucket> buckets = new HashMap<String, Bucket>();
3232
private Set<Receiver> receivers = new HashSet<Receiver>();
3333
private int collectionInterval = 2;
@@ -51,34 +51,42 @@ public void pushData(String type, String data) {
5151
synchronized (buckets) {
5252
Bucket bucket = buckets.get(type);
5353
if (bucket == null) {
54-
bucket = new JsonDataBucket();
54+
bucket = new ArrayDataBucket(MAX_BUCKET_SIZE);
5555
buckets.put(type, bucket);
5656
}
57-
58-
if ((bucket.getSize() + data.length()) > MAX_BUCKET_SIZE) {
59-
drain(type, bucket);
60-
}
61-
62-
bucket.pushData(data);
57+
bucket.addData(data);
6358
}
6459
}
6560

6661
private void drain() {
6762
synchronized (buckets) {
6863
buckets.forEach((name, bucket) -> {
69-
drain(name, bucket);
64+
drainBatched(name, bucket);
7065
});
7166
}
7267
}
7368

69+
@SuppressWarnings("unused")
7470
private void drain(String type, Bucket bucket) {
7571
String data = bucket.getNext();
7672
while (data != null) {
7773
emit(type, data);
7874
data = bucket.getNext();
7975
}
8076
}
81-
77+
78+
private void drainBatched(String type, Bucket bucket) {
79+
StringBuffer sb = new StringBuffer();
80+
String data = bucket.getNext();
81+
while (data != null) {
82+
sb.append(data);
83+
data = bucket.getNext();
84+
}
85+
if (sb.length() > 0) {
86+
emit(type, sb.toString());
87+
}
88+
}
89+
8290
private void emit(String type, String data) {
8391
if (data != null) {
8492
receivers.forEach((receiver) -> {

java/src/com/ibm/javametrics/agent/StringDataBucket.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ public class StringDataBucket implements Bucket {
2020
private static final int INITIAL_BUCKET_SIZE = 4 * 1024;
2121
private StringBuffer bucket = new StringBuffer(INITIAL_BUCKET_SIZE);
2222

23+
private int maxBucketSize;
24+
25+
public StringDataBucket(int maxBucketSize) {
26+
this.maxBucketSize = maxBucketSize;
27+
}
28+
2329
@Override
2430
public int getSize() {
2531
return bucket.length();
@@ -31,14 +37,21 @@ public void empty() {
3137
}
3238

3339
@Override
34-
public void pushData(String data) {
40+
public boolean addData(String data) {
41+
if ((getSize() + data.length()) > maxBucketSize) {
42+
return false;
43+
}
3544
bucket.append(data);
45+
return true;
3646
}
3747

3848
@Override
3949
public String getNext() {
40-
String data = bucket.toString();
41-
bucket = new StringBuffer(INITIAL_BUCKET_SIZE);
50+
String data = null;
51+
if (bucket.length() > 0) {
52+
data = bucket.toString();
53+
bucket = new StringBuffer(INITIAL_BUCKET_SIZE);
54+
}
4255
return data;
4356
}
4457
}

java/src/com/ibm/javametrics/impl/JavametricsImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ private void initializeProviders() {
6363
* java.lang.String)
6464
*/
6565
public void receiveData(String type, String data) {
66-
System.err.println("received: " + type + " " + data);
6766
for (Iterator<JavametricsListener> iterator = javametricsListeners.iterator(); iterator.hasNext();) {
6867
JavametricsListener javametricsListener = iterator.next();
6968
javametricsListener.receive(type, data);

web/src/com/ibm/javametrics/web/DataHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.io.StringReader;
1919
import java.util.ArrayList;
20-
import java.util.HashMap;
2120
import java.util.HashSet;
2221
import java.util.Iterator;
2322
import java.util.List;

0 commit comments

Comments
 (0)