*/
#include <math.h>
+#include <stdatomic.h>
#include "daemon/defer.h"
#include "daemon/session2.h"
#include "daemon/udp_queue.h"
struct defer {
size_t capacity;
kru_price_t max_decay;
+ uint32_t log_period;
int cpus;
bool using_avx2;
+ _Atomic uint32_t log_time;
_Alignas(64) uint8_t kru[];
};
struct defer *defer = NULL;
if (age_ns >= REQ_TIMEOUT) {
VERBOSE_LOG(" BREAK (timeout)\n");
- kr_log_warning(DEFER, "Data from %s too long in queue, dropping.\n",
- kr_straddr(ctx->comm->src_addr)); // TODO make it notice as it's intended behavior of defer?
+
+ // notice logging according to log-period
+ const uint32_t time_now = kr_now();
+ uint32_t log_time_orig = atomic_load_explicit(&defer->log_time, memory_order_relaxed);
+ if (defer->log_period) {
+ while (time_now - log_time_orig + 1024 >= defer->log_period + 1024) {
+ if (atomic_compare_exchange_weak_explicit(&defer->log_time, &log_time_orig, time_now,
+ memory_order_relaxed, memory_order_relaxed)) {
+ kr_log_notice(DEFER, "Data from %s too long in queue, dropping.\n",
+ kr_straddr(ctx->comm->src_addr));
+ break;
+ }
+ }
+ }
+
break_query(ctx, ETIME);
return;
}
/// Initialize shared memory, queues. To be called from Lua.
-int defer_init(const char *mmap_file, int cpus)
+int defer_init(const char *mmap_file, uint32_t log_period, int cpus)
{
defer_initialized = true;
if (mmap_file == NULL) {
struct defer header = {
.capacity = KRU_CAPACITY,
.max_decay = MAX_DECAY,
+ .log_period = log_period,
.cpus = cpus,
.using_avx2 = using_avx2(),
};
offsetof(struct defer, using_avx2) ==
sizeof(header.capacity) +
sizeof(header.max_decay) +
+ sizeof(header.log_period) +
sizeof(header.cpus),
"detected padding with undefined data inside mmapped header");
goto fail;
}
+ defer->log_time = kr_now() - log_period;
+
ret = mmapped_init_continue(&defer_mmapped);
if (ret != 0) goto fail;
int zi_zone_import(const zi_config_t);
_Bool ratelimiting_request_begin(struct kr_request *);
int ratelimiting_init(const char *, size_t, uint32_t, uint32_t, uint16_t, uint32_t, _Bool);
-int defer_init(const char *, int);
+int defer_init(const char *, uint32_t, int);
struct engine {
char _stub[];
};