This commit is contained in:
Timothy Jaeryang Baek 2025-08-17 04:06:16 +04:00
parent bed6aa63e1
commit 7f0c50f445
3 changed files with 15 additions and 8 deletions

View file

@ -343,12 +343,16 @@ DATABASE_ENABLE_SQLITE_WAL = (
os.environ.get("DATABASE_ENABLE_SQLITE_WAL", "False").lower() == "true" os.environ.get("DATABASE_ENABLE_SQLITE_WAL", "False").lower() == "true"
) )
DATABASE_DEDUPLICATE_INTERVAL = os.environ.get("DATABASE_DEDUPLICATE_INTERVAL", None) DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = os.environ.get(
if DATABASE_DEDUPLICATE_INTERVAL is not None: "DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL", None
)
if DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL is not None:
try: try:
DATABASE_DEDUPLICATE_INTERVAL = float(DATABASE_DEDUPLICATE_INTERVAL) DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = float(
DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL
)
except Exception: except Exception:
DATABASE_DEDUPLICATE_INTERVAL = 0.0 DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = 0.0
RESET_CONFIG_ON_START = ( RESET_CONFIG_ON_START = (
os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true" os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"

View file

@ -4,10 +4,10 @@ from typing import Optional
from open_webui.internal.db import Base, JSONField, get_db from open_webui.internal.db import Base, JSONField, get_db
from open_webui.env import DATABASE_DEDUPLICATE_INTERVAL from open_webui.env import DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL
from open_webui.models.chats import Chats from open_webui.models.chats import Chats
from open_webui.models.groups import Groups from open_webui.models.groups import Groups
from open_webui.utils.misc import deduplicate from open_webui.utils.misc import throttle
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
@ -313,7 +313,7 @@ class UsersTable:
except Exception: except Exception:
return None return None
@deduplicate(DATABASE_DEDUPLICATE_INTERVAL) @throttle(DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL)
def update_user_last_active_by_id(self, id: str) -> Optional[UserModel]: def update_user_last_active_by_id(self, id: str) -> Optional[UserModel]:
try: try:
with get_db() as db: with get_db() as db:

View file

@ -492,7 +492,7 @@ def freeze(value):
return value return value
def deduplicate(interval: float = 10.0): def throttle(interval: float = 10.0):
""" """
Decorator to prevent a function from being called more than once within a specified duration. Decorator to prevent a function from being called more than once within a specified duration.
If the function is called again within the duration, it returns None. To avoid returning If the function is called again within the duration, it returns None. To avoid returning
@ -506,6 +506,9 @@ def deduplicate(interval: float = 10.0):
lock = threading.Lock() lock = threading.Lock()
def wrapper(*args, **kwargs): def wrapper(*args, **kwargs):
if interval is None:
return func(*args, **kwargs)
key = (args, freeze(kwargs)) key = (args, freeze(kwargs))
now = time.time() now = time.time()
if now - last_calls.get(key, 0) < interval: if now - last_calls.get(key, 0) < interval: