package com.mongodb.hvdf.tasks;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.DB;
import com.mongodb.hvdf.allocators.CollectionAllocator;
import com.mongodb.hvdf.allocators.SliceDetails;
import com.mongodb.hvdf.channels.ChannelTask;
import com.mongodb.hvdf.configuration.PluginConfiguration;
import com.mongodb.hvdf.configuration.PluginConfiguration.HVDF;
import com.mongodb.hvdf.configuration.TimePeriod;
public class LimitCollectionsTask extends ChannelTask {
private static Logger logger = LoggerFactory.getLogger(LimitCollectionsTask.class);
private final CollectionAllocator allocator;
private final DB db;
private final int maxCount;
private final long maxTime;
public LimitCollectionsTask(PluginConfiguration config){
this.allocator = config.get(HVDF.ALLOCATOR, CollectionAllocator.class);
this.db = config.get(HVDF.DB, DB.class);
this.maxTime = (config.get("by_time", TimePeriod.class, new TimePeriod(0))).getAs(TimeUnit.MILLISECONDS);
this.maxCount = (config.get("by_count", Number.class, 0)).intValue();
}
@Override
public void run() {
try{
// Get a sorted list of slices
List<SliceDetails> slices = allocator.getCollectionSlices();
Collections.sort(slices, SliceDetails.Comparators.MIN_TIME_DESCENDING);
// Trim collections to size if specified
if(this.maxCount > 0){
while(slices.size() > this.maxCount){
int targetIndex = slices.size() - 1;
this.db.getCollection(slices.get(targetIndex).name).drop();
slices.remove(targetIndex);
}
}
// Now trim by range if applicable
if(this.maxTime > 0 && slices.size() > 1){
long baseTime = slices.get(0).minTime;
for(SliceDetails slice : slices){
if((baseTime - slice.minTime) > this.maxTime){
this.db.getCollection(slice.name).drop();
}
}
}
} catch (Exception ex){
logger.error("Error limiting collections : ", ex);
}
}
}