[TESTS] There might be several live `BigArrays` instances at the same time.

This commit is contained in:
Adrien Grand 2014-05-28 16:17:26 +02:00
parent cc9a7bd454
commit 4ff511000e
1 changed files with 7 additions and 8 deletions

View File

@ -31,8 +31,7 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.*;
import org.elasticsearch.test.ElasticsearchTestCase;
import java.util.Map;
import java.util.Random;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
@ -45,8 +44,8 @@ public class MockBigArrays extends BigArrays {
*/
private static final boolean TRACK_ALLOCATIONS = false;
private static volatile BigArrays INSTANCE = null;
private static ConcurrentMap<Object, Object> ACQUIRED_ARRAYS = new ConcurrentHashMap<>();
private static final Set<BigArrays> INSTANCES = Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<BigArrays, Boolean>()));
private static final ConcurrentMap<Object, Object> ACQUIRED_ARRAYS = new ConcurrentHashMap<>();
public static void ensureAllArraysAreReleased() throws Exception {
final Map<Object, Object> masterCopy = Maps.newHashMap(ACQUIRED_ARRAYS);
@ -69,17 +68,17 @@ public class MockBigArrays extends BigArrays {
}
}
}
if (INSTANCE != null) {
for (final BigArrays bigArrays : INSTANCES) {
// BigArrays are used on the network layer and the cluster is shared across tests so nodes might still be talking to
// each other a bit after the test finished, wait a bit for things to stabilize if so
final boolean sizeIsZero = ElasticsearchTestCase.awaitBusy(new Predicate<Object>() {
@Override
public boolean apply(Object input) {
return INSTANCE.sizeInBytes() == 0;
return bigArrays.sizeInBytes() == 0;
}
});
if (!sizeIsZero) {
final long sizeInBytes = INSTANCE.sizeInBytes();
final long sizeInBytes = bigArrays.sizeInBytes();
if (sizeInBytes != 0) {
throw new AssertionError("Expected 0 bytes, got " + sizeInBytes);
}
@ -99,7 +98,7 @@ public class MockBigArrays extends BigArrays {
seed = 0;
}
random = new Random(seed);
INSTANCE = this;
INSTANCES.add(this);
}
@Override