forked from MirrorHub/synapse
Explode on duplicate delta file names. (#6565)
This commit is contained in:
parent
3d46124ad0
commit
0b5dbadd96
2 changed files with 19 additions and 0 deletions
1
changelog.d/6565.misc
Normal file
1
changelog.d/6565.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Add assertion that schema delta file names are unique.
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue