that the old handling where the seconds were rounded could lead to cases where the data stored was higher than the data input ...
now I always floor the unknown seconds and this will lead to the same or lower data but not higher ... -- tobi
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@808
a5681a0c-68f1-0310-ab6d-
d61299d08faa
* spot in the rrd file. */
unsigned long rra_pos_tmp; /* temporary byte pointer. */
double interval,
* spot in the rrd file. */
unsigned long rra_pos_tmp; /* temporary byte pointer. */
double interval,
- pre_int,post_int; /* interval between this and
+ pre_int,post_int; /* interval between this and
* the last run */
unsigned long proc_pdp_st; /* which pdp_st was the last
* to be processed */
* the last run */
unsigned long proc_pdp_st; /* which pdp_st was the last
* to be processed */
(dst_idx != DST_CDEF) &&
rrd.ds_def[i].par[DS_mrhb_cnt].u_cnt >= interval) {
double rate = DNAN;
(dst_idx != DST_CDEF) &&
rrd.ds_def[i].par[DS_mrhb_cnt].u_cnt >= interval) {
double rate = DNAN;
- /* the data source type defines how to process the data */
+ /* the data source type defines how to process the data */
/* pdp_new contains rate * time ... eg the bytes
* transferred during the interval. Doing it this way saves
* a lot of math operations */
/* pdp_new contains rate * time ... eg the bytes
* transferred during the interval. Doing it this way saves
* a lot of math operations */
/* no news is news all the same */
pdp_new[i] = DNAN;
}
/* no news is news all the same */
pdp_new[i] = DNAN;
}
/* make a copy of the command line argument for the next run */
#ifdef DEBUG
/* make a copy of the command line argument for the next run */
#ifdef DEBUG
/* no we have not passed a pdp_st moment. therefore update is simple */
for(i=0;i<rrd.stat_head->ds_cnt;i++){
/* no we have not passed a pdp_st moment. therefore update is simple */
for(i=0;i<rrd.stat_head->ds_cnt;i++){
- if(isnan(pdp_new[i]))
- rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt += floor(interval+0.5);
- else {
+ if(isnan(pdp_new[i])) {
+ /* this is not realy accurate if we use subsecond data arival time
+ should have thought of it when going subsecond resolution ...
+ sorry next format change we will have it! */
+ rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt += floor(interval);
+ } else {
if (isnan( rrd.pdp_prep[i].scratch[PDP_val].u_val )){
rrd.pdp_prep[i].scratch[PDP_val].u_val= pdp_new[i];
} else {
if (isnan( rrd.pdp_prep[i].scratch[PDP_val].u_val )){
rrd.pdp_prep[i].scratch[PDP_val].u_val= pdp_new[i];
} else {
for(i=0;i<rrd.stat_head->ds_cnt;i++){
/* update pdp_prep to the current pdp_st. */
for(i=0;i<rrd.stat_head->ds_cnt;i++){
/* update pdp_prep to the current pdp_st. */
+ double pre_unknown = 0.0;
- rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt += floor(pre_int+0.5);
+ /* a final bit of unkonwn to be added bevore calculation
+ * we use a tempaorary variable for this so that we
+ * don't have to turn integer lines before using the value */
+ pre_unknown = pre_int;
else {
if (isnan( rrd.pdp_prep[i].scratch[PDP_val].u_val )){
rrd.pdp_prep[i].scratch[PDP_val].u_val= pdp_new[i]/interval*pre_int;
else {
if (isnan( rrd.pdp_prep[i].scratch[PDP_val].u_val )){
rrd.pdp_prep[i].scratch[PDP_val].u_val= pdp_new[i]/interval*pre_int;
pdp_temp[i] = DNAN;
} else {
pdp_temp[i] = rrd.pdp_prep[i].scratch[PDP_val].u_val
pdp_temp[i] = DNAN;
} else {
pdp_temp[i] = rrd.pdp_prep[i].scratch[PDP_val].u_val
- / (double)( occu_pdp_st
- - proc_pdp_st
- - rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt);
+ / ((double)(occu_pdp_st - proc_pdp_st
+ - rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt)
+ -pre_unknown);
}
/* process CDEF data sources; remember each CDEF DS can
}
/* process CDEF data sources; remember each CDEF DS can
/* make pdp_prep ready for the next run */
if(isnan(pdp_new[i])){
/* make pdp_prep ready for the next run */
if(isnan(pdp_new[i])){
- rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt = floor(post_int + 0.5);
+ /* this is not realy accurate if we use subsecond data arival time
+ should have thought of it when going subsecond resolution ...
+ sorry next format change we will have it! */
+ rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt = floor(post_int);
rrd.pdp_prep[i].scratch[PDP_val].u_val = DNAN;
} else {
rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt = 0;
rrd.pdp_prep[i].scratch[PDP_val].u_val = DNAN;
} else {
rrd.pdp_prep[i].scratch[PDP_unkn_sec_cnt].u_cnt = 0;