refactored per second interpolation
Costa Tsaousis (ktsaou) committed
May 25, 2014 at 04:39 UTC
dc776c924977c1fd7f083411b9d4a42d7b6f95b6
1 file changed
+185
-164
netdata.c
+185
-164
@@ -1159,8 +1159,8 @@ struct rrd_stats {
1159
struct timeval last_collected_time; //
1160
unsigned long long usec_since_last_update;
1161
1162
- total_number absolute_total;
1163
- total_number last_absolute_total;
1162
+ total_number collected_total;
1163
+ total_number last_collected_total;
1164
1165
int chart_type;
1166
int debug;
@@ -1675,24 +1675,35 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1675
1676
// calculate totals and count the dimensions
1677
int dimensions;
1678
- st->last_absolute_total = st->absolute_total;
1679
- st->absolute_total = 0;
1678
+ st->collected_total = 0;
1679
for( rd = st->dimensions, dimensions = 0 ; rd ; rd = rd->next, dimensions++ )
1681
- st->absolute_total += rd->collected_value;
1680
+ st->collected_total += rd->collected_value;
1681
1682
// process all dimensions to calculate their values
1683
// based on the collected figures only
1684
// at this stage we do not interpolate anything
1685
for( rd = st->dimensions ; rd ; rd = rd->next ) {
1686
+ if(st->debug) debug(D_RRD_STATS, "%s/%s: "
1687
+ " last_collected_value = " COLLECTED_NUMBER_FORMAT
1688
+ " collected_value = " COLLECTED_NUMBER_FORMAT
1689
+ " last_calculated_value = " CALCULATED_NUMBER_FORMAT
1690
+ " calculated_value = " CALCULATED_NUMBER_FORMAT
1691
+ , st->id, rd->name
1692
+ , rd->last_collected_value
1693
+ , rd->collected_value
1694
+ , rd->last_calculated_value
1695
+ , rd->calculated_value
1696
+ );
1697
+
1698
switch(rd->algorithm) {
1699
case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
1700
// the percentage of the current increment
1701
// over the increment of all dimensions together
1691
- if(st->absolute_total == st->last_absolute_total) rd->calculated_value = 0;
1702
+ if(st->collected_total == st->last_collected_total) rd->calculated_value = 0;
1703
else rd->calculated_value =
1704
(calculated_number)100
1705
* (calculated_number)(rd->collected_value - rd->last_collected_value)
1695
- / (calculated_number)(st->absolute_total - st->last_absolute_total);
1706
+ / (calculated_number)(st->collected_total - st->last_collected_total);
1707
1708
if(st->debug)
1709
debug(D_RRD_STATS, "%s/%s: CALC PCENT-DIFF "
@@ -1702,19 +1713,19 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1713
, st->id, rd->name
1714
, rd->calculated_value
1715
, rd->collected_value, rd->last_collected_value
1705
- , st->absolute_total, st->last_absolute_total
1716
+ , st->collected_total, st->last_collected_total
1717
);
1718
break;
1719
1720
case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL:
1710
- if(!st->absolute_total) rd->calculated_value = 0;
1721
+ if(!st->collected_total) rd->calculated_value = 0;
1722
else
1723
// the percentage of the current value
1724
// over the total of all dimensions
1725
rd->calculated_value =
1726
(calculated_number)100
1727
* (calculated_number)rd->collected_value
1717
- / (calculated_number)st->absolute_total;
1728
+ / (calculated_number)st->collected_total;
1729
1730
if(st->debug)
1731
debug(D_RRD_STATS, "%s/%s: CALC PCENT-ROW "
@@ -1724,77 +1735,42 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1735
, st->id, rd->name
1736
, rd->calculated_value
1737
, rd->collected_value
1727
- , st->absolute_total
1738
+ , st->collected_total
1739
);
1740
break;
1741
1742
case RRD_DIMENSION_INCREMENTAL:
1732
- // we need the incremental calculation to produce per second results
1733
- // so, we multiply with 1.000.000 and divide by the microseconds passed since
1734
- // the last entry
1735
-
1743
// if the new is smaller than the old (an overflow, or reset), set the old equal to the new
1744
// to reset the calculation (it will give zero as the calculation for this second)
1745
if(rd->last_collected_value > rd->collected_value) rd->last_collected_value = rd->collected_value;
1746
1740
- if(!st->usec_since_last_update) {
1741
- rd->calculated_value = 0;
1742
- if(st->debug)
1743
- debug(D_RRD_STATS, "%s/%s: CALC INC-ZERO "
1744
- CALCULATED_NUMBER_FORMAT " = 0"
1745
- , st->id, rd->name
1746
- , rd->calculated_value
1747
- );
1748
- }
1749
- else {
1750
- rd->calculated_value =
1751
- (calculated_number)1000000
1752
- * (calculated_number)(rd->collected_value - rd->last_collected_value)
1753
- / (calculated_number)st->usec_since_last_update;
1747
+ rd->calculated_value += (calculated_number)(rd->collected_value - rd->last_collected_value);
1748
1755
- if(st->debug)
1756
- debug(D_RRD_STATS, "%s/%s: CALC INC "
1757
- CALCULATED_NUMBER_FORMAT " = 1000000"
1758
- " * (" COLLECTED_NUMBER_FORMAT " - " COLLECTED_NUMBER_FORMAT ")"
1759
- " / %llu"
1760
- , st->id, rd->name
1761
- , rd->calculated_value
1762
- , rd->collected_value, rd->last_collected_value
1763
- , st->usec_since_last_update
1764
- );
1765
- }
1749
+ if(st->debug)
1750
+ debug(D_RRD_STATS, "%s/%s: CALC INC "
1751
+ CALCULATED_NUMBER_FORMAT " += "
1752
+ COLLECTED_NUMBER_FORMAT " - " COLLECTED_NUMBER_FORMAT
1753
+ , st->id, rd->name
1754
+ , rd->calculated_value
1755
+ , rd->collected_value, rd->last_collected_value
1756
+ );
1757
break;
1758
1759
case RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION:
1769
- // we need the incremental calculation to produce per second results
1770
- // so, we multiply with 1.000.000 and divide by the microseconds passed since
1771
- // the last entry
1772
-
1760
// if the new is smaller than the old (an overflow, or reset), set the old equal to the new
1761
// to reset the calculation (it will give zero as the calculation for this second)
1762
if(rd->last_collected_value > rd->collected_value) rd->last_collected_value = rd->collected_value;
1763
1777
- if(!st->usec_since_last_update) {
1778
- rd->calculated_value = 0;
1779
- if(st->debug)
1780
- debug(D_RRD_STATS, "%s/%s: CALC INC-NO-IN-ZERO "
1781
- CALCULATED_NUMBER_FORMAT " = 0"
1782
- , st->id, rd->name
1783
- , rd->calculated_value
1784
- );
1785
- }
1786
- else {
1787
- rd->calculated_value = (calculated_number)(rd->collected_value - rd->last_collected_value);
1764
+ rd->calculated_value = (calculated_number)(rd->collected_value - rd->last_collected_value);
1765
1789
- if(st->debug)
1790
- debug(D_RRD_STATS, "%s/%s: CALC INC-NO-IN "
1791
- CALCULATED_NUMBER_FORMAT " = "
1792
- COLLECTED_NUMBER_FORMAT " - " COLLECTED_NUMBER_FORMAT
1793
- , st->id, rd->name
1794
- , rd->calculated_value
1795
- , rd->collected_value, rd->last_collected_value
1796
- );
1797
- }
1766
+ if(st->debug)
1767
+ debug(D_RRD_STATS, "%s/%s: CALC INC-NO-IN "
1768
+ CALCULATED_NUMBER_FORMAT " = "
1769
+ COLLECTED_NUMBER_FORMAT " - " COLLECTED_NUMBER_FORMAT
1770
+ , st->id, rd->name
1771
+ , rd->calculated_value
1772
+ , rd->collected_value, rd->last_collected_value
1773
+ );
1774
break;
1775
1776
case RRD_DIMENSION_ABSOLUTE:
@@ -1827,15 +1803,26 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1803
}
1804
// at this point we have all the calculated values ready
1805
1830
- if(st->counter_done == 1 || now_ut < next_ut) {
1806
+ if(st->counter_done == 1 || next_ut > now_ut) {
1807
// we don't have any usable data yet
1808
if(st->debug) debug(D_RRD_STATS, "%s: Skipping collected values (usec since last update = %llu, counter_done = %lu)", st->name, st->usec_since_last_update, st->counter_done);
1809
1810
for( rd = st->dimensions; rd ; rd = rd->next ) {
1835
- rd->last_collected_value = rd->collected_value;
1811
rd->last_calculated_value = rd->calculated_value;
1812
+ rd->last_collected_value = rd->collected_value;
1813
+
1814
+ switch(rd->algorithm) {
1815
+ case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
1816
+ case RRD_DIMENSION_INCREMENTAL:
1817
+ if(!st->usec_since_last_update) rd->calculated_value = 0;
1818
+ // keep the previous values
1819
+ // the next time, a new incremental total will be calculated
1820
+ break;
1821
+ }
1822
+
1823
rd->collected_value = 0;
1824
}
1825
+ st->last_collected_total = st->collected_total;
1826
1827
pthread_rwlock_unlock(&st->rwlock);
1828
if(pthread_setcancelstate(oldstate, NULL) != 0)
@@ -1846,7 +1833,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1833
1834
// it is now time to interpolate values on a second boundary
1835
unsigned long long first_ut = last_ut;
1849
- for( ; next_ut < now_ut ; next_ut += st->update_every * 1000000ULL ) {
1836
+ for( ; next_ut <= now_ut ; next_ut += st->update_every * 1000000ULL ) {
1837
if(st->debug) debug(D_RRD_STATS, "%s: last ut = %0.3Lf (last updated time)", st->name, (long double)last_ut/1000000.0);
1838
if(st->debug) debug(D_RRD_STATS, "%s: next ut = %0.3Lf (next interpolation point)", st->name, (long double)next_ut/1000000.0);
1839
@@ -1858,29 +1845,49 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1845
1846
switch(rd->algorithm) {
1847
case RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION:
1861
- case RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION:
1848
if(next_ut + st->update_every * 1000000ULL < now_ut)
1849
new_value = rd->last_calculated_value;
1850
else
1851
new_value = rd->calculated_value;
1852
1853
if(st->debug)
1868
- debug(D_RRD_STATS, "%s/%s: CALC2 NO-IN "
1854
+ debug(D_RRD_STATS, "%s/%s: CALC2 ABS-NO-IN "
1855
CALCULATED_NUMBER_FORMAT
1856
, st->id, rd->name
1857
, new_value
1858
);
1859
+
1860
+ if(next_ut + st->update_every * 1000000ULL > now_ut) rd->calculated_value = new_value;
1861
+ break;
1862
+
1863
+ case RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION:
1864
+ new_value = rd->calculated_value
1865
+ * (calculated_number)(st->update_every * 1000000)
1866
+ / (calculated_number)st->usec_since_last_update;
1867
+
1868
+ if(st->debug)
1869
+ debug(D_RRD_STATS, "%s/%s: CALC2 INC-NO-IN "
1870
+ CALCULATED_NUMBER_FORMAT " = "
1871
+ CALCULATED_NUMBER_FORMAT " * "
1872
+ "%llu / %llu"
1873
+ , st->id, rd->name
1874
+ , new_value
1875
+ , rd->calculated_value
1876
+ , (unsigned long long)(st->update_every * 1000000)
1877
+ , (unsigned long long)st->usec_since_last_update
1878
+ );
1879
+
1880
break;
1881
1882
case RRD_DIMENSION_INCREMENTAL:
1883
new_value = (calculated_number)
1884
( rd->calculated_value
1885
* (calculated_number)(next_ut - last_ut)
1879
- / (calculated_number)(st->update_every * 1000000)
1886
+ / (calculated_number)(now_ut - last_ut)
1887
);
1888
1889
if(st->debug)
1883
- debug(D_RRD_STATS, "%s/%s: CALC2 DEF "
1890
+ debug(D_RRD_STATS, "%s/%s: CALC2 INC "
1891
CALCULATED_NUMBER_FORMAT " = "
1892
CALCULATED_NUMBER_FORMAT
1893
" * %llu"
@@ -1888,12 +1895,16 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1895
, st->id, rd->name
1896
, new_value
1897
, rd->calculated_value
1891
- , (next_ut - last_ut)
1892
- , (st->update_every * 1000000)
1898
+ , (unsigned long long)(next_ut - last_ut)
1899
+ , (unsigned long long)(now_ut - last_ut)
1900
);
1901
+
1902
+ rd->calculated_value -= new_value;
1903
break;
1904
1905
case RRD_DIMENSION_ABSOLUTE:
1906
+ case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL:
1907
+ case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
1908
default:
1909
new_value = (calculated_number)
1910
( ( (rd->calculated_value - rd->last_calculated_value)
@@ -1915,6 +1926,8 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1926
, (next_ut - first_ut)
1927
, (now_ut - first_ut), rd->last_calculated_value
1928
);
1929
+
1930
+ if(next_ut + st->update_every * 1000000ULL > now_ut) rd->calculated_value = new_value;
1931
break;
1932
1933
}
@@ -1938,14 +1951,6 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1951
, rd->multiplier
1952
, rd->divisor
1953
);
1941
-
1942
- if(next_ut + st->update_every * 1000000ULL < now_ut) {
1943
- // there is another iteration
1944
- // do not change the anything
1945
- ;
1946
- }
1947
- else
1948
- rd->calculated_value = new_value;
1954
}
1955
1956
if(st->first_entry_t && st->counter >= (unsigned long long)st->entries) {
@@ -1965,6 +1970,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1970
rd->last_calculated_value = rd->calculated_value;
1971
rd->collected_value = 0;
1972
}
1973
+ st->last_collected_total = st->collected_total;
1974
1975
// ALL DONE ABOUT THE DATA UPDATE
1976
// --------------------------------------------------------------------
@@ -2333,8 +2339,8 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
2339
"\t\t\t\"update_every\": %d,\n"
2340
"\t\t\t\"isdetail\": %d,\n"
2341
"\t\t\t\"usec_since_last_update\": %llu,\n"
2336
- "\t\t\t\"absolute_total\": " TOTAL_NUMBER_FORMAT ",\n"
2337
- "\t\t\t\"last_absolute_total\": " TOTAL_NUMBER_FORMAT ",\n"
2342
+ "\t\t\t\"collected_total\": " TOTAL_NUMBER_FORMAT ",\n"
2343
+ "\t\t\t\"last_collected_total\": " TOTAL_NUMBER_FORMAT ",\n"
2344
"\t\t\t\"dimensions\": [\n"
2345
, st->id
2346
, st->name
@@ -2355,8 +2361,8 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
2361
, st->update_every
2362
, st->isdetail
2363
, st->usec_since_last_update
2358
- , st->absolute_total
2359
- , st->last_absolute_total
2364
+ , st->collected_total
2365
+ , st->last_collected_total
2366
);
2367
2368
unsigned long memory = st->memsize;
@@ -7252,114 +7258,113 @@ int become_daemon(int close_all_files, const char *input, const char *output, co
7258
return(0);
7259
}
7260
7255
-void unit_test(void)
7261
+int unit_test(long delay, long shift)
7262
{
7263
+ static int repeat = 0;
7264
+ repeat++;
7265
+
7266
+ char name[101];
7267
+ snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
7268
+
7269
debug_flags = 0xffffffff;
7270
+ memory_mode = NETDATA_MEMORY_MODE_RAM;
7271
7272
int do_abs = 1;
7273
int do_inc = 1;
7274
int do_abs2 = 1;
7275
int do_inc2 = 1;
7276
+ int do_abst = 1;
7277
+ int do_absi = 1;
7278
7264
- RRD_STATS *st = rrd_stats_find_bytype("netdata", "unittest");
7265
- if(!st) st = rrd_stats_create("netdata", "unittest", "unittest", "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
7279
+ RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
7280
st->debug = 1;
7281
7282
RRD_DIMENSION *rdabs = NULL;
7283
RRD_DIMENSION *rdinc = NULL;
7284
RRD_DIMENSION *rdabs2 = NULL;
7285
RRD_DIMENSION *rdinc2 = NULL;
7286
+ RRD_DIMENSION *rdabst = NULL;
7287
+ RRD_DIMENSION *rdabsi = NULL;
7288
7289
if(do_abs) rdabs = rrd_stats_dimension_add(st, "absolute", "absolute", 1, 1, RRD_DIMENSION_ABSOLUTE);
7290
if(do_inc) rdinc = rrd_stats_dimension_add(st, "incremental", "incremental", 1, 1, RRD_DIMENSION_INCREMENTAL);
7291
if(do_abs2) rdabs2 = rrd_stats_dimension_add(st, "absolute-no-interpolation", "absolute-no-interpolation", 1, 1, RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION);
7292
if(do_inc2) rdinc2 = rrd_stats_dimension_add(st, "incremental-no-interpolation", "incremental-no-interpolation", 1, 1, RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION);
7293
+ if(do_abst) rdabst = rrd_stats_dimension_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL);
7294
+ if(do_absi) rdabsi = rrd_stats_dimension_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
7295
+
7296
+ long increment = 1000;
7297
+ collected_number i = 0;
7298
+
7299
+ unsigned long c, dimensions = 0;
7300
+ RRD_DIMENSION *rd;
7301
+ for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
7302
+
7303
+ for(c = 0; c < 20 ;c++) {
7304
+ i += increment;
7305
7278
- long delay = 2000000;
7279
- collected_number i = 1000;
7280
-
7281
- fprintf(stderr, "\n\nINIT, VALUE = " COLLECTED_NUMBER_FORMAT "\n", i);
7282
- if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7283
- if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7284
- if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7285
- if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7286
-
7287
- gettimeofday(&st->last_collected_time, NULL);
7288
- st->last_collected_time.tv_usec = 500000;
7289
- rrd_stats_done(st);
7290
- //usleep(delay);
7291
- i += 1000;
7292
- fprintf(stderr, "\n\nDELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", delay, i);
7293
- rrd_stats_next_usec(st, delay);
7294
-
7295
- if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7296
- if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7297
- if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7298
- if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7299
-
7300
- rrd_stats_done(st);
7301
- //usleep(delay);
7302
- i += 1000;
7303
- fprintf(stderr, "\n\nDELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", delay, i);
7304
- rrd_stats_next_usec(st, delay);
7305
-
7306
- if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7307
- if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7308
- if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7309
- if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7310
-
7311
- rrd_stats_done(st);
7312
- //usleep(delay);
7313
- i += 1000;
7314
- fprintf(stderr, "\n\nDELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", delay, i);
7315
- rrd_stats_next_usec(st, delay);
7316
-
7317
- if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7318
- if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7319
- if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7320
- if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7321
-
7322
- rrd_stats_done(st);
7323
- //usleep(delay);
7324
- i += 1000;
7325
- fprintf(stderr, "\n\nDELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", delay, i);
7326
- rrd_stats_next_usec(st, delay);
7327
-
7328
- if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7329
- if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7330
- if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7331
- if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7332
-
7333
- rrd_stats_done(st);
7334
-
7335
- fprintf(stderr, "\n\nDONE\n");
7306
+ fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i);
7307
+ if(c) {
7308
+ rrd_stats_next_usec(st, delay);
7309
+ }
7310
+ if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
7311
+ if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
7312
+ if(do_abs2) rrd_stats_dimension_set(st, "absolute-no-interpolation", i);
7313
+ if(do_inc2) rrd_stats_dimension_set(st, "incremental-no-interpolation", i);
7314
+ if(do_abst) rrd_stats_dimension_set(st, "percentage-of-absolute-row", i);
7315
+ if(do_absi) rrd_stats_dimension_set(st, "percentage-of-incremental-row", i);
7316
+
7317
+ if(!c) {
7318
+ gettimeofday(&st->last_collected_time, NULL);
7319
+ st->last_collected_time.tv_usec = shift;
7320
+ }
7321
+
7322
+ // prevent it from deleting the dimensions
7323
+ for(rd = st->dimensions ; rd ; rd = rd->next) rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec;
7324
+
7325
+ rrd_stats_done(st);
7326
+ }
7327
+
7328
+ unsigned long oincrement = increment;
7329
+ increment = increment * st->update_every * 1000000 / delay;
7330
+ fprintf(stderr, "\n\nORIGINAL INCREMENT: %lu, INCREMENT %lu, DELAY %lu, SHIFT %lu\n", oincrement * 10, increment * 10, delay, shift);
7331
7332
int ret = 0;
7338
- unsigned long c;
7333
storage_number v;
7334
for(c = 0 ; c < st->counter ; c++) {
7341
- fprintf(stderr, "\nPOSITION: %lu\n", c);
7335
+ fprintf(stderr, "\nPOSITION: c = %lu, VALUE %lu\n", c, (oincrement + c * increment + increment * (1000000 - shift) / 1000000 )* 10);
7336
7343
- RRD_DIMENSION *rd;
7337
for(rd = st->dimensions ; rd ; rd = rd->next) {
7345
- fprintf(stderr, "\t %s " STORAGE_NUMBER_FORMAT " ==> ", rd->id, rd->values[c]);
7346
-
7347
- if(rd == rdabs) {
7348
- v = 12500 + c * 5000;
7349
- }
7350
- else if(rd == rdinc) {
7351
- if(c == 0) v = 2500;
7352
- else v = 5000;
7338
+ fprintf(stderr, "\t %s " STORAGE_NUMBER_FORMAT " -> ", rd->id, rd->values[c]);
7339
+
7340
+ if(rd == rdabs) v =
7341
+ ( oincrement
7342
+ + (increment * (1000000 - shift) / 1000000)
7343
+ + c * increment
7344
+ ) * 10;
7345
+
7346
+ else if(rd == rdinc) v = (c?(increment):(increment * (1000000 - shift) / 1000000)) * 10;
7347
+ else if(rd == rdabs2) v = (((oincrement + c * increment + increment * (1000000 - shift) / 1000000 ) + oincrement - 1) / oincrement) * oincrement * 10;
7348
+ else if(rd == rdinc2) v = increment * 10;
7349
+ else if(rd == rdabst) v = oincrement / dimensions;
7350
+ else if(rd == rdabsi) v = oincrement / dimensions;
7351
+ else v = 0;
7352
+
7353
+ if(v == rd->values[c]) fprintf(stderr, "passed.\n");
7354
+ else {
7355
+ if(rd == rdabs2) fprintf(stderr, "IGNORED (expected " STORAGE_NUMBER_FORMAT ")\n", v);
7356
+ else {
7357
+ fprintf(stderr, "ERROR! (expected " STORAGE_NUMBER_FORMAT ")\n", v);
7358
+ ret = 1;
7359
+ }
7360
}
7354
- else if(rd == rdinc2) v = c?10000:0;
7355
- else if(rd == rdabs2) v = 10000 + (c + 1) / 2 * 10000;
7356
-
7357
- if(v == rd->values[c]) fprintf(stderr, "PASSED!\n");
7358
- else { fprintf(stderr, "ERROR! (expected " STORAGE_NUMBER_FORMAT ")\n", v); ret = 1; }
7361
}
7362
}
7363
7362
- exit(ret);
7364
+ if(ret)
7365
+ fprintf(stderr, "\n\nUNIT TEST(%ld, %ld) FAILED\n\n", delay, shift);
7366
+
7367
+ return ret;
7368
}
7369
7370
int main(int argc, char **argv)
@@ -7385,7 +7390,23 @@ int main(int argc, char **argv)
7390
else if(strcmp(argv[i], "-u") == 0 && (i+1) < argc) { config_set("global", "run as user", argv[i+1]); i++; }
7391
else if(strcmp(argv[i], "-l") == 0 && (i+1) < argc) { config_set("global", "history", argv[i+1]); i++; }
7392
else if(strcmp(argv[i], "-t") == 0 && (i+1) < argc) { config_set("global", "update every", argv[i+1]); i++; }
7388
- else if(strcmp(argv[i], "--unittest") == 0) { unit_test(); }
7393
+ else if(strcmp(argv[i], "--unittest") == 0) {
7394
+ update_every = 1;
7395
+ if(unit_test(1000000, 0)) exit(1);
7396
+ if(unit_test(1000000, 500000)) exit(1);
7397
+ if(unit_test(1000000, 100000)) exit(1);
7398
+ if(unit_test(1000000, 900000)) exit(1);
7399
+ if(unit_test(2000000, 0)) exit(1);
7400
+ if(unit_test(2000000, 500000)) exit(1);
7401
+ if(unit_test(2000000, 100000)) exit(1);
7402
+ if(unit_test(2000000, 900000)) exit(1);
7403
+ if(unit_test(500000, 500000)) exit(1);
7404
+ //if(unit_test(500000, 100000)) exit(1);
7405
+ //if(unit_test(500000, 900000)) exit(1);
7406
+ if(unit_test(500000, 0)) exit(1);
7407
+ fprintf(stderr, "\n\nALL TESTS PASSED\n\n");
7408
+ exit(0);
7409
+ }
7410
else {
7411
fprintf(stderr, "Cannot understand option '%s'.\n", argv[i]);
7412
fprintf(stderr, "\nUSAGE: %s [-d] [-l LINES_TO_SAVE] [-u UPDATE_TIMER] [-p LISTEN_PORT] [-dl debug log file] [-df debug flags].\n\n", argv[0]);