Fix disk I/O error when resetting short-term memory. (#1724)

* Fix disk I/O error when resetting short-term memory.

Reset chromadb client and nullifies references before
removing directory.

* Nit for clarity

* did the same for knowledge_storage

* cleanup

* cleanup order

* Cleanup after the rm of the directories

---------

Co-authored-by: Lorenze Jay <lorenzejaytech@gmail.com>
Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com>
This commit is contained in:
Carlos Souza
2024-12-09 13:30:51 -05:00
committed by GitHub
parent c4f7eaf259
commit 6b87d22a70
2 changed files with 12 additions and 6 deletions

View File

@@ -3,6 +3,7 @@ import hashlib
import io import io
import logging import logging
import os import os
import shutil
from typing import Any, Dict, List, Optional, Union, cast from typing import Any, Dict, List, Optional, Union, cast
import chromadb import chromadb
@@ -15,6 +16,7 @@ from crewai.knowledge.storage.base_knowledge_storage import BaseKnowledgeStorage
from crewai.utilities import EmbeddingConfigurator from crewai.utilities import EmbeddingConfigurator
from crewai.utilities.logger import Logger from crewai.utilities.logger import Logger
from crewai.utilities.paths import db_storage_path from crewai.utilities.paths import db_storage_path
from crewai.utilities.constants import KNOWLEDGE_DIRECTORY
@contextlib.contextmanager @contextlib.contextmanager
@@ -105,15 +107,17 @@ class KnowledgeStorage(BaseKnowledgeStorage):
raise Exception("Failed to create or get collection") raise Exception("Failed to create or get collection")
def reset(self): def reset(self):
if self.app: base_path = os.path.join(db_storage_path(), KNOWLEDGE_DIRECTORY)
self.app.reset() if not self.app:
else:
base_path = os.path.join(db_storage_path(), "knowledge")
self.app = chromadb.PersistentClient( self.app = chromadb.PersistentClient(
path=base_path, path=base_path,
settings=Settings(allow_reset=True), settings=Settings(allow_reset=True),
) )
self.app.reset()
self.app.reset()
shutil.rmtree(base_path)
self.app = None
self.collection = None
def save( def save(
self, self,

View File

@@ -150,9 +150,11 @@ class RAGStorage(BaseRAGStorage):
def reset(self) -> None: def reset(self) -> None:
try: try:
shutil.rmtree(f"{db_storage_path()}/{self.type}")
if self.app: if self.app:
self.app.reset() self.app.reset()
shutil.rmtree(f"{db_storage_path()}/{self.type}")
self.app = None
self.collection = None
except Exception as e: except Exception as e:
if "attempt to write a readonly database" in str(e): if "attempt to write a readonly database" in str(e):
# Ignore this specific error # Ignore this specific error