Skip to content

Commit 13e85ee

Browse files
committed
Change to a global client that we close in lifespan
1 parent 2ee850f commit 13e85ee

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

app/backend/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,8 @@ async def setup_clients():
716716
@bp.after_app_serving
717717
async def close_clients():
718718
await current_app.config[CONFIG_SEARCH_CLIENT].close()
719+
await current_app.config[CONFIG_GLOBAL_BLOB_MANAGER].close_clients()
720+
await current_app.config[CONFIG_USER_BLOB_MANAGER].close_clients()
719721

720722

721723
def create_app():

app/backend/prepdocslib/blobmanager.py

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ def __init__(self, endpoint: str, container: str, credential: AsyncTokenCredenti
138138
self.endpoint = endpoint
139139
self.container = container
140140
self.credential = credential
141+
self.file_system_client = FileSystemClient(
142+
account_url=self.endpoint,
143+
file_system_name=self.container,
144+
credential=self.credential,
145+
)
146+
147+
async def close_clients(self):
148+
await self.file_system_client.close()
141149

142150
async def _ensure_directory(self, directory_path: str, user_oid: str) -> DataLakeDirectoryClient:
143151
"""
@@ -148,23 +156,18 @@ async def _ensure_directory(self, directory_path: str, user_oid: str) -> DataLak
148156
directory_path: Full path of directory to create (e.g., 'user123/images/mydoc')
149157
user_oid: The owner to set for all created directories
150158
"""
151-
async with FileSystemClient(
152-
account_url=self.endpoint,
153-
file_system_name=self.container,
154-
credential=self.credential,
155-
) as filesystem_client:
156-
directory_client = filesystem_client.get_directory_client(directory_path)
157-
try:
158-
await directory_client.get_directory_properties()
159-
# Check directory properties to ensure it has the correct owner
160-
props = await directory_client.get_access_control()
161-
if props.get("owner") != user_oid:
162-
raise PermissionError(f"User {user_oid} does not have permission to access {directory_path}")
163-
except ResourceNotFoundError:
164-
logger.info("Creating directory path %s", directory_path)
165-
await directory_client.create_directory()
166-
await directory_client.set_access_control(owner=user_oid)
167-
return directory_client
159+
directory_client = self.file_system_client.get_directory_client(directory_path)
160+
try:
161+
await directory_client.get_directory_properties()
162+
# Check directory properties to ensure it has the correct owner
163+
props = await directory_client.get_access_control()
164+
if props.get("owner") != user_oid:
165+
raise PermissionError(f"User {user_oid} does not have permission to access {directory_path}")
166+
except ResourceNotFoundError:
167+
logger.info("Creating directory path %s", directory_path)
168+
await directory_client.create_directory()
169+
await directory_client.set_access_control(owner=user_oid)
170+
return directory_client
168171

169172
async def upload_blob(self, file: Union[File, IO], filename: str, user_oid: str) -> str:
170173
"""
@@ -390,20 +393,20 @@ def __init__(
390393
self.resource_group = resource_group
391394
self.subscription_id = subscription_id
392395
self.image_container = image_container
396+
self.blob_service_client = BlobServiceClient(
397+
account_url=self.endpoint, credential=self.credential, max_single_put_size=4 * 1024 * 1024
398+
)
399+
400+
async def close_clients(self):
401+
await self.blob_service_client.close()
393402

394403
def get_managedidentity_connectionstring(self):
395404
if not self.account or not self.resource_group or not self.subscription_id:
396405
raise ValueError("Account, resource group, and subscription ID must be set to generate connection string.")
397406
return f"ResourceId=/subscriptions/{self.subscription_id}/resourceGroups/{self.resource_group}/providers/Microsoft.Storage/storageAccounts/{self.account};"
398407

399-
async def _get_service_client(self) -> BlobServiceClient:
400-
return BlobServiceClient(
401-
account_url=self.endpoint, credential=self.credential, max_single_put_size=4 * 1024 * 1024
402-
)
403-
404408
async def upload_blob(self, file: File) -> Optional[list[str]]:
405-
blob_service_client = await self._get_service_client()
406-
container_client = blob_service_client.get_container_client(self.container)
409+
container_client = self.blob_service_client.get_container_client(self.container)
407410
if not await container_client.exists():
408411
await container_client.create_container()
409412

@@ -414,7 +417,6 @@ async def upload_blob(self, file: File) -> Optional[list[str]]:
414417
logger.info("Uploading blob for document '%s'", blob_name)
415418
blob_client = await container_client.upload_blob(blob_name, reopened_file, overwrite=True)
416419
file.url = blob_client.url
417-
blob_service_client.close()
418420

419421
async def upload_document_image(
420422
self,
@@ -432,15 +434,13 @@ async def upload_document_image(
432434
raise ValueError(
433435
"user_oid is not supported for BlobManager. Use AdlsBlobManager for user-specific operations."
434436
)
435-
blob_service_client = await self._get_service_client()
436-
container_client = blob_service_client.get_container_client(self.container)
437+
container_client = self.blob_service_client.get_container_client(self.container)
437438
if not await container_client.exists():
438439
await container_client.create_container()
439440
image_bytes = self.add_image_citation(image_bytes, document_filename, image_filename, image_page_num)
440441
blob_name = f"{self.blob_name_from_file_name(document_filename)}/page{image_page_num}/{image_filename}"
441442
logger.info("Uploading blob for document image '%s'", blob_name)
442443
blob_client = await container_client.upload_blob(blob_name, image_bytes, overwrite=True)
443-
blob_service_client.close()
444444
return blob_client.url
445445

446446
async def download_blob(
@@ -450,8 +450,7 @@ async def download_blob(
450450
raise ValueError(
451451
"user_oid is not supported for BlobManager. Use AdlsBlobManager for user-specific operations."
452452
)
453-
blob_service_client = await self._get_service_client()
454-
container_client = blob_service_client.get_container_client(self.container)
453+
container_client = self.blob_service_client.get_container_client(self.container)
455454
if not await container_client.exists():
456455
return None
457456
if len(blob_path) == 0:
@@ -467,11 +466,9 @@ async def download_blob(
467466
except ResourceNotFoundError:
468467
logger.warning("Blob not found: %s", blob_path)
469468
return None
470-
# TODO: close client properly
471469

472470
async def remove_blob(self, path: Optional[str] = None):
473-
blob_service_client = await self._get_service_client()
474-
container_client = blob_service_client.get_container_client(self.container)
471+
container_client = self.blob_service_client.get_container_client(self.container)
475472
if not await container_client.exists():
476473
return
477474
if path is None:
@@ -489,4 +486,3 @@ async def remove_blob(self, path: Optional[str] = None):
489486
continue
490487
logger.info("Removing blob %s", blob_path)
491488
await container_client.delete_blob(blob_path)
492-
blob_service_client.close()

0 commit comments

Comments
 (0)