3
3
from http import HTTPStatus
4
4
from time import sleep
5
5
6
- import redis
7
6
import sentry_sdk
8
7
from celery import Celery
9
8
from celery import shared_task
10
9
from celery import Task
11
10
from celery .exceptions import SoftTimeLimitExceeded
12
11
from redis import Redis
12
+ from redis .exceptions import LockError
13
+ from redis .lock import Lock as RedisLock
13
14
from sqlalchemy .orm import Session
14
15
15
16
from danswer .background .celery .apps .app_base import task_logger
44
45
from danswer .natural_language_processing .search_nlp_models import EmbeddingModel
45
46
from danswer .natural_language_processing .search_nlp_models import warm_up_bi_encoder
46
47
from danswer .redis .redis_connector import RedisConnector
47
- from danswer .redis .redis_connector_index import RedisConnectorIndexingFenceData
48
+ from danswer .redis .redis_connector_index import RedisConnectorIndexPayload
48
49
from danswer .redis .redis_pool import get_redis_client
49
50
from danswer .utils .logger import setup_logger
50
51
from danswer .utils .variable_functionality import global_version
@@ -61,22 +62,38 @@ def __init__(
61
62
self ,
62
63
stop_key : str ,
63
64
generator_progress_key : str ,
64
- redis_lock : redis . lock . Lock ,
65
+ redis_lock : RedisLock ,
65
66
redis_client : Redis ,
66
67
):
67
68
super ().__init__ ()
68
- self .redis_lock : redis . lock . Lock = redis_lock
69
+ self .redis_lock : RedisLock = redis_lock
69
70
self .stop_key : str = stop_key
70
71
self .generator_progress_key : str = generator_progress_key
71
72
self .redis_client = redis_client
73
+ self .started : datetime = datetime .now (timezone .utc )
74
+ self .redis_lock .reacquire ()
75
+
76
+ self .last_lock_reacquire : datetime = datetime .now (timezone .utc )
72
77
73
78
def should_stop (self ) -> bool :
74
79
if self .redis_client .exists (self .stop_key ):
75
80
return True
76
81
return False
77
82
78
83
def progress (self , amount : int ) -> None :
79
- self .redis_lock .reacquire ()
84
+ try :
85
+ self .redis_lock .reacquire ()
86
+ self .last_lock_reacquire = datetime .now (timezone .utc )
87
+ except LockError :
88
+ logger .exception (
89
+ f"RunIndexingCallback - lock.reacquire exceptioned. "
90
+ f"lock_timeout={ self .redis_lock .timeout } "
91
+ f"start={ self .started } "
92
+ f"last_reacquired={ self .last_lock_reacquire } "
93
+ f"now={ datetime .now (timezone .utc )} "
94
+ )
95
+ raise
96
+
80
97
self .redis_client .incrby (self .generator_progress_key , amount )
81
98
82
99
@@ -325,7 +342,7 @@ def try_creating_indexing_task(
325
342
redis_connector_index .generator_clear ()
326
343
327
344
# set a basic fence to start
328
- payload = RedisConnectorIndexingFenceData (
345
+ payload = RedisConnectorIndexPayload (
329
346
index_attempt_id = None ,
330
347
started = None ,
331
348
submitted = datetime .now (timezone .utc ),
@@ -368,7 +385,7 @@ def try_creating_indexing_task(
368
385
redis_connector_index .set_fence (payload )
369
386
370
387
except Exception :
371
- redis_connector_index .set_fence (payload )
388
+ redis_connector_index .set_fence (None )
372
389
task_logger .exception (
373
390
f"Unexpected exception: "
374
391
f"tenant={ tenant_id } "
0 commit comments