Skip to content

Commit 42783a9

Browse files
committed
fix(app_enabled): centralize app_enabled check
to reduce requests to nextcloud server Signed-off-by: Marcel Klehr <mklehr@gmx.net>
1 parent 531e581 commit 42783a9

3 files changed

Lines changed: 25 additions & 25 deletions

File tree

context_chat_backend/controller.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
33
# SPDX-License-Identifier: AGPL-3.0-or-later
44
#
5+
import time
6+
57
from nc_py_api.ex_app.providers.task_processing import TaskProcessingProvider
68

79
# isort: off
@@ -61,7 +63,20 @@
6163
'revision': '607a30d783dfa663caf39e06633721c8d4cfcd7e',
6264
}
6365
} if __download_models_from_hf else {}
66+
67+
6468
app_enabled = threading.Event()
69+
last_enabled_check: int|None = None
70+
def get_enabled_state() -> bool:
71+
global last_enabled_check
72+
if last_enabled_check is None or time.time() - last_enabled_check > 30:
73+
nc = NextcloudApp()
74+
if nc.enabled_state:
75+
app_enabled.set()
76+
else:
77+
app_enabled.clear()
78+
last_enabled_check = time.time()
79+
return app_enabled.is_set()
6580

6681
def enabled_handler(enabled: bool, nc: NextcloudApp | AsyncNextcloudApp) -> str:
6782
try:
@@ -104,8 +119,7 @@ def enabled_handler(enabled: bool, nc: NextcloudApp | AsyncNextcloudApp) -> str:
104119
async def lifespan(app: FastAPI):
105120
set_handlers(app, enabled_handler, models_to_fetch=models_to_fetch, trigger_handler=trigger_handler)
106121
start_bg_threads(app_config)
107-
nc = NextcloudApp()
108-
logger.info(f'App enable state at startup: {nc.enabled_state}')
122+
logger.info(f'App enable state at startup: {get_enabled_state()}')
109123
yield
110124
vectordb_loader.offload()
111125
wait_for_bg_threads()

context_chat_backend/task_fetcher.py

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from contextlib import suppress
1111
from enum import Enum
1212
from threading import Event, Thread
13-
from time import sleep, time
13+
from time import sleep
1414
from typing import Any
1515

1616
import niquests
@@ -23,6 +23,7 @@
2323
from .chain.ingest.injest import embed_sources
2424
from .chain.one_shot import process_context_query
2525
from .chain.types import ContextException, EnrichedSourceList, LLMOutput, ScopeList, SearchResult
26+
from .controller import get_enabled_state
2627
from .dyn_loader import LLMModelLoader, VectorDBLoader
2728
from .network_em import NetworkEmbeddings
2829
from .types import (
@@ -138,18 +139,12 @@ def _load_sources(source_items: Mapping[int, SourceItem | ReceivedFileItem]) ->
138139
LOGGER.info(f'Using {file_parsing_cpu_count} parallel file parsing workers')
139140

140141
nc = NextcloudApp()
141-
last_enabled_check = time()
142-
enabled_state = nc.enabled_state
143142
while True:
144143
if THREAD_STOP_EVENT.is_set():
145144
LOGGER.info('Files indexing thread is stopping due to stop event being set')
146145
return
147146

148-
if time() - last_enabled_check > 30: # check enabled state every 30 seconds
149-
enabled_state = nc.enabled_state
150-
last_enabled_check = time()
151-
152-
if not enabled_state:
147+
if not get_enabled_state():
153148
LOGGER.info('App is disabled, files indexing thread will sleep until next enabled state check')
154149
sleep(POLLING_COOLDOWN)
155150
continue
@@ -292,18 +287,12 @@ def updates_processing_thread(app_config: TConfig) -> None:
292287
return
293288

294289
nc = NextcloudApp()
295-
enabled_state = nc.enabled_state
296-
last_enabled_check = time()
297290
while True:
298291
if THREAD_STOP_EVENT.is_set():
299292
LOGGER.info('Updates processing thread is stopping due to stop event being set')
300293
return
301294

302-
if time() - last_enabled_check > 30: # check enabled state every 30 seconds
303-
enabled_state = nc.enabled_state
304-
last_enabled_check = time()
305-
306-
if not enabled_state:
295+
if not get_enabled_state():
307296
sleep(POLLING_COOLDOWN)
308297
continue
309298

@@ -487,8 +476,6 @@ def request_processing_thread(app_config: TConfig) -> None:
487476
return
488477

489478
nc = NextcloudApp()
490-
enabled_state = nc.enabled_state
491-
last_enabled_check = time()
492479
llm: LLM = llm_loader.load()
493480

494481
while True:
@@ -500,11 +487,7 @@ def request_processing_thread(app_config: TConfig) -> None:
500487
sleep(POLLING_COOLDOWN)
501488
continue
502489

503-
if time() - last_enabled_check > 30: # check enabled state every 30 seconds
504-
enabled_state = nc.enabled_state
505-
last_enabled_check = time()
506-
507-
if not enabled_state:
490+
if not get_enabled_state():
508491
sleep(POLLING_COOLDOWN)
509492
continue
510493

context_chat_backend/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import os
1010
import signal
1111
import sys
12+
import time
1213
import traceback
1314
from collections.abc import Callable
1415
from contextlib import suppress
@@ -18,7 +19,9 @@
1819
from typing import Any, TypeGuard, TypeVar
1920

2021
from fastapi.responses import JSONResponse as FastAPIJSONResponse
22+
from nc_py_api import NextcloudApp
2123

24+
from .controller import app_enabled
2225
from .types import AppRole, TConfig, TEmbeddingAuthApiKey, TEmbeddingAuthBasic, TEmbeddingConfig
2326

2427
T = TypeVar('T')
@@ -313,4 +316,4 @@ def get_app_role() -> AppRole:
313316
if role not in ['indexing', 'rp']:
314317
_logger.warning(f'Invalid app role: {role}, defaulting to all roles')
315318
return AppRole.NORMAL
316-
return AppRole(role)
319+
return AppRole(role)

0 commit comments

Comments
 (0)