From 2a402a067405cecc17d64ed9339c6f63cb6412dc Mon Sep 17 00:00:00 2001 From: shortcutme Date: Tue, 17 Dec 2019 14:18:54 +0100 Subject: [PATCH] Use thread-safe mode to create directories --- plugins/Bigfile/BigfilePlugin.py | 8 ++------ src/Site/SiteStorage.py | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/plugins/Bigfile/BigfilePlugin.py b/plugins/Bigfile/BigfilePlugin.py index e3974ef6..13254df9 100644 --- a/plugins/Bigfile/BigfilePlugin.py +++ b/plugins/Bigfile/BigfilePlugin.py @@ -406,9 +406,7 @@ class SiteStoragePlugin(object): def createSparseFile(self, inner_path, size, sha512=None): file_path = self.getPath(inner_path) - file_dir = os.path.dirname(file_path) - if not os.path.isdir(file_dir): - os.makedirs(file_dir) + self.ensureDir(os.path.dirname(file_path)) f = open(file_path, 'wb') f.truncate(min(1024 * 1024 * 5, size)) # Only pre-allocate up to 5MB @@ -432,9 +430,7 @@ class SiteStoragePlugin(object): file_path = self.getPath(inner_path) # Create dir if not exist - file_dir = os.path.dirname(file_path) - if not os.path.isdir(file_dir): - os.makedirs(file_dir) + self.ensureDir(os.path.dirname(inner_path)) if not os.path.isfile(file_path): file_info = self.site.content_manager.getFileInfo(inner_path) diff --git a/src/Site/SiteStorage.py b/src/Site/SiteStorage.py index 260f6827..f95417dc 100644 --- a/src/Site/SiteStorage.py +++ b/src/Site/SiteStorage.py @@ -3,6 +3,7 @@ import re import shutil import json import time +import errno from collections import defaultdict import sqlite3 @@ -225,13 +226,22 @@ class SiteStorage(object): raise err return res + def ensureDir(self, inner_path): + try: + os.makedirs(self.getPath(inner_path)) + except OSError as err: + if err.errno == errno.EEXIST: + return False + else: + raise err + return True + # Open file object def open(self, inner_path, mode="rb", create_dirs=False, **kwargs): file_path = self.getPath(inner_path) if create_dirs: - file_dir = os.path.dirname(file_path) - if not os.path.isdir(file_dir): - os.makedirs(file_dir) + file_inner_dir = os.path.dirname(inner_path) + self.ensureDir(file_inner_dir) return open(file_path, mode, **kwargs) # Open file object @@ -243,9 +253,7 @@ class SiteStorage(object): def writeThread(self, inner_path, content): file_path = self.getPath(inner_path) # Create dir if not exist - file_dir = os.path.dirname(file_path) - if not os.path.isdir(file_dir): - os.makedirs(file_dir) + self.ensureDir(os.path.dirname(inner_path)) # Write file if hasattr(content, 'read'): # File-like object