summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 92d2ba2)
raw | patch | inline | side by side (parent: 92d2ba2)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Thu, 4 May 2006 07:48:04 +0000 (07:48 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Thu, 4 May 2006 07:48:04 +0000 (07:48 +0000) |
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@808 a5681a0c-68f1-0310-ab6d-d61299d08faa
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@808 a5681a0c-68f1-0310-ab6d-d61299d08faa
program/src/rrd_update.c | patch | blob | history |
index 6296cfed50e66073960f714189ee357b3683be9c..da8f56a6814cebefc0044d63f588b00d8219b88e 100644 (file)
--- a/program/src/rrd_update.c
+++ b/program/src/rrd_update.c
* 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 */
(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 */
/* 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
/* 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 {
for(i=0;i<rrd.stat_head->ds_cnt;i++){
/* update pdp_prep to the current pdp_st. */
-
+ double pre_unknown = 0.0;
if(isnan(pdp_new[i]))
- 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;
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
/* 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;