@@ -112,3 +112,97 @@ async def no_sleep(delay: float) -> None:
112112 )
113113
114114 assert attempts == 2
115+
116+
117+ @pytest .mark .asyncio
118+ async def test_record_internal_agent_stats_retries_database_table_lock (
119+ monkeypatch : pytest .MonkeyPatch ,
120+ ):
121+ attempts = 0
122+
123+ class LockedOnceDb :
124+ async def insert_provider_stat (self , ** kwargs ):
125+ nonlocal attempts
126+ attempts += 1
127+ if attempts == 1 :
128+ raise OperationalError (
129+ "insert into provider_stats" ,
130+ {},
131+ Exception ("database table is locked" ),
132+ )
133+ return SimpleNamespace (** kwargs )
134+
135+ monkeypatch .setattr (internal , "db_helper" , LockedOnceDb ())
136+
137+ async def no_sleep (delay : float ) -> None :
138+ return None
139+
140+ monkeypatch .setattr (internal .asyncio , "sleep" , no_sleep )
141+
142+ event = SimpleNamespace (unified_msg_origin = "webchat:FriendMessage:session-42" )
143+ provider = SimpleNamespace (
144+ provider_config = {"id" : "provider-1" },
145+ meta = lambda : SimpleNamespace (id = "provider-1" , type = "openai" ),
146+ get_model = lambda : "gpt-4.1" ,
147+ )
148+ agent_runner = SimpleNamespace (
149+ provider = provider ,
150+ stats = AgentStats (),
151+ was_aborted = lambda : False ,
152+ )
153+
154+ await internal ._record_internal_agent_stats (
155+ event ,
156+ ProviderRequest (conversation = SimpleNamespace (cid = "conv-123" )),
157+ agent_runner ,
158+ SimpleNamespace (role = "assistant" ),
159+ )
160+
161+ assert attempts == 2
162+
163+
164+ @pytest .mark .asyncio
165+ async def test_record_internal_agent_stats_does_not_retry_other_operational_errors (
166+ monkeypatch : pytest .MonkeyPatch ,
167+ ):
168+ attempts = 0
169+ warnings = []
170+
171+ class FailingDb :
172+ async def insert_provider_stat (self , ** kwargs ):
173+ nonlocal attempts
174+ attempts += 1
175+ raise OperationalError (
176+ "insert into provider_stats" ,
177+ {},
178+ Exception ("no such table: provider_stats" ),
179+ )
180+
181+ monkeypatch .setattr (internal , "db_helper" , FailingDb ())
182+ monkeypatch .setattr (
183+ internal .logger ,
184+ "warning" ,
185+ lambda * args , ** kwargs : warnings .append ((args , kwargs )),
186+ )
187+
188+ event = SimpleNamespace (unified_msg_origin = "webchat:FriendMessage:session-42" )
189+ provider = SimpleNamespace (
190+ provider_config = {"id" : "provider-1" },
191+ meta = lambda : SimpleNamespace (id = "provider-1" , type = "openai" ),
192+ get_model = lambda : "gpt-4.1" ,
193+ )
194+ agent_runner = SimpleNamespace (
195+ provider = provider ,
196+ stats = AgentStats (),
197+ was_aborted = lambda : False ,
198+ )
199+
200+ await internal ._record_internal_agent_stats (
201+ event ,
202+ ProviderRequest (conversation = SimpleNamespace (cid = "conv-123" )),
203+ agent_runner ,
204+ SimpleNamespace (role = "assistant" ),
205+ )
206+
207+ assert attempts == 1
208+ assert len (warnings ) == 1
0 commit comments