@cryptotaxi247 / netdata-1 / commits / dc776c924

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]);