This commit is contained in:
Alessandro Pieve 2016-09-19 09:06:46 +00:00
parent f71a86ad74
commit 392c09eaae
5 changed files with 91 additions and 34 deletions

View File

@ -13,6 +13,9 @@ import org.gcube.accounting.datamodel.usagerecords.JobUsageRecord;
import org.gcube.documentstore.exception.InvalidValueException;
import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions;
import org.gcube.documentstore.records.aggregation.AggregationUtility;
import org.gcube.documentstore.records.implementation.AggregatedField;
import org.gcube.documentstore.records.implementation.RequiredField;
import org.gcube.documentstore.records.implementation.validations.annotations.ValidLong;
/**
* This Class is for library internal use only
@ -20,10 +23,17 @@ import org.gcube.documentstore.records.aggregation.AggregationUtility;
*/
public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements AggregatedUsageRecord<AggregatedJobUsageRecord, JobUsageRecord> {
/**
* Generated Serial Version UID
*/
private static final long serialVersionUID = -3376423316219914682L;
/*add a field max e min invocation*/
@RequiredField @ValidLong @AggregatedField
public static final String MAX_INVOCATION_TIME = "maxInvocationTime";
@RequiredField @ValidLong @AggregatedField
public static final String MIN_INVOCATION_TIME = "minInvocationTime";
public AggregatedJobUsageRecord(){
super();
@ -34,10 +44,19 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements
}
// TODO
public AggregatedJobUsageRecord(JobUsageRecord jobUsageRecord) throws InvalidValueException{
throw new UnsupportedOperationException();
}
public AggregatedJobUsageRecord(JobUsageRecord record) throws InvalidValueException{
//throw new UnsupportedOperationException();
super(record.getResourceProperties());
this.setOperationCount(1);
long duration = record.getDuration();
this.setMinInvocationTime(duration);
this.setMaxInvocationTime(duration);
Calendar creationTime = record.getCreationTime();
this.setCreationTime(Calendar.getInstance());
this.setStartTime(creationTime);
this.setEndTime(creationTime);
}
@Override
public int getOperationCount() {
return super.getOperationCount();
@ -48,6 +67,22 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements
super.setOperationCount(operationCount);
}
public long getMaxInvocationTime() {
return (Long) this.resourceProperties.get(MAX_INVOCATION_TIME);
}
public void setMaxInvocationTime(long maxInvocationTime) throws InvalidValueException {
super.setResourceProperty(MAX_INVOCATION_TIME, maxInvocationTime);
}
public long getMinInvocationTime() {
return (Long) this.resourceProperties.get(MIN_INVOCATION_TIME);
}
public void setMinInvocationTime(long minInvocationTime) throws InvalidValueException {
setResourceProperty(MIN_INVOCATION_TIME, minInvocationTime);
}
/**
* {@inheritDoc}
*/
@ -80,6 +115,14 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements
super.setEndTime(endTime);
}
protected long durationWeightedAverage(AggregatedJobUsageRecord record) throws InvalidValueException{
long thisDuration = this.getDuration() * this.getOperationCount();
long recordDuration = record.getDuration() * record.getOperationCount();
long totalOperationCount = this.getOperationCount() + record.getOperationCount();
return (thisDuration + recordDuration) / totalOperationCount;
}
/**
* {@inheritDoc}
*/
@ -87,17 +130,26 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements
public AggregatedJobUsageRecord aggregate(AggregatedJobUsageRecord record)
throws NotAggregatableRecordsExceptions {
try {
/* TODO
AggregationUtility<AggregatedJobUsageRecord> aggregationUtility = new AggregationUtility<AggregatedJobUsageRecord>(this);
setDuration(durationWeightedAverage(record));
long max = record.getMaxInvocationTime();
if(max > this.getMaxInvocationTime()){
this.setMaxInvocationTime(max);
}
long min = record.getMinInvocationTime();
if(min < this.getMinInvocationTime()){
this.setMinInvocationTime(min);
}
aggregationUtility.aggregate(record);
} catch(NotAggregatableRecordsExceptions e){
throw e; */
throw e;
} catch(Exception ex){
throw new NotAggregatableRecordsExceptions(ex);
}
//return this;
throw new UnsupportedOperationException();
return this;
//throw new UnsupportedOperationException();
}
/**
@ -147,4 +199,8 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements
return JobUsageRecord.class;
}
@Override
protected void cleanExtraFields(){
return;
}
}

View File

@ -34,13 +34,13 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
@NotEmptyIfNotNull
public static final String JOB_QUALIFIER = "jobQualifier";
@ValidLong
@RequiredField @ValidLong
public static final String JOB_START_TIME = "jobStartTime";
@ValidLong
@RequiredField @ValidLong
public static final String JOB_END_TIME = "jobEndTime";
@RequiredField @ComputedField(action=CalculateJobWallDurationAction.class) @ValidLong
public static final String WALL_DURATION = "wallDuration";
public static final String DURATION = "duration";
public AbstractJobUsageRecord(){
super();
@ -114,7 +114,7 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
long endTime = (Long) this.resourceProperties.get(JOB_END_TIME);
long startTime = (Long) this.resourceProperties.get(JOB_START_TIME);
long wallDuration = endTime - startTime;
setResourceProperty(AbstractJobUsageRecord.WALL_DURATION, wallDuration);
setResourceProperty(AbstractJobUsageRecord.DURATION, wallDuration);
return wallDuration;
}catch(Exception e){
throw new InvalidValueException(String.format("To calculate Wall Duration both %s and %s must be set",
@ -122,8 +122,8 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
}
}
public long getWallDuration() throws InvalidValueException {
Long wallDuration = (Long) this.resourceProperties.get(WALL_DURATION);
public long getDuration() throws InvalidValueException {
Long wallDuration = (Long) this.resourceProperties.get(DURATION);
if(wallDuration == null){
try {
wallDuration = calculateWallDuration();
@ -133,5 +133,8 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
}
return wallDuration;
}
public void setDuration(Long duration) throws InvalidValueException {
setResourceProperty(DURATION, duration);
}
}

View File

@ -19,9 +19,9 @@ public class CalculateJobWallDurationAction implements FieldAction {
public Serializable validate(String key, Serializable value, Record record) throws InvalidValueException {
try {
long wallDuration = ((AbstractJobUsageRecord) record).calculateWallDuration();
if(key.compareTo(AbstractJobUsageRecord.WALL_DURATION)==0){
if(key.compareTo(AbstractJobUsageRecord.DURATION)==0){
logger.warn("{} is automatically computed using {} and {}. This invocation has the only effect of recalculating the value. Any provided value is ignored.",
AbstractJobUsageRecord.WALL_DURATION, AbstractJobUsageRecord.JOB_START_TIME, AbstractJobUsageRecord.JOB_END_TIME);
AbstractJobUsageRecord.DURATION, AbstractJobUsageRecord.JOB_START_TIME, AbstractJobUsageRecord.JOB_END_TIME);
value = wallDuration;
}
}catch(InvalidValueException e){ }

View File

@ -34,7 +34,9 @@ public class JobUsageRecordTest extends ScopedTest {
expectedRequiredFields.add(UsageRecord.SCOPE);
expectedRequiredFields.add(UsageRecord.OPERATION_RESULT);
expectedRequiredFields.add(AbstractJobUsageRecord.JOB_ID);
expectedRequiredFields.add(AbstractJobUsageRecord.WALL_DURATION);
expectedRequiredFields.add(AbstractJobUsageRecord.DURATION);
expectedRequiredFields.add(AbstractJobUsageRecord.JOB_END_TIME);
expectedRequiredFields.add(AbstractJobUsageRecord.JOB_START_TIME);
return expectedRequiredFields;
}

View File

@ -37,6 +37,7 @@ public class TestUsageRecord {
public final static String TEST_SERVICE_CLASS = "TestServiceClass";
public final static String TEST_SERVICE_NAME = "TestServiceName";
public final static String TEST_CALLED_METHOD = "TestCalledMethod";
public final static String TEST_CALLER_QUALIFIER = "TestCallerQualifier";
public final static String TEST_CALLER_HOST = "remotehost";
public final static String TEST_HOST = "localhost";
@ -85,7 +86,7 @@ public class TestUsageRecord {
usageRecord.setCallerHost(TEST_CALLER_HOST);
usageRecord.setHost(TEST_HOST);
usageRecord.setCallerQualifier(TEST_CALLER_QUALIFIER);
usageRecord.setServiceClass(TEST_SERVICE_CLASS);
usageRecord.setServiceName(TEST_SERVICE_NAME);
usageRecord.setCalledMethod(TEST_CALLED_METHOD);
@ -151,11 +152,7 @@ public class TestUsageRecord {
usageRecord.setOperationResult(TEST_OPERATION_RESULT);
usageRecord.setJobId(TEST_JOB_ID);
usageRecord.setJobName(TEST_JOB_NAME);
usageRecord.setJobQualifier(TEST_JOB_QUALIFIER);
Calendar startTime = Calendar.getInstance();
Calendar endTime = Calendar.getInstance();
endTime.setTimeInMillis(startTime.getTimeInMillis() + HALF_DURATION);
@ -164,7 +161,6 @@ public class TestUsageRecord {
usageRecord.setJobStartTime(startTime);
usageRecord.setJobEndTime(endTime);
} catch (InvalidValueException e) {
logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e);
}