summaryrefslogtreecommitdiff
path: root/test/test-ratelim.c
diff options
context:
space:
mode:
authorAzat Khuzhin <azat@libevent.org>2020-07-05 15:01:34 +0300
committerAzat Khuzhin <azat@libevent.org>2020-07-05 15:02:46 +0300
commit5df3037d10556bfcb675bc73e516978b75fc7bc7 (patch)
tree9b59b8aec360426931f641d0e58fe57d2e442bad /test/test-ratelim.c
parent4c908dde58ef780eeefcc9df4db3063ca62ea862 (diff)
parent1324a03c125faa9404c91dbecec540a681a97367 (diff)
downloadlibevent-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.c87
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]);