/*
* Copyright 2014 Rackspace
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rackspacecloud.blueflood.ManualRollupTool.io.handlers;
import com.codahale.metrics.Meter;
import com.codahale.metrics.Timer;
import com.rackspacecloud.blueflood.io.astyanax.AstyanaxReader;
import com.rackspacecloud.blueflood.io.astyanax.AstyanaxWriter;
import com.rackspacecloud.blueflood.io.CassandraModel;
import com.rackspacecloud.blueflood.io.CassandraModel.MetricColumnFamily;
import com.rackspacecloud.blueflood.ManualRollupTool.io.ManualRollup;
import com.rackspacecloud.blueflood.rollup.Granularity;
import com.rackspacecloud.blueflood.service.*;
import com.rackspacecloud.blueflood.types.*;
import com.rackspacecloud.blueflood.utils.Metrics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.concurrent.Callable;
public class ReRollWork implements Callable<Boolean> {
Locator locator;
Granularity gran;
Range range;
private static final Logger log = LoggerFactory.getLogger(ManualRollup.class);
private static final Meter failedMeter = Metrics.meter(ManualRollup.class, "Metadatacache exception while grabbing rollup type");
private static final Timer rollupTimer = Metrics.timer(ManualRollup.class, "ReRoll Timer");
public ReRollWork (Locator locator, Granularity gran, Range range) {
this.locator = locator;
this.gran = gran;
this.range = range;
}
@Override
public Boolean call() throws Exception {
Timer.Context rollupTimerContext = rollupTimer.time();
try {
RollupType rollupType = RollupType.BF_BASIC;
Class<? extends Rollup> rollupClass = RollupType.classOf(rollupType, gran);
MetricColumnFamily srcCF = CassandraModel.getColumnFamily(rollupClass, gran.finer());
MetricColumnFamily dstCF = CassandraModel.getColumnFamily(rollupClass, gran);
//Get Rollup Computer
Rollup.Type rollupComputer = RollupRunnable.getRollupComputer(rollupType, gran.finer());
Iterable<Range> ranges = Range.rangesForInterval(gran, range.getStart(), range.getStop());
ArrayList<SingleRollupWriteContext> writeContexts = new ArrayList<SingleRollupWriteContext>();
for (Range r : ranges) {
Points input;
input = AstyanaxReader.getInstance().getDataToRoll(rollupClass,
locator, r, srcCF);
Rollup rollup = rollupComputer.compute(input);
writeContexts.add(new SingleRollupWriteContext(rollup, new SingleRollupReadContext(locator, r, gran), dstCF));
AstyanaxWriter.getInstance().insertRollups(writeContexts);
}
log.info("Calculated Rollup for : "+locator+" Granularity: "+gran+" "+" Range: "+range);
} catch (Throwable e) {
log.error("ReRoll failed for Locator: "+locator+" Granularity: "+gran+" "+e.getMessage());
failedMeter.mark();
//throw an exception here.
throw new Exception(e);
} finally {
rollupTimerContext.stop();
}
return true;
}
}