package org.dcache.poolmanager;
import com.google.common.base.Functions;
import org.junit.Test;
import java.util.Collections;
import diskCacheV111.pools.PoolCostInfo;
import org.dcache.pool.classic.IoQueueManager;
import static java.util.Arrays.asList;
import static java.util.Collections.*;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
public class WeightedAvailableSpaceSelectionTest
{
private final WeightedAvailableSpaceSelection wass =
new WeightedAvailableSpaceSelection(1.0, 1.0);
public void checkAvailable(long expected,
long free,
long removable,
double breakeven,
long lru,
long gap)
{
PoolCostInfo info = new PoolCostInfo("pool", IoQueueManager.DEFAULT_QUEUE);
info.setSpaceUsage(free + removable, free, 0, removable, lru);
info.getSpaceInfo().setParameter(breakeven, gap);
assertEquals(expected, (long) wass.getAvailable(info.getSpaceInfo(), 0));
}
@Test
public void testNoRemovable()
{
checkAvailable(1000000, 1000000, 0, 0.5, 1000, 1000);
}
@Test
public void testNoRemovableLessThanGap()
{
checkAvailable(0, 1000000, 0, 0.5, 1000, 1000000);
}
@Test
public void testBreakEvenZero()
{
checkAvailable(1500000, 1000000, 500000, 0.0, 1000, 1000);
}
@Test
public void testBreakLruZero()
{
checkAvailable(1000000, 1000000, 500000, 0.5, 0, 1000);
}
@Test
public void testLruOneWeekHalflifeOneWeek()
{
checkAvailable((long) (1000000 + 500000 - 500000 * 0.5 / Math.log(2)),
1000000, 500000, 0.5, (7 * 24 * 3600), 1000);
}
@Test
public void testLruOneWeekHalflifeOneWeekLessThanGap()
{
checkAvailable(0, 1000000, 500000, 0.5, (7 * 24 * 3600), 1500000);
}
@Test
public void testLargeLoad()
{
PoolCostInfo info = new PoolCostInfo("pool", IoQueueManager.DEFAULT_QUEUE);
info.setSpaceUsage(100000000, 100000000, 0, 0);
info.getSpaceInfo().setParameter(0, 1000);
info.setMoverCostFactor(0.5);
info.addExtendedMoverQueueSizes("movers", 3000, 3000, 0, 0, 3000);
PoolCostInfo selected =
wass.selectByAvailableSpace(singletonList(info), 1000,
Functions.<PoolCostInfo>identity());
assertThat(selected, is(info));
}
@Test
public void testIdleFullPoolDoesNotAffectLoadNormalization()
{
PoolCostInfo busy = new PoolCostInfo("pool1", IoQueueManager.DEFAULT_QUEUE);
busy.setSpaceUsage(100000000, 100000000, 0, 0);
busy.getSpaceInfo().setParameter(0, 1000);
busy.setMoverCostFactor(0.5);
busy.addExtendedMoverQueueSizes("movers", 3000, 3000, 0, 0, 3000);
PoolCostInfo veryBusy = new PoolCostInfo("pool2", IoQueueManager.DEFAULT_QUEUE);
veryBusy.setSpaceUsage(100000000, 100000000, 0, 0);
veryBusy.getSpaceInfo().setParameter(0, 1000);
veryBusy.setMoverCostFactor(0.5);
veryBusy.addExtendedMoverQueueSizes("movers", 6000, 6000, 0, 0, 6000);
PoolCostInfo full = new PoolCostInfo("pool3", IoQueueManager.DEFAULT_QUEUE);
full.setSpaceUsage(100000000, 0, 100000000, 0);
full.getSpaceInfo().setParameter(0, 1000);
full.setMoverCostFactor(0.5);
full.addExtendedMoverQueueSizes("movers", 0, 3000, 0, 0, 0);
PoolCostInfo selected =
wass.selectByAvailableSpace(asList(full, busy, veryBusy), 1000,
Functions.<PoolCostInfo>identity());
assertThat(selected, is(busy));
}
@Test
public void testYoungLruDoesNotPreventPoolSelection()
{
int total = 100_000_000;
int free = 100;
int precious = 0;
int removable = 1_000_000;
int lru = 10;
double breakEven = 0.5;
int gap = 1000;
double moverCostFactor = 0.5;
int moverActive = 0;
int moverMaxActive = 10;
int moverQueued = 0;
int moverReaders = 0;
int moverWriters = 0;
int filesize = 1000;
PoolCostInfo info = new PoolCostInfo("pool", IoQueueManager.DEFAULT_QUEUE);
info.setSpaceUsage(total, free, precious, removable, lru);
info.getSpaceInfo().setParameter(breakEven, gap);
info.setMoverCostFactor(moverCostFactor);
info.addExtendedMoverQueueSizes("movers", moverActive, moverMaxActive, moverQueued, moverReaders, moverWriters);
PoolCostInfo selected =
wass.selectByAvailableSpace(singletonList(info), filesize,
Functions.<PoolCostInfo>identity());
assertThat(selected, is(info));
}
}