salvage: fix(opensearch) re-raise search errors (credit @yashwanth123 #6477) (#6519)

Co-authored-by: yashwanth123 <yashwanth123@users.noreply.github.com>
This commit is contained in:
Bartok
2026-07-24 07:49:26 -05:00
committed by GitHub
parent d6d89c987b
commit 01afdde3e7
2 changed files with 25 additions and 6 deletions
+7 -3
View File
@@ -248,7 +248,7 @@ class OpenSearchDB(VectorStoreBase):
return results
except Exception as e:
logger.error(f"Error during search: {e}", exc_info=True)
return []
raise
def keyword_search(self, query, top_k=5, filters=None):
"""Search for memories using BM25 keyword matching.
@@ -293,8 +293,12 @@ class OpenSearchDB(VectorStoreBase):
]
return results
except Exception as e:
logger.error(f"Error during keyword search: {e}")
return []
# Do NOT re-raise here: keyword_search() is a best-effort helper that
# search() may call to augment semantic results. Raising would crash
# the whole search() call on a keyword-only failure (regression per
# maintainer review on #6519). Log with exc_info and degrade to None.
logger.error(f"Error during keyword search: {e}", exc_info=True)
return None
def delete(self, vector_id: str) -> None:
"""Delete a vector by custom ID."""
+18 -3
View File
@@ -424,10 +424,25 @@ class TestOpenSearchDB(unittest.TestCase):
@patch("mem0.vector_stores.opensearch.logger")
def test_search_error_logs_with_exc_info(self, mock_logger):
"""Search error logging should include exc_info for full stack trace."""
"""Search errors should log with exc_info and re-raise (not swallow as [])."""
self.client_mock.search.side_effect = Exception("Search failed")
results = self.os_db.search(query="", vectors=[[0.1] * 1536], top_k=5)
self.assertEqual(results, [])
with self.assertRaises(Exception):
self.os_db.search(query="", vectors=[[0.1] * 1536], top_k=5)
mock_logger.error.assert_called_once()
call_kwargs = mock_logger.error.call_args
self.assertTrue(call_kwargs[1].get("exc_info"), "logger.error must be called with exc_info=True")
@patch("mem0.vector_stores.opensearch.logger")
def test_keyword_search_error_logs_and_degrades(self, mock_logger):
"""Keyword search errors should log with exc_info and degrade to None (not raise).
keyword_search() is a best-effort augmentation for search(); raising here
would crash the whole search() call on a keyword-only failure (regression
per maintainer review on #6519).
"""
self.client_mock.search.side_effect = Exception("Keyword search failed")
result = self.os_db.keyword_search(query="test", top_k=5)
self.assertIsNone(result)
mock_logger.error.assert_called_once()
call_kwargs = mock_logger.error.call_args
self.assertTrue(call_kwargs[1].get("exc_info"), "logger.error must be called with exc_info=True")