Explode on duplicate delta file names. (#6565)

This commit is contained in:
Erik Johnston 2019-12-19 15:07:37 +00:00 committed by GitHub
parent 3d46124ad0
commit 0b5dbadd96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 0 deletions

1
changelog.d/6565.misc Normal file
View File

@ -0,0 +1 @@
Add assertion that schema delta file names are unique.

View File

@ -18,6 +18,7 @@ import imp
import logging import logging
import os import os
import re import re
from collections import Counter
import attr import attr
@ -315,6 +316,9 @@ def _upgrade_existing_database(
) )
) )
# Used to check if we have any duplicate file names
file_name_counter = Counter()
# Now find which directories have anything of interest. # Now find which directories have anything of interest.
directory_entries = [] directory_entries = []
for directory in directories: for directory in directories:
@ -325,6 +329,9 @@ def _upgrade_existing_database(
_DirectoryListing(file_name, os.path.join(directory, file_name)) _DirectoryListing(file_name, os.path.join(directory, file_name))
for file_name in file_names for file_name in file_names
) )
for file_name in file_names:
file_name_counter[file_name] += 1
except FileNotFoundError: except FileNotFoundError:
# Data stores can have empty entries for a given version delta. # Data stores can have empty entries for a given version delta.
pass pass
@ -333,6 +340,17 @@ def _upgrade_existing_database(
"Could not open delta dir for version %d: %s" % (v, directory) "Could not open delta dir for version %d: %s" % (v, directory)
) )
duplicates = set(
file_name for file_name, count in file_name_counter.items() if count > 1
)
if duplicates:
# We don't support using the same file name in the same delta version.
raise PrepareDatabaseException(
"Found multiple delta files with the same name in v%d: %s",
v,
duplicates,
)
# We sort to ensure that we apply the delta files in a consistent # We sort to ensure that we apply the delta files in a consistent
# order (to avoid bugs caused by inconsistent directory listing order) # order (to avoid bugs caused by inconsistent directory listing order)
directory_entries.sort() directory_entries.sort()