Skip to content

Commit

Permalink
Merge pull request #1557 from dandi/agg-summary-race-condition
Browse files Browse the repository at this point in the history
  • Loading branch information
danlamanna authored Dec 5, 2023
2 parents 8841600 + bb07358 commit 61a35a3
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
10 changes: 7 additions & 3 deletions dandiapi/api/services/metadata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,20 @@ def version_aggregate_assets_summary(version: Version) -> None:
if version.version != 'draft':
raise VersionHasBeenPublishedError

version.metadata['assetsSummary'] = aggregate_assets_summary(
assets_summary = aggregate_assets_summary(
asset.full_metadata
for asset in version.assets.filter(status=Asset.Status.VALID)
.select_related('blob', 'zarr')
.iterator()
)

Version.objects.filter(id=version.id, version='draft').update(
modified=timezone.now(), metadata=version.metadata
updated_metadata = {**version.metadata, **{'assetsSummary': assets_summary}}

updated_count = Version.objects.filter(id=version.id, metadata=version.metadata).update(
modified=timezone.now(), metadata=updated_metadata
)
if updated_count == 0:
logger.info(f'Skipped updating assetsSummary for version {version.id}')


def validate_version_metadata(*, version: Version) -> None:
Expand Down
15 changes: 15 additions & 0 deletions dandiapi/api/tests/test_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ def test_version_aggregate_assets_summary_valid_assets(draft_version, draft_asse
invalid_asset = draft_asset_factory(status=Asset.Status.INVALID)
draft_version.assets.add(valid_asset, invalid_asset)
version_aggregate_assets_summary(draft_version)
draft_version.refresh_from_db()
assert draft_version.metadata['assetsSummary']['numberOfFiles'] == 1


Expand Down Expand Up @@ -344,6 +345,20 @@ def test_version_publish_version(draft_version, asset):
}


@pytest.mark.django_db()
def test_version_aggregate_assets_summary(draft_version_factory, draft_asset_factory):
version = draft_version_factory(status=Version.Status.VALID)
asset = draft_asset_factory(status=Asset.Status.VALID)
version.assets.add(asset)

version_aggregate_assets_summary(version)
version.refresh_from_db()

assert version.metadata['assetsSummary']['numberOfBytes'] == asset.blob.size
assert version.metadata['assetsSummary']['numberOfFiles'] == 1
assert version.metadata['assetsSummary']['schemaKey'] == 'AssetsSummary'


@pytest.mark.django_db()
def test_version_size(
version,
Expand Down

0 comments on commit 61a35a3

Please sign in to comment.