diff --git a/src/main/java/org/elasticsearch/cache/recycler/CacheRecycler.java b/src/main/java/org/elasticsearch/cache/recycler/CacheRecycler.java index 4eb12a8dba8..aebfb3f1c78 100644 --- a/src/main/java/org/elasticsearch/cache/recycler/CacheRecycler.java +++ b/src/main/java/org/elasticsearch/cache/recycler/CacheRecycler.java @@ -24,6 +24,7 @@ import com.google.common.base.Strings; import org.elasticsearch.ElasticsearchIllegalArgumentException; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.recycler.AbstractRecyclerC; import org.elasticsearch.common.recycler.Recycler; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.EsExecutors; @@ -71,135 +72,140 @@ public class CacheRecycler extends AbstractComponent { int smartSize = settings.getAsInt("smart_size", 1024); final int availableProcessors = EsExecutors.boundedNumberOfProcessors(settings); - hashMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + hashMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public ObjectObjectOpenHashMap newInstance(int sizing) { return new ObjectObjectOpenHashMap(size(sizing)); } @Override - public void clear(ObjectObjectOpenHashMap value) { + public void recycle(ObjectObjectOpenHashMap value) { value.clear(); } }); - hashSet = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + hashSet = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public ObjectOpenHashSet newInstance(int sizing) { return new ObjectOpenHashSet(size(sizing), 0.5f); } @Override - public void clear(ObjectOpenHashSet value) { + public void recycle(ObjectOpenHashSet value) { value.clear(); } }); - doubleObjectMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + doubleObjectMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public DoubleObjectOpenHashMap newInstance(int sizing) { return new DoubleObjectOpenHashMap(size(sizing)); } @Override - public void clear(DoubleObjectOpenHashMap value) { + public void recycle(DoubleObjectOpenHashMap value) { value.clear(); } }); - longObjectMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + longObjectMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public LongObjectOpenHashMap newInstance(int sizing) { return new LongObjectOpenHashMap(size(sizing)); } @Override - public void clear(LongObjectOpenHashMap value) { + public void recycle(LongObjectOpenHashMap value) { value.clear(); } }); - longLongMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + longLongMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public LongLongOpenHashMap newInstance(int sizing) { return new LongLongOpenHashMap(size(sizing)); } @Override - public void clear(LongLongOpenHashMap value) { + public void recycle(LongLongOpenHashMap value) { value.clear(); } }); - intIntMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + intIntMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public IntIntOpenHashMap newInstance(int sizing) { return new IntIntOpenHashMap(size(sizing)); } @Override - public void clear(IntIntOpenHashMap value) { + public void recycle(IntIntOpenHashMap value) { value.clear(); } }); - floatIntMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + floatIntMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public FloatIntOpenHashMap newInstance(int sizing) { return new FloatIntOpenHashMap(size(sizing)); } @Override - public void clear(FloatIntOpenHashMap value) { + public void recycle(FloatIntOpenHashMap value) { value.clear(); } }); - doubleIntMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + doubleIntMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public DoubleIntOpenHashMap newInstance(int sizing) { return new DoubleIntOpenHashMap(size(sizing)); } @Override - public void clear(DoubleIntOpenHashMap value) { + public void recycle(DoubleIntOpenHashMap value) { value.clear(); } }); - longIntMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + longIntMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public LongIntOpenHashMap newInstance(int sizing) { return new LongIntOpenHashMap(size(sizing)); } @Override - public void clear(LongIntOpenHashMap value) { + public void recycle(LongIntOpenHashMap value) { value.clear(); } + + @Override + public void destroy(LongIntOpenHashMap value) { + // drop instance for GC + } }); - objectIntMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + objectIntMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public ObjectIntOpenHashMap newInstance(int sizing) { return new ObjectIntOpenHashMap(size(sizing)); } @Override - public void clear(ObjectIntOpenHashMap value) { + public void recycle(ObjectIntOpenHashMap value) { value.clear(); } }); - intObjectMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + intObjectMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public IntObjectOpenHashMap newInstance(int sizing) { return new IntObjectOpenHashMap(size(sizing)); } @Override - public void clear(IntObjectOpenHashMap value) { + public void recycle(IntObjectOpenHashMap value) { value.clear(); } }); - objectFloatMap = build(type, limit, smartSize, availableProcessors, new Recycler.C() { + objectFloatMap = build(type, limit, smartSize, availableProcessors, new AbstractRecyclerC() { @Override public ObjectFloatOpenHashMap newInstance(int sizing) { return new ObjectFloatOpenHashMap(size(sizing)); } @Override - public void clear(ObjectFloatOpenHashMap value) { + public void recycle(ObjectFloatOpenHashMap value) { value.clear(); } }); diff --git a/src/main/java/org/elasticsearch/cache/recycler/PageCacheRecycler.java b/src/main/java/org/elasticsearch/cache/recycler/PageCacheRecycler.java index 12cef79a802..695807276ed 100644 --- a/src/main/java/org/elasticsearch/cache/recycler/PageCacheRecycler.java +++ b/src/main/java/org/elasticsearch/cache/recycler/PageCacheRecycler.java @@ -19,6 +19,8 @@ package org.elasticsearch.cache.recycler; +import org.elasticsearch.common.recycler.AbstractRecyclerC; + import com.google.common.base.Strings; import org.elasticsearch.ElasticsearchIllegalArgumentException; import org.elasticsearch.common.component.AbstractComponent; @@ -107,45 +109,53 @@ public class PageCacheRecycler extends AbstractComponent { final double totalWeight = bytesWeight + intsWeight + longsWeight + doublesWeight + objectsWeight; - bytePage = build(type, maxCount(limit, BigArrays.BYTE_PAGE_SIZE, bytesWeight, totalWeight), searchThreadPoolSize, availableProcessors, new Recycler.C() { + bytePage = build(type, maxCount(limit, BigArrays.BYTE_PAGE_SIZE, bytesWeight, totalWeight), searchThreadPoolSize, availableProcessors, new AbstractRecyclerC() { @Override public byte[] newInstance(int sizing) { return new byte[BigArrays.BYTE_PAGE_SIZE]; } @Override - public void clear(byte[] value) {} + public void recycle(byte[] value) { + // nothing to do + } }); - intPage = build(type, maxCount(limit, BigArrays.INT_PAGE_SIZE, intsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new Recycler.C() { + intPage = build(type, maxCount(limit, BigArrays.INT_PAGE_SIZE, intsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new AbstractRecyclerC() { @Override public int[] newInstance(int sizing) { return new int[BigArrays.INT_PAGE_SIZE]; } @Override - public void clear(int[] value) {} + public void recycle(int[] value) { + // nothing to do + } }); - longPage = build(type, maxCount(limit, BigArrays.LONG_PAGE_SIZE, longsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new Recycler.C() { + longPage = build(type, maxCount(limit, BigArrays.LONG_PAGE_SIZE, longsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new AbstractRecyclerC() { @Override public long[] newInstance(int sizing) { return new long[BigArrays.LONG_PAGE_SIZE]; } @Override - public void clear(long[] value) {} + public void recycle(long[] value) { + // nothing to do + } }); - doublePage = build(type, maxCount(limit, BigArrays.DOUBLE_PAGE_SIZE, doublesWeight, totalWeight), searchThreadPoolSize, availableProcessors, new Recycler.C() { + doublePage = build(type, maxCount(limit, BigArrays.DOUBLE_PAGE_SIZE, doublesWeight, totalWeight), searchThreadPoolSize, availableProcessors, new AbstractRecyclerC() { @Override public double[] newInstance(int sizing) { return new double[BigArrays.DOUBLE_PAGE_SIZE]; } @Override - public void clear(double[] value) {} + public void recycle(double[] value) { + // nothing to do + } }); - objectPage = build(type, maxCount(limit, BigArrays.OBJECT_PAGE_SIZE, objectsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new Recycler.C() { + objectPage = build(type, maxCount(limit, BigArrays.OBJECT_PAGE_SIZE, objectsWeight, totalWeight), searchThreadPoolSize, availableProcessors, new AbstractRecyclerC() { @Override public Object[] newInstance(int sizing) { return new Object[BigArrays.OBJECT_PAGE_SIZE]; } @Override - public void clear(Object[] value) { + public void recycle(Object[] value) { Arrays.fill(value, null); // we need to remove the strong refs on the objects stored in the array } }); diff --git a/src/main/java/org/elasticsearch/common/recycler/AbstractRecyclerC.java b/src/main/java/org/elasticsearch/common/recycler/AbstractRecyclerC.java new file mode 100644 index 00000000000..85e4b27cb70 --- /dev/null +++ b/src/main/java/org/elasticsearch/common/recycler/AbstractRecyclerC.java @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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.elasticsearch.common.recycler; + +public abstract class AbstractRecyclerC implements Recycler.C { + + public abstract T newInstance(int sizing); + + public abstract void recycle(T value); + + public void destroy(T value) { + // by default we simply drop the object for GC. + } + +} diff --git a/src/main/java/org/elasticsearch/common/recycler/DequeRecycler.java b/src/main/java/org/elasticsearch/common/recycler/DequeRecycler.java index c10ebcc2884..1a9787295f2 100644 --- a/src/main/java/org/elasticsearch/common/recycler/DequeRecycler.java +++ b/src/main/java/org/elasticsearch/common/recycler/DequeRecycler.java @@ -39,6 +39,11 @@ public class DequeRecycler extends AbstractRecycler { @Override public void close() { + // call destroy() for every cached object + for (T t : deque) { + c.destroy(t); + } + // finally get rid of all references deque.clear(); } @@ -57,7 +62,9 @@ public class DequeRecycler extends AbstractRecycler { } /** Called after a release. */ - protected void afterRelease(boolean recycled) {} + protected void afterRelease(boolean recycled) { + // nothing to do + } private class DV implements Recycler.V { @@ -86,9 +93,12 @@ public class DequeRecycler extends AbstractRecycler { } final boolean recycle = beforeRelease(); if (recycle) { - c.clear(value); + c.recycle(value); deque.addFirst(value); } + else { + c.destroy(value); + } value = null; afterRelease(recycle); return true; diff --git a/src/main/java/org/elasticsearch/common/recycler/NoneRecycler.java b/src/main/java/org/elasticsearch/common/recycler/NoneRecycler.java index 0b7a3a4d9ea..c1edb898793 100644 --- a/src/main/java/org/elasticsearch/common/recycler/NoneRecycler.java +++ b/src/main/java/org/elasticsearch/common/recycler/NoneRecycler.java @@ -36,7 +36,7 @@ public class NoneRecycler extends AbstractRecycler { @Override public void close() { - + // no-op } public static class NV implements Recycler.V { diff --git a/src/main/java/org/elasticsearch/common/recycler/Recycler.java b/src/main/java/org/elasticsearch/common/recycler/Recycler.java index b74acba477a..0bae3720e9e 100644 --- a/src/main/java/org/elasticsearch/common/recycler/Recycler.java +++ b/src/main/java/org/elasticsearch/common/recycler/Recycler.java @@ -34,8 +34,11 @@ public interface Recycler { /** Create a new empty instance of the given size. */ T newInstance(int sizing); - /** Clear the data. This operation is called when the data-structure is released. */ - void clear(T value); + /** Recycle the data. This operation is called when the data structure is released. */ + void recycle(T value); + + /** Destroy the data. This operation allows the data structure to release any internal resources before GC. */ + void destroy(T value); } public static interface V extends Releasable { diff --git a/src/main/java/org/elasticsearch/common/recycler/Recyclers.java b/src/main/java/org/elasticsearch/common/recycler/Recyclers.java index c1797bd64ba..2f07e3667a3 100644 --- a/src/main/java/org/elasticsearch/common/recycler/Recyclers.java +++ b/src/main/java/org/elasticsearch/common/recycler/Recyclers.java @@ -104,6 +104,7 @@ public enum Recyclers { @Override public void close() { + recyclers.get().close(); recyclers.close(); } diff --git a/src/test/java/org/elasticsearch/benchmark/common/recycler/RecyclerBenchmark.java b/src/test/java/org/elasticsearch/benchmark/common/recycler/RecyclerBenchmark.java index e8cdc91f532..aa40b609f83 100644 --- a/src/test/java/org/elasticsearch/benchmark/common/recycler/RecyclerBenchmark.java +++ b/src/test/java/org/elasticsearch/benchmark/common/recycler/RecyclerBenchmark.java @@ -19,6 +19,8 @@ package org.elasticsearch.benchmark.common.recycler; +import org.elasticsearch.common.recycler.AbstractRecyclerC; + import com.google.common.collect.ImmutableMap; import org.elasticsearch.common.recycler.Recycler; @@ -75,7 +77,7 @@ public class RecyclerBenchmark { public static void main(String[] args) throws InterruptedException { final int limit = 100; - final Recycler.C c = new Recycler.C() { + final Recycler.C c = new AbstractRecyclerC() { @Override public Object newInstance(int sizing) { @@ -83,7 +85,9 @@ public class RecyclerBenchmark { } @Override - public void clear(Object value) {} + public void recycle(Object value) { + // do nothing + } }; final ImmutableMap> recyclers = ImmutableMap.>builder() diff --git a/src/test/java/org/elasticsearch/common/recycler/AbstractRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/AbstractRecyclerTests.java index 74c491b9f8d..7d42b1d6e0f 100644 --- a/src/test/java/org/elasticsearch/common/recycler/AbstractRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/AbstractRecyclerTests.java @@ -20,60 +20,103 @@ package org.elasticsearch.common.recycler; import org.elasticsearch.ElasticsearchIllegalStateException; +import org.elasticsearch.common.recycler.Recycler.V; import org.elasticsearch.test.ElasticsearchTestCase; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public abstract class AbstractRecyclerTests extends ElasticsearchTestCase { - protected static final Recycler.C RECYCLER_C = new Recycler.C() { + // marker states for data + protected static final byte FRESH = 1; + protected static final byte RECYCLED = 2; + protected static final byte DEAD = 42; + + protected static final Recycler.C RECYCLER_C = new AbstractRecyclerC() { @Override public byte[] newInstance(int sizing) { - return new byte[10]; + byte[] value = new byte[10]; + // "fresh" is intentionally not 0 to ensure we covered this code path + Arrays.fill(value, FRESH); + return value; } @Override - public void clear(byte[] value) { - Arrays.fill(value, (byte) 0); + public void recycle(byte[] value) { + Arrays.fill(value, RECYCLED); + } + + @Override + public void destroy(byte[] value) { + // we cannot really free the internals of a byte[], so mark it for verification + Arrays.fill(value, DEAD); } }; - protected abstract Recycler newRecycler(); + protected void assertFresh(byte[] data) { + assertNotNull(data); + for (int i = 0; i < data.length; ++i) { + assertEquals(FRESH, data[i]); + } + } + + protected void assertRecycled(byte[] data) { + assertNotNull(data); + for (int i = 0; i < data.length; ++i) { + assertEquals(RECYCLED, data[i]); + } + } + + protected void assertDead(byte[] data) { + assertNotNull(data); + for (int i = 0; i < data.length; ++i) { + assertEquals(DEAD, data[i]); + } + } + + protected abstract Recycler newRecycler(int limit); + + protected int limit = randomIntBetween(5, 10); public void testReuse() { - Recycler r = newRecycler(); + Recycler r = newRecycler(limit); Recycler.V o = r.obtain(); assertFalse(o.isRecycled()); final byte[] b1 = o.v(); + assertFresh(b1); o.release(); + assertRecycled(b1); o = r.obtain(); final byte[] b2 = o.v(); if (o.isRecycled()) { + assertRecycled(b2); assertSame(b1, b2); } else { + assertFresh(b2); assertNotSame(b1, b2); } o.release(); r.close(); } - public void testClear() { - Recycler r = newRecycler(); + public void testRecycle() { + Recycler r = newRecycler(limit); Recycler.V o = r.obtain(); + assertFresh(o.v()); getRandom().nextBytes(o.v()); o.release(); o = r.obtain(); - for (int i = 0; i < o.v().length; ++i) { - assertEquals(0, o.v()[i]); - } + assertRecycled(o.v()); o.release(); r.close(); } public void testDoubleRelease() { - final Recycler r = newRecycler(); + final Recycler r = newRecycler(limit); final Recycler.V v1 = r.obtain(); v1.release(); try { @@ -89,4 +132,50 @@ public abstract class AbstractRecyclerTests extends ElasticsearchTestCase { r.close(); } + public void testDestroyWhenOverCapacity() { + Recycler r = newRecycler(limit); + + // get & keep reference to new/recycled data + Recycler.V o = r.obtain(); + byte[] data = o.v(); + assertFresh(data); + + // now exhaust the recycler + List> vals = new ArrayList>(limit); + for (int i = 0; i < limit ; ++i) { + vals.add(r.obtain()); + } + // Recycler size increases on release, not on obtain! + for (V v: vals) { + v.release(); + } + + // release first ref, verify for destruction + o.release(); + assertDead(data); + + // close the rest + r.close(); + } + + public void testClose() { + Recycler r = newRecycler(limit); + + // get & keep reference to pooled data + Recycler.V o = r.obtain(); + byte[] data = o.v(); + assertFresh(data); + + // randomize & return to pool + getRandom().nextBytes(data); + o.release(); + + // verify that recycle() ran + assertRecycled(data); + + // closing the recycler should mark recycled instances via destroy() + r.close(); + assertDead(data); + } + } diff --git a/src/test/java/org/elasticsearch/common/recycler/ConcurrentRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/ConcurrentRecyclerTests.java index 758041d0d8e..c8c4c2e8e7d 100644 --- a/src/test/java/org/elasticsearch/common/recycler/ConcurrentRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/ConcurrentRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class ConcurrentRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.concurrent(Recyclers.dequeFactory(RECYCLER_C, randomIntBetween(5, 10)), randomIntBetween(1,5)); + protected Recycler newRecycler(int limit) { + return Recyclers.concurrent(Recyclers.dequeFactory(RECYCLER_C, limit), randomIntBetween(1,5)); } } diff --git a/src/test/java/org/elasticsearch/common/recycler/LockedRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/LockedRecyclerTests.java index 9ffdf7aa370..7d56dffce15 100644 --- a/src/test/java/org/elasticsearch/common/recycler/LockedRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/LockedRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class LockedRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.locked(Recyclers.deque(RECYCLER_C, randomIntBetween(5, 10))); + protected Recycler newRecycler(int limit) { + return Recyclers.locked(Recyclers.deque(RECYCLER_C, limit)); } } diff --git a/src/test/java/org/elasticsearch/common/recycler/NoneRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/NoneRecyclerTests.java index a60c0ba18b3..a5a82ee8eb3 100644 --- a/src/test/java/org/elasticsearch/common/recycler/NoneRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/NoneRecyclerTests.java @@ -22,8 +22,16 @@ package org.elasticsearch.common.recycler; public class NoneRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { + protected Recycler newRecycler(int limit) { return Recyclers.none(RECYCLER_C); } + protected void assertRecycled(byte[] data) { + // will never match + } + + protected void assertDead(byte[] data) { + // will never match + } + } diff --git a/src/test/java/org/elasticsearch/common/recycler/QueueRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/QueueRecyclerTests.java index f693c30ccf7..20e229a65b0 100644 --- a/src/test/java/org/elasticsearch/common/recycler/QueueRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/QueueRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class QueueRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.concurrentDeque(RECYCLER_C, randomIntBetween(5, 10)); + protected Recycler newRecycler(int limit) { + return Recyclers.concurrentDeque(RECYCLER_C, limit); } } diff --git a/src/test/java/org/elasticsearch/common/recycler/SoftConcurrentRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/SoftConcurrentRecyclerTests.java index 0320ff54805..9ccc9908091 100644 --- a/src/test/java/org/elasticsearch/common/recycler/SoftConcurrentRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/SoftConcurrentRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class SoftConcurrentRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.concurrent(Recyclers.softFactory(Recyclers.dequeFactory(RECYCLER_C, randomIntBetween(5, 10))), randomIntBetween(1, 5)); + protected Recycler newRecycler(int limit) { + return Recyclers.concurrent(Recyclers.softFactory(Recyclers.dequeFactory(RECYCLER_C, limit)), randomIntBetween(1, 5)); } } diff --git a/src/test/java/org/elasticsearch/common/recycler/SoftThreadLocalRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/SoftThreadLocalRecyclerTests.java index 2a5d2536bc6..9d1c482e4ed 100644 --- a/src/test/java/org/elasticsearch/common/recycler/SoftThreadLocalRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/SoftThreadLocalRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class SoftThreadLocalRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.threadLocal(Recyclers.softFactory(Recyclers.dequeFactory(RECYCLER_C, 10))); + protected Recycler newRecycler(int limit) { + return Recyclers.threadLocal(Recyclers.softFactory(Recyclers.dequeFactory(RECYCLER_C, limit))); } } diff --git a/src/test/java/org/elasticsearch/common/recycler/ThreadLocalRecyclerTests.java b/src/test/java/org/elasticsearch/common/recycler/ThreadLocalRecyclerTests.java index 5ab68928a43..0346c54b6d4 100644 --- a/src/test/java/org/elasticsearch/common/recycler/ThreadLocalRecyclerTests.java +++ b/src/test/java/org/elasticsearch/common/recycler/ThreadLocalRecyclerTests.java @@ -22,8 +22,8 @@ package org.elasticsearch.common.recycler; public class ThreadLocalRecyclerTests extends AbstractRecyclerTests { @Override - protected Recycler newRecycler() { - return Recyclers.threadLocal(Recyclers.dequeFactory(RECYCLER_C, 10)); + protected Recycler newRecycler(int limit) { + return Recyclers.threadLocal(Recyclers.dequeFactory(RECYCLER_C, limit)); } }