/*
* @(#) SizeConservativeAllocator.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;
/**
* Allocates disk space from disk with most free space (could be better for SSD, if you're not IO bound)
*
* This algo is used by stock cassandra
*
* @author Oleg Anastasyev<oa@odnoklassniki.ru>
*/
public class SpaceFirstAllocator extends AbstractDiskAllocator
{
/**
* @param dataFileDirs
*/
public SpaceFirstAllocator(String[] dataFileDirs)
{
super(dataFileDirs);
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.disks.DiskAllocator#getDataFileLocation(org.apache.cassandra.db.ColumnFamilyStore, long)
*/
@Override
public String getDataFileLocation(ColumnFamilyStore cfs, long estimatedSize)
{
long maxUsableSpace = 0;
File maxUsableFile = null;
for ( int i = 0 ; i < dataDirectories.length ; i++ )
{
File f = dataDirectories[i];
if( enoughSpaceAvailable(estimatedSize, f) )
{
long usableSpace = f.getUsableSpace();
if (usableSpace>maxUsableSpace) {
maxUsableSpace = usableSpace;
maxUsableFile = f;
}
}
}
return maxUsableFile!=null ? getDataFileLocationForTable(maxUsableFile, cfs.getTable().name) : null;
}
}