/*
* @(#) RoundRobinAllocator.java
* Created 22.04.2013 by oleg
* (C) Odnoklassniki.ru
*/
package org.apache.cassandra.db.disks;
import java.io.File;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.ColumnFamilyStore;
/**
* Having several disk directories allocates data in RR manner - i.e. for every requested file it will choose next disk in list.
*
* (If disk has not enough space - it will be skipped)
*
* @author Oleg Anastasyev<oa@odnoklassniki.ru>
*
*/
public class RoundRobinAllocator extends AbstractDiskAllocator implements DiskAllocator
{
private int currentDir = 0;
public RoundRobinAllocator(String[] dataFileDirs)
{
super(dataFileDirs);
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.disks.DiskAllocator#getDataFileLocation(org.apache.cassandra.db.ColumnFamilyStore, long)
*/
@Override
public synchronized String getDataFileLocation(ColumnFamilyStore cfs, long estimatedSize)
{
for ( int i = 0 ; i < dataDirectories.length ; i++ )
{
currentDir = ( currentDir + 1 ) % dataDirectories.length ;
File f = dataDirectories[currentDir];
if( enoughSpaceAvailable(estimatedSize, f) )
{
return getDataFileLocationForTable(f, cfs.getTable().name);
}
}
return null;
}
}