diff options
author | Azat Khuzhin <azat@libevent.org> | 2020-07-05 15:01:34 +0300 |
---|---|---|
committer | Azat Khuzhin <azat@libevent.org> | 2020-07-05 15:02:46 +0300 |
commit | 5df3037d10556bfcb675bc73e516978b75fc7bc7 (patch) | |
tree | 9b59b8aec360426931f641d0e58fe57d2e442bad /test/test-ratelim.c | |
parent | 4c908dde58ef780eeefcc9df4db3063ca62ea862 (diff) | |
parent | 1324a03c125faa9404c91dbecec540a681a97367 (diff) | |
download | libevent-5df3037d10556bfcb675bc73e516978b75fc7bc7.tar.gz |
Merge branch 'release-2.1.12-stable-pull' into patches-2.1release-2.1.12-stablepatches-2.1
PR: https://github.com/libevent/libevent/pull/1045
* release-2.1.12-stable-pull:
Update ChangeLog
ci/linux: create dist artifact only if dist archive was built
Merge branch 'fix-signal-leak'
test: fix leak in dns/getaddrinfo_cancel_stress
test: fix UB in evbuffer/empty_reference_prepend_buffer
ci: set build type to debug with sanitizers
test: really disable bufferevent_pair_release_lock under ASAN (and fix gcc)
test-closed: fix leak
test-export: adjust libevent version
cmake: set rpath for libraries on linux
test-export: compatible with all versions of visual studio
Bump version to 2.1.12-stable (w/o ABI breakage)
ci: run ABI for release-*-pull branches too
Purge travis-ci config
Purge appveyor config
Bump ChangeLog for 2.1.12
Update AUTHORS for 2.1.12
Backport github actions to 2.1
test: add getaddrinfo(AI_ADDRCONFIG) test (off by default)
build: remove duplicate -Wredundant-decls
test: fix memory leaks for https (add BEV_OPT_CLOSE_ON_FREE)
test: "fix" (with a quirk) leak in ssl/bufferevent_wm (w/o defer callbacks)
test: disable bufferevent/bufferevent_pair_release_lock under ASAN (too tricky)
test: detect test failures if atexit handler calls _exit(!0) (sanitizers)
Make all classes Entry, Struct, etc) new-style classes
buffer: do not pass NULL to memcpy() from evbuffer_pullup()
test: do not pass NULL to memcmp() in evbuffer_datacmp() helper
http: fix undefined-shift in EVUTIL_IS*_ helpers
Check error code of evhttp_add_header_internal() in evhttp_parse_query_impl()
cmake: avoid problems from use of CMAKE_USE_PTHREADS_INIT
test/regress_testutils: use inet_addr()
remove FindGit.cmake, improve `git describe` command
checkpatch.sh: fix clang-format-diff usage
checkpatch.sh: fix usage
Fix clang-format-diff usage
variable redefinition in win32_dispatch
test: http/autofree_connection cleanup
http: fix EVHTTP_CON_AUTOFREE in case of timeout (and some else)
test: cleanup http/autofree_connection
test: fix http/autofree_connection
evdns: Add additional validation for values of dns options
test: Fix test_simpleclose for Windows platform
abi-check: abi-monitor 1.10 does not support -make -j8 (1.12 supports though)
Add API/ABI checker (using LVC)
Update list of cmake files for autotools dist archive
Pass --quiet to the event_rcpgen.py (autotools already does this)
There is typo in GetAdaptersAddresses windows library. It should be iphlpapi.dll
Support EV_CLOSED on linux for poll(2)
Fix EV_CLOSED detection/reporting (epoll only)
Merge branch 'EV_CLOSED-and-EV_ET-fixes'
bufferevent: allow setting priority on socket and openssl type
cmake: set a default value for LIBEVENT_STATIC_LINK
evutil_time: improve evutil_gettimeofday on Windows
bench: Allow backend method selection
cmake: missing test-closed binary
Merge branch 'event_rpcgen.py-cleanup'
cmake: replace CheckFunctionExists with CheckSymbolExists
LibeventConfig.cmake: restore CMAKE_FIND_LIBRARY_SUFFIXES and LIBEVENT_STATIC_LINK default
cmake: fix getaddrinfo checking error
cmake: remove CheckFunctionExistsEx
autoconf: fix getaddrinfo checking errors on mingw
test-time: do not use deprecated API
test-time: enable debug mode if EVENT_DEBUG_LOGGING_ALL env set
increase segment refcnt only if evbuffer_add_file_segment() succeeds
evdns: fix a crash when evdns_base with waiting requests is freed
event_base_once: fix potential null pointer threat
test-ratelim: add missing free
Do not use shared global structures on CYGWIN
test: move thread into realtime class even on EVENT__DISABLE_THREAD_SUPPORT
test: fix compilation without thread support (EVENT__DISABLE_THREAD_SUPPORT=ON)
test: fix bufferevent/bufferevent_connect_fail_eventcb* under osx/freebsd
test: fix dst thread in move_pthread_to_realtime_scheduling_class (osx)
test: fix compilation under win32 (rearrange thread_setup() code)
test: use THREAD_* wrappers over pthread* in del_notify
Merge branch 'osx-clock'
cmake: do not print used method (EVENT_SHOW_METHOD) while running tests
cmake: run regress test quietly like autotools (makes CI logs cleaner)
Merge branch 'http-connect'
http: do not assume body for CONNECT
Added uninstall target check to cmakelists
Fix compilation without OPENSSL_API_COMPAT
evutil_time: Implements usleep() using wait funtion on Windows
Initialize variable to 0 replace use memset function in sample/hello-world.c
cmake: set CMAKE_{RUNTIME,LIBRARY,ARCHIVE}_OUTPUT_DIRECTORY they are not defined
cmake: use CMAKE_LIBRARY_OUTPUT_DIRECTORY for the final shared library symlink
test-ratelim: calculate timers bias (for slow CPUs) to avoid false-positive
mailmap: add name/email aliases for yuangongji (name and email)
cmake: test for find_package()
cmake: improve package config file
Link with iphlpapi only on windows
Parse IPv6 scope IDs.
Relax bufferevent_connect_hostname_emfile
autotools: fails build when need but can not find openssl
cmake: eliminate duplicate installation of public headers
append to CMAKE_MODULE_PATH
Do not use sysctl.h on linux (it had been deprecated)
sample/https-client: link crypt32 explicitly when build with mingw-w64
Fix compat with NetBSD >= 10
Avoid transforming base C_FLAGS set deliberately
tinytest: support timeout on Windows
Merge branch 'upstream/pr/899' (evbuffer_freeze testcase enhancements)
evbuffer_add_file: fix freeing of segment in the error path
evutil_time: detect and use _gmtime64_s()/_gmtime64()
http: rename bind_socket_ai() to create_bind_socket_nonblock()
https-client: load certificates from the system cert store on Windows
Fix checking return value of the evdns_base_resolv_conf_parse()
cmake: fix getrandom() detection
arc4random: replace sysctl() with getrandom (on linux)
Upgrade autoconf (after upgrading minimum required to 2.67)
Revert "Warn if forked from the event loop during event_reinit()"
eliminate some C4267 warnings in Windows
autotools: attach doxygen target into all target
cmake: attach doxygen target into all target
Fix memory corruption in EV_CLOSURE_EVENT_FINALIZE with debug enabled
test: prevent duplicate event_enable_debug_mode() for TT_ENABLE_DEBUG_MODE
test: introduce TT_ENABLE_DEBUG_MODE flag
sample/http-server: fix parameter parsing
sample/signal-test: fix use of uninitialized variable
Fix typos in comments (sample/test/event-internal.h)
sample/signal-test: add NULL checks
Change the minimum version of automake to 1.13 and autoconf to 2.67
Add Uninstall.cmake.in into dist archive
Diffstat (limited to 'test/test-ratelim.c')
-rw-r--r-- | test/test-ratelim.c | 87 |
1 files changed, 86 insertions, 1 deletions
diff --git a/test/test-ratelim.c b/test/test-ratelim.c index 9ee989bd..34112e39 100644 --- a/test/test-ratelim.c +++ b/test/test-ratelim.c @@ -50,6 +50,10 @@ #include "event2/listener.h" #include "event2/thread.h" +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + static struct evutil_weakrand_state weakrand_state; static int cfg_verbose = 0; @@ -85,6 +89,18 @@ struct client_state { }; static const struct timeval *ms100_common=NULL; +/* Timers bias for slow CPUs, affects: + * - cfg_connlimit_tolerance (--check-connlimit) + * - cfg_grouplimit_tolerance (--check-grouplimit) + * - cfg_stddev_tolerance (--check-stddev) + */ +static int timer_bias_events; +static struct timeval timer_bias_start; +double timer_bias_spend; +/* Real cost is less (approximately ~5 usec), + * this macros adjusted to make the bias less */ +#define TIMER_MAX_COST_USEC 10 + /* info from check_bucket_levels_cb */ static int total_n_bev_checks = 0; static ev_int64_t total_rbucket_level=0; @@ -244,6 +260,64 @@ group_drain_cb(evutil_socket_t fd, short events, void *arg) bufferevent_rate_limit_group_decrement_write(ratelim_group, cfg_group_drain); } +static void +timer_bias_cb(evutil_socket_t fd, short events, void *arg) +{ + struct event *event = arg; + struct timeval end; + struct timeval diff; + + /** XXX: use rdtsc? (portability issues?) */ + evutil_gettimeofday(&end, NULL); + evutil_timersub(&end, &timer_bias_start, &diff); + timer_bias_spend += diff.tv_sec + diff.tv_usec * 1e6; + timer_bias_start = end; + + if (++timer_bias_events == 100) + event_del(event); +} +static double +timer_bias_calculate(void) +{ + struct event_config *cfg = NULL; + struct event_base *base = NULL; + struct event *timer = NULL; + struct timeval tv = { 0, 1 }; + int done = 0; + + cfg = event_config_new(); + if (!cfg) + goto err; + if (event_config_set_flag(cfg, EVENT_BASE_FLAG_PRECISE_TIMER)) + goto err; + base = event_base_new_with_config(cfg); + if (!base) + goto err; + + timer = event_new(base, -1, EV_PERSIST, timer_bias_cb, event_self_cbarg()); + if (!timer || event_add(timer, &tv)) { + goto err; + } + + evutil_gettimeofday(&timer_bias_start, NULL); + event_base_dispatch(base); + done = 1; + +err: + if (cfg) + event_config_free(cfg); + if (timer) + event_free(timer); + if (base) + event_base_free(base); + + if (done) + return MIN(timer_bias_spend / 1e6 / timer_bias_events / TIMER_MAX_COST_USEC, 5); + + fprintf(stderr, "Couldn't create event for CPU cycle counter bias\n"); + return -1; +} + static int test_ratelimiting(void) { @@ -266,6 +340,7 @@ test_ratelimiting(void) struct event_config *base_cfg; struct event *periodic_level_check; struct event *group_drain_event=NULL; + double timer_bias; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; @@ -275,6 +350,16 @@ test_ratelimiting(void) if (0) event_enable_debug_mode(); + timer_bias = timer_bias_calculate(); + if (timer_bias > 1) { + fprintf(stderr, "CPU is slow, timers bias is %f\n", timer_bias); + cfg_connlimit_tolerance *= timer_bias; + cfg_grouplimit_tolerance *= timer_bias; + cfg_stddev_tolerance *= timer_bias; + } else { + printf("CPU is fast enough, timers bias is %f\n", timer_bias); + } + base_cfg = event_config_new(); #ifdef _WIN32 @@ -376,7 +461,7 @@ test_ratelimiting(void) ratelim_group = NULL; /* So no more responders get added */ event_free(periodic_level_check); if (group_drain_event) - event_del(group_drain_event); + event_free(group_drain_event); for (i = 0; i < cfg_n_connections; ++i) { bufferevent_free(bevs[i]); |