time_t now,from,to;
char *cfrom,*cto;
int from_res,to_res;
- float val;
+ float duration, dispersion;
edg_wll_InitContext(&ctx);
to = now;
from = now - 600;
- if (edg_wll_StateDurationFromTo(ctx,group,atoi(argv[2]),atoi(argv[3]),argc >=5 ? atoi(argv[4]) : 0,
- &from,&to,&val,&from_res,&to_res))
+ if (edg_wll_StateDurationFromTo(ctx,group,atoi(argv[2]),atoi(argv[3]),argc >=5 ? atoi(argv[4]) : 0, &from,&to,&duration,&dispersion,&from_res,&to_res))
{
char *et,*ed;
edg_wll_Error(ctx,&et,&ed);
cto[strlen(cto)-1] = 0;
printf("Average duration at \"%s\": %f s\n"
+ "Dispersion index: %f\n"
" Measuered from %s to %s\n"
" With resolution from %d to %d s\n",
- argv[1],val,cfrom,cto,from_res,to_res);
+ argv[1],duration,dispersion,cfrom,cto,from_res,to_res);
return 0;
}
time_t *from,
time_t *to,
float *duration,
+ float *dispersion,
int *res_from,
int *res_to
);
goto err;
edg_wll_ParseStatsResult(ctx,message, from, to, rate,
- ¬_returned, res_from, res_to);
+ ¬_returned, ¬_returned, res_from, res_to);
err:
free(response);
goto err;
edg_wll_ParseStatsResult(ctx,message, from, to, ¬_returned,
- duration, res_from, res_to);
+ duration, ¬_returned, res_from, res_to);
err:
free(response);
time_t *from,
time_t *to,
float *duration,
+ float *dispersion,
int *res_from,
int *res_to
)
goto err;
edg_wll_ParseStatsResult(ctx,message, from, to, ¬_returned,
- duration, res_from, res_to);
+ duration, dispersion, res_from, res_to);
err:
free(response);
edg_wll_JobStatCode statsFinalState;
int statsMinor;
time_t statsFrom, statsTo;
- float statsRate, statsDuration;
+ float statsRate, statsDuration, statsDispersion;
int statsResFrom, statsResTo;
glite_jobid_t jobId;
char *source;
extern int edg_wll_StatsDurationFTRequestToXML(edg_wll_Context,const char *,const edg_wll_QueryRec *,edg_wll_JobStatCode,edg_wll_JobStatCode,int,time_t *,time_t *,char **);
-extern edg_wll_ErrorCode edg_wll_ParseStatsResult(edg_wll_Context ctx, char *messageBody, time_t *from, time_t *to, float *rate, float *duration, int *res_from, int *res_to);
+extern edg_wll_ErrorCode edg_wll_ParseStatsResult(edg_wll_Context ctx, char *messageBody, time_t *from, time_t *to, float *rate, float *duration, float *dispersion, int *res_from, int *res_to);
#ifdef __cplusplus
}
c->statsMinor = 0;
c->statsRate = 0;
c->statsDuration = 0;
+ c->statsDispersion = 0;
c->statsFrom = 0;
c->statsTo = 0;
c->statsResFrom = 0;
}
break;
case 1: if (strcasecmp(el,"from") && strcasecmp(el,"to") &&
- strcasecmp(el,"rate") && strcasecmp(el,"duration") &&
- strcasecmp(el,"res_from") && strcasecmp(el,"res_to"))
+ strcasecmp(el,"rate") && strcasecmp(el,"duration") &&
+ strcasecmp(el,"dispersion") && strcasecmp(el,"res_from") &&
+ strcasecmp(el,"res_to"))
unexpWarning()
break;
default: unexpWarning()
XMLCtx->statsRate = edg_wll_from_string_to_float(XMLCtx);
else if (!strcmp(XMLCtx->element,"duration"))
XMLCtx->statsDuration = edg_wll_from_string_to_float(XMLCtx);
+ else if (!strcmp(XMLCtx->element,"dispersion"))
+ XMLCtx->statsDispersion = edg_wll_from_string_to_float(XMLCtx);
else if (!strcmp(XMLCtx->element,"res_from"))
XMLCtx->statsResFrom = edg_wll_from_string_to_int(XMLCtx);
else if (!strcmp(XMLCtx->element,"res_to"))
/* parse statistics result from client */
-edg_wll_ErrorCode edg_wll_ParseStatsResult(edg_wll_Context ctx, char *messageBody, time_t *from, time_t *to, float *rate, float *duration, int *res_from, int *res_to)
+edg_wll_ErrorCode edg_wll_ParseStatsResult(edg_wll_Context ctx, char *messageBody, time_t *from, time_t *to, float *rate, float *duration, float *dispersion, int *res_from, int *res_to)
{
edg_wll_XML_ctx XMLCtx;
edg_wll_ErrorCode errorCode;
*to = -1;
*rate = 0;
*duration = 0;
+ *dispersion = 0;
*res_from = -1;
*res_to = -1;
} else {
*to = XMLCtx.statsTo;
*rate = XMLCtx.statsRate;
*duration = XMLCtx.statsDuration;
+ *dispersion = XMLCtx.statsDispersion;
*res_from = XMLCtx.statsResFrom;
*res_to = XMLCtx.statsResTo;
}
edg_wll_JobStatCode final = EDG_WLL_JOB_UNDEF;
time_t from, to;
int i, j, minor, res_from, res_to;
- float rate = 0, duration = 0;
+ float rate = 0, duration = 0, dispersion = 0;
if (parseStatsRequest(ctx, messageBody, &function, &conditions,
&base, &final, &minor, &from, &to))
err = edg_wll_StateDurationFromToServer(
ctx, conditions[0], base, final,
minor, &from, &to, &duration,
- &res_from, &res_to);
+ &dispersion, &res_from, &res_to);
switch (err) {
case 0: if (html) ret = HTTP_NOTIMPL;
}
/* glue errors (if eny) to XML responce */
if (!html && !fatal)
- if (edg_wll_StatsResultToXML(ctx, from, to, rate,
- duration, res_from, res_to, &message))
+ if (edg_wll_StatsResultToXML(ctx, from,
+ to, rate, duration, dispersion,
+ res_from, res_to, &message))
ret = HTTP_INTERNAL;
}
time_t to,
float rate,
float duration,
+ float dispersion,
int res_from,
int res_to,
char **message)
edg_wll_add_time_t_to_XMLBody(&pomA, to, "to", -1);
edg_wll_add_float_to_XMLBody(&pomA, rate, "rate", 0);
edg_wll_add_float_to_XMLBody(&pomA, duration, "duration", 0);
+ edg_wll_add_float_to_XMLBody(&pomA, dispersion, "dispersion", 0);
edg_wll_add_int_to_XMLBody(&pomA, res_from, "res_from", -1);
edg_wll_add_int_to_XMLBody(&pomA, res_to, "res_to", -1);
int edg_wll_NotifResultToXML(edg_wll_Context ctx, time_t validity, char **message);
int edg_wll_QuerySequenceCodeResultToXML(edg_wll_Context ctx, char *source, char **message);
-int edg_wll_StatsResultToXML(edg_wll_Context,time_t,time_t,float,float,int,int,char **);
+int edg_wll_StatsResultToXML(edg_wll_Context,time_t,time_t,float,float,float,int,int,char **);
int parseStatsRequest(edg_wll_Context,char *,char **,edg_wll_QueryRec ***,edg_wll_JobStatCode *,edg_wll_JobStatCode *,int *,time_t *,time_t *);
#include <stdio.h>
#include <errno.h>
#include <time.h>
+#include <math.h>
#include "glite/lb/events.h"
#include "glite/lb/jobstat.h"
/* now we can do IT */
a->cells[a->ptr].cnt++;
a->cells[a->ptr].value += (float)timedif;
+ a->cells[a->ptr].value2 += (float)timedif * (float)timedif;
glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG,
"update archive %d, cell %d incremented to %f",
i, a->ptr, a->cells[a->ptr].value);
edg_wll_ResetError(ctx);
- if (err = findStat(ctx, group, major, EDG_WLL_JOB_UNDEF, minor, from, to, &stats)) return err;
+ if ((err = findStat(ctx, group, major, EDG_WLL_JOB_UNDEF, minor, from, to, &stats))) return err;
/* remap the file if someone changed its size */
if (stats->map->grpno != stats->grpno)
time_t *from,
time_t *to,
float *duration,
+ float *dispersion,
int *res_from,
int *res_to
)
{
- edg_wll_Stats *stats = default_stats; /* XXX: hardcoded */
+ edg_wll_Stats *stats = default_stats; /* XXX: hardcoded */
struct edg_wll_stats_group *g;
struct edg_wll_stats_archive *a;
int i,j,matchi;
edg_wll_ResetError(ctx);
- if (err = findStat(ctx, group, base_state, final_state, minor, from, to, &stats)) return err;
+ if ((err = findStat(ctx, group, base_state, final_state, minor, from, to, &stats))) return err;
/* remap the file if someone changed its size */
if (stats->map->grpno != stats->grpno)
rate = 0.0f;
*duration = 0.0f;
+ *dispersion = 0.0f;
match = 0;
for (j=0; j<stats->archives[matchi].length; j++,afrom += i) {
}
printf("diff: %ld\n", diff);
match += diff;
- rate += c->cnt * (float)diff/i;
+ rate += c->cnt * (float)diff;
if (c->cnt)
*duration += (float)diff * c->value/c->cnt;
+ *dispersion += (float)diff * c->value2;
if (*to >= afrom && *to < afrom+i) {
- glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "matched to: match %d, rate %f, duration %f", match, rate, *duration);
+ glite_common_log(LOG_CATEGORY_LB_SERVER, LOG_PRIORITY_DEBUG, "matched to: match %d, duration %f, dispersion %f", match, *duration, *disperson);
break;
}
}
- printf("XXX %f %f %ld\n", rate, *duration, match);
- rate /= match;
*duration /= match;
- printf("YYY %f %f %ld\n", rate, *duration, match);
+ *dispersion /= match;
+ rate /= match;
+ *dispersion = sqrtf(1/(rate-1) * ((*dispersion) - rate*(*duration)));
cleanup:
free(sig);
struct edg_wll_stats_cell {
int cnt;
float value;
+ float value2;
};
struct edg_wll_stats_archive {
time_t *from,
time_t *to,
float *duration,
+ float *dispersion,
int *res_from,
int *res_to
);