When we reinitialize the Throttle with a smaller number of allowed operations within a time period, we should preserve the oldest rather than the newest ones, or we'll most likely be in immediate and unfair violation of the limit.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@2469 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -43,9 +43,19 @@ public class EHCacheAdapter
|
||||
* cache manager when it knows that Depot and any other clients no longer need it.
|
||||
*/
|
||||
public EHCacheAdapter (CacheManager cachemgr)
|
||||
{
|
||||
this(cachemgr, 1000, 300, 20);
|
||||
}
|
||||
|
||||
public EHCacheAdapter (CacheManager cachemgr, int maxElementsInMemory,
|
||||
int timeToIdleSeconds, int timeToLiveSeconds)
|
||||
{
|
||||
_cachemgr = cachemgr;
|
||||
|
||||
_maxElementsInMemory = maxElementsInMemory;
|
||||
_timeToIdleSeconds = timeToIdleSeconds;
|
||||
_timeToLiveSeconds = timeToLiveSeconds;
|
||||
|
||||
CacheManagerPeerListener listener = _cachemgr.getCachePeerListener();
|
||||
CacheManagerPeerProvider provider = _cachemgr.getCachePeerProvider();
|
||||
if ((provider != null) != (listener != null)) {
|
||||
|
||||
@@ -81,10 +81,9 @@ public class Throttle
|
||||
System.arraycopy(_ops, _lastOp, ops, lastOp, _ops.length - _lastOp);
|
||||
|
||||
} else if (operations < _ops.length) {
|
||||
// copy to a smaller buffer, truncating older operations
|
||||
int lastOp = (_lastOp + _ops.length - operations) % _ops.length;
|
||||
int endCount = Math.min(_ops.length - lastOp, operations);
|
||||
System.arraycopy(_ops, lastOp, ops, 0, endCount);
|
||||
// if we're truncating, copy the first (oldest) stamps into ops[0..]
|
||||
int endCount = Math.min(operations, _ops.length - _lastOp);
|
||||
System.arraycopy(_ops, _lastOp, ops, 0, endCount);
|
||||
System.arraycopy(_ops, 0, ops, endCount, operations - endCount);
|
||||
_lastOp = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user