diff --git a/agentex/src/config/mongodb_indexes.py b/agentex/src/config/mongodb_indexes.py index d87231c3..410502ac 100644 --- a/agentex/src/config/mongodb_indexes.py +++ b/agentex/src/config/mongodb_indexes.py @@ -84,12 +84,31 @@ def ensure_mongodb_indexes(mongodb_database: MongoDBDatabase) -> None: logger.info(f" ✓ Created index '{name or result}'") except OperationFailure as e: - # Index might already exist with different options + # Index already exists with different options — drop and recreate if "already exists with different options" in str(e): + index_name = index_spec.get("name", "unnamed") logger.warning( - f" ⚠ Index '{index_spec.get('name', 'unnamed')}' already exists " - f"with different options. You may need to drop and recreate it." + f" ⚠ Index '{index_name}' already exists " + f"with different options. Dropping and recreating..." ) + try: + collection.drop_index(index_name) + logger.info(f" ✓ Dropped existing index '{index_name}'") + except Exception as drop_err: + logger.error( + f" ✗ Failed to drop index '{index_name}': {drop_err}" + ) + continue + + try: + collection.create_index(keys, **index_kwargs) + logger.info(f" ✓ Recreated index '{index_name}'") + except Exception as create_err: + logger.error( + f" ✗ Failed to recreate index '{index_name}' after dropping it: {create_err}. " + f"The index is currently absent. Restart the application or recreate it manually." + ) + raise else: logger.error(f" ✗ Failed to create index: {e}") except Exception as e: diff --git a/agentex/src/domain/repositories/task_message_repository.py b/agentex/src/domain/repositories/task_message_repository.py index 8d5e1e30..92ab9ac2 100644 --- a/agentex/src/domain/repositories/task_message_repository.py +++ b/agentex/src/domain/repositories/task_message_repository.py @@ -19,15 +19,13 @@ class TaskMessageRepository(MongoDBCRUDRepository[TaskMessageEntity]): # These will be created once at startup, not per request INDEXES = [ { - "keys": [("task_id", pymongo.ASCENDING), ("created_at", pymongo.ASCENDING)], + "keys": [ + ("task_id", pymongo.ASCENDING), + ("created_at", pymongo.DESCENDING), + ], "name": "task_id_created_at_idx", "description": "Compound index for querying messages by task_id and sorting by created_at", }, - { - "keys": [("task_id", pymongo.ASCENDING)], - "name": "task_id_idx", - "description": "Single index for task_id queries and delete operations", - }, { "keys": [ ("task_id", pymongo.ASCENDING), @@ -40,7 +38,7 @@ class TaskMessageRepository(MongoDBCRUDRepository[TaskMessageEntity]): "keys": [ ("task_id", pymongo.ASCENDING), ("content.type", pymongo.ASCENDING), - ("created_at", pymongo.ASCENDING), + ("created_at", pymongo.DESCENDING), ], "name": "task_id_content_type_created_at_idx", "description": "Compound index for filtering messages by task_id, content type, and sorting by created_at", diff --git a/agentex/src/domain/repositories/task_state_repository.py b/agentex/src/domain/repositories/task_state_repository.py index 16e43147..d2dab1ae 100644 --- a/agentex/src/domain/repositories/task_state_repository.py +++ b/agentex/src/domain/repositories/task_state_repository.py @@ -21,12 +21,8 @@ class TaskStateRepository(MongoDBCRUDRepository[StateEntity]): { "keys": [("task_id", pymongo.ASCENDING), ("agent_id", pymongo.ASCENDING)], "name": "task_agent_compound_idx", - "description": "Compound index for get_by_task_and_agent queries", - }, - { - "keys": [("task_id", pymongo.ASCENDING)], - "name": "task_id_idx", - "description": "Single index for task_id queries", + "unique": True, + "description": "Unique compound index for get_by_task_and_agent queries", }, { "keys": [("agent_id", pymongo.ASCENDING)],