package com.ldbc.driver.client;
import com.ldbc.driver.ClientException;
import com.ldbc.driver.Workload;
import com.ldbc.driver.WorkloadException;
import com.ldbc.driver.WorkloadStreams;
import com.ldbc.driver.control.ControlService;
import com.ldbc.driver.control.LoggingService;
import com.ldbc.driver.generator.GeneratorFactory;
import com.ldbc.driver.generator.RandomDataGeneratorFactory;
import com.ldbc.driver.runtime.metrics.MetricsCollectionException;
import com.ldbc.driver.statistics.WorkloadStatistics;
import com.ldbc.driver.statistics.WorkloadStatisticsCalculator;
import com.ldbc.driver.util.Tuple3;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import static java.lang.String.format;
public class CalculateWorkloadStatisticsMode implements ClientMode<WorkloadStatistics>
{
private final ControlService controlService;
private final LoggingService loggingService;
private final long randomSeed;
private Workload workload = null;
private WorkloadStreams timeMappedWorkloadStreams = null;
public CalculateWorkloadStatisticsMode( ControlService controlService, long randomSeed ) throws ClientException
{
this.controlService = controlService;
this.loggingService = controlService.loggingServiceFactory().loggingServiceFor( getClass().getSimpleName() );
this.randomSeed = randomSeed;
}
@Override
public void init() throws ClientException
{
GeneratorFactory gf = new GeneratorFactory( new RandomDataGeneratorFactory( randomSeed ) );
WorkloadStreams workloadStreams;
try
{
boolean returnStreamsWithDbConnector = false;
Tuple3<WorkloadStreams,Workload,Long> workloadStreamsAndWorkload =
WorkloadStreams.createNewWorkloadWithOffsetAndLimitedWorkloadStreams(
controlService.configuration(),
gf,
returnStreamsWithDbConnector,
0,
controlService.configuration().operationCount(),
controlService.loggingServiceFactory()
);
workloadStreams = workloadStreamsAndWorkload._1();
workload = workloadStreamsAndWorkload._2();
}
catch ( Exception e )
{
throw new ClientException( format( "Error loading Workload class: %s",
controlService.configuration().workloadClassName() ), e );
}
loggingService.info( format( "Loaded Workload: %s", workload.getClass().getName() ) );
loggingService.info(
format( "Retrieving operation stream for workload: %s", workload.getClass().getSimpleName() ) );
try
{
timeMappedWorkloadStreams = WorkloadStreams.timeOffsetAndCompressWorkloadStreams(
workloadStreams,
controlService.workloadStartTimeAsMilli(),
controlService.configuration().timeCompressionRatio(),
gf
);
}
catch ( WorkloadException e )
{
throw new ClientException( "Error while retrieving operation stream for workload", e );
}
loggingService.info( "Driver Configuration" );
loggingService.info( controlService.toString() );
}
@Override
public WorkloadStatistics startExecutionAndAwaitCompletion() throws ClientException
{
loggingService.info(
format( "Calculating workload statistics for: %s", workload.getClass().getSimpleName() ) );
WorkloadStatistics workloadStatistics;
try ( Workload w = workload )
{
WorkloadStatisticsCalculator workloadStatisticsCalculator = new WorkloadStatisticsCalculator();
workloadStatistics = workloadStatisticsCalculator.calculate(
timeMappedWorkloadStreams,
TimeUnit.HOURS.toMillis( 5 )
// TODO uncomment, maybe
// workload.maxExpectedInterleave()
);
loggingService.info( "Calculation complete\n" + workloadStatistics );
}
catch ( MetricsCollectionException e )
{
throw new ClientException( "Error while calculating workload statistics", e );
}
catch ( IOException e )
{
throw new ClientException( "Error while calculating workload statistics", e );
}
return null;
}
}