From f10b512c918b461abf068b473591d491c362ec99 Mon Sep 17 00:00:00 2001 From: Rightup Date: Tue, 14 Jul 2026 23:07:12 +0100 Subject: [PATCH] fix(advert): set default values to False for adaptive, rate limit, and penalty configurations --- repeater/handler_helpers/advert.py | 14 +++++----- tests/test_handler_helpers_acl_advert.py | 35 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/repeater/handler_helpers/advert.py b/repeater/handler_helpers/advert.py index 63da6dc..263d31f 100644 --- a/repeater/handler_helpers/advert.py +++ b/repeater/handler_helpers/advert.py @@ -6,9 +6,9 @@ Includes adaptive rate limiting based on mesh activity. """ import asyncio +import itertools import logging import time -import itertools from collections import OrderedDict, deque from enum import Enum from typing import Dict, Optional, Tuple @@ -62,7 +62,7 @@ class AdvertHelper: # --- Adaptive mode config --- adaptive_cfg = repeater_cfg.get("advert_adaptive", {}) - self._adaptive_enabled = bool(adaptive_cfg.get("enabled", True)) + self._adaptive_enabled = bool(adaptive_cfg.get("enabled", False)) self._ewma_alpha = max(0.01, min(1.0, float(adaptive_cfg.get("ewma_alpha", 0.1)))) self._tier_hysteresis_seconds = max( 0.0, float(adaptive_cfg.get("hysteresis_seconds", 300.0)) @@ -76,7 +76,7 @@ class AdvertHelper: # --- Base rate limit config (scaled by tier) --- rate_cfg = repeater_cfg.get("advert_rate_limit", {}) - self._rate_limit_enabled = bool(rate_cfg.get("enabled", True)) + self._rate_limit_enabled = bool(rate_cfg.get("enabled", False)) self._base_bucket_capacity = max(1.0, float(rate_cfg.get("bucket_capacity", 2))) self._base_refill_tokens = max(0.1, float(rate_cfg.get("refill_tokens", 1.0))) self._base_refill_interval = max( @@ -86,7 +86,7 @@ class AdvertHelper: # --- Penalty box config --- penalty_cfg = repeater_cfg.get("advert_penalty_box", {}) - self._penalty_enabled = bool(penalty_cfg.get("enabled", True)) + self._penalty_enabled = bool(penalty_cfg.get("enabled", False)) self._penalty_violation_threshold = max(1, int(penalty_cfg.get("violation_threshold", 2))) self._penalty_decay_seconds = max( 1.0, float(penalty_cfg.get("violation_decay_seconds", 43200.0)) @@ -665,7 +665,7 @@ class AdvertHelper: # Adaptive mode config adaptive_cfg = repeater_cfg.get("advert_adaptive", {}) - self._adaptive_enabled = bool(adaptive_cfg.get("enabled", True)) + self._adaptive_enabled = bool(adaptive_cfg.get("enabled", False)) self._ewma_alpha = max(0.01, min(1.0, float(adaptive_cfg.get("ewma_alpha", 0.1)))) self._tier_hysteresis_seconds = max( 0.0, float(adaptive_cfg.get("hysteresis_seconds", 300.0)) @@ -678,7 +678,7 @@ class AdvertHelper: # Base rate limit config rate_cfg = repeater_cfg.get("advert_rate_limit", {}) - self._rate_limit_enabled = bool(rate_cfg.get("enabled", True)) + self._rate_limit_enabled = bool(rate_cfg.get("enabled", False)) self._base_bucket_capacity = max(1.0, float(rate_cfg.get("bucket_capacity", 2))) self._base_refill_tokens = max(0.1, float(rate_cfg.get("refill_tokens", 1.0))) self._base_refill_interval = max( @@ -688,7 +688,7 @@ class AdvertHelper: # Penalty box config penalty_cfg = repeater_cfg.get("advert_penalty_box", {}) - self._penalty_enabled = bool(penalty_cfg.get("enabled", True)) + self._penalty_enabled = bool(penalty_cfg.get("enabled", False)) self._penalty_violation_threshold = max( 1, int(penalty_cfg.get("violation_threshold", 2)) ) diff --git a/tests/test_handler_helpers_acl_advert.py b/tests/test_handler_helpers_acl_advert.py index ecd37d4..6af33a3 100644 --- a/tests/test_handler_helpers_acl_advert.py +++ b/tests/test_handler_helpers_acl_advert.py @@ -343,3 +343,38 @@ def test_advert_reload_config_and_cleanup_old_state_bounds_memory(): assert "old" not in helper._recent_advert_hashes assert "pk" not in helper._penalty_until assert "oldpk" not in helper._bucket_state + + +def test_advert_limiter_missing_sections_defaults_disabled(): + helper = AdvertHelper(local_identity=None, storage=None, config={"repeater": {}}) + + assert helper._adaptive_enabled is False + assert helper._rate_limit_enabled is False + assert helper._penalty_enabled is False + + +def test_advert_limiter_partial_sections_without_enabled_remain_disabled_after_reload(): + helper = AdvertHelper(local_identity=None, storage=None, config={"repeater": {}}) + helper.config = { + "repeater": { + "advert_adaptive": { + # enabled intentionally omitted + "thresholds": {"normal": 2, "busy": 7, "congested": 12} + }, + "advert_rate_limit": { + # enabled intentionally omitted + "bucket_capacity": 3, + "refill_tokens": 2, + }, + "advert_penalty_box": { + # enabled intentionally omitted + "violation_threshold": 2, + }, + } + } + + helper.reload_config() + + assert helper._adaptive_enabled is False + assert helper._rate_limit_enabled is False + assert helper._penalty_enabled is False