Merge branch 'experimental' into dev

* experimental:
  Experimental concurrentbag fairness changes.  Starvation was observed under high load.
pull/316/merge
Brett Wooldridge 10 years ago
commit 0837a818bb

@ -17,6 +17,7 @@ package com.zaxxer.hikari.pool;
import java.sql.Connection;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@ -44,7 +45,8 @@ public final class PoolBagEntry implements IConcurrentBagEntry
this.connection = connection;
this.lastAccess = System.currentTimeMillis();
final long maxLifetime = pool.configuration.getMaxLifetime();
final long variance = pool.configuration.getMaxLifetime() > 300_000 ? ThreadLocalRandom.current().nextLong(100_000) : 0;
final long maxLifetime = pool.configuration.getMaxLifetime() - variance;
if (maxLifetime > 0) {
endOfLife = pool.houseKeepingExecutorService.schedule(new Runnable() {
public void run()

@ -58,9 +58,9 @@ public class ConcurrentBag<T extends IConcurrentBagEntry>
protected final AbstractQueuedLongSynchronizer synchronizer;
protected final CopyOnWriteArrayList<T> sharedList;
protected final AtomicLong sequence;
private final ThreadLocal<ArrayList<WeakReference<IConcurrentBagEntry>>> threadList;
private final AtomicLong sequence;
private final IBagStateListener listener;
private volatile boolean closed;
@ -310,22 +310,21 @@ public class ConcurrentBag<T extends IConcurrentBagEntry>
/**
* Our private synchronizer that handles notify/wait type semantics.
*/
private static final class Synchronizer extends AbstractQueuedLongSynchronizer
private final class Synchronizer extends AbstractQueuedLongSynchronizer
{
private static final long serialVersionUID = 104753538004341218L;
@Override
protected long tryAcquireShared(long seq)
protected long tryAcquireShared(final long seq)
{
return getState() > seq && !hasQueuedPredecessors() ? 1L : -1L;
return hasQueuedPredecessors() ? -1L : getState() - (seq + 1);
}
/** {@inheritDoc} */
@Override
protected boolean tryReleaseShared(long updateSeq)
protected boolean tryReleaseShared(final long unreliableSequence)
{
setState(updateSeq);
setState(sequence.get());
return true;
}
}

Loading…
Cancel
Save