Explode on duplicate delta file names. (#6565)

pull/6590/head
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 os
import re
from collections import Counter
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.
directory_entries = []
for directory in directories:
@ -325,6 +329,9 @@ def _upgrade_existing_database(
_DirectoryListing(file_name, os.path.join(directory, file_name))
for file_name in file_names
)
for file_name in file_names:
file_name_counter[file_name] += 1
except FileNotFoundError:
# Data stores can have empty entries for a given version delta.
pass
@ -333,6 +340,17 @@ def _upgrade_existing_database(
"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
# order (to avoid bugs caused by inconsistent directory listing order)
directory_entries.sort()