単体テストまたは特定の機能の一部として、いくつかの非常に小さな一時ファイルを作成するアプリケーションがあります。「ランダムな」エラーが頻繁に発生するようになりましたOSError: [Errno 27] File too large
. ランダムとは、再起動するか、しばらくしてからテストを再実行すると、問題が解決する場合があることを意味します。Macの一時フォルダーがクリーンアップされ、そのような小さなファイルを作成するのに十分なメモリ/スペースがあることを手動で確認しました. (数 GB が利用可能) このコンテキストでの小さなファイルは、たとえば、サイズが 16384、58330、26502 (バイト単位) またはそれ以下です。Shutil.copyfile はこれらのファイルを作成するために使用されますが、ディスク上で最小限のスペースを取る必要がある os.link を実行したときにも同じエラーが発生します。shutil.copfile (可能な場合) を os.link に置き換えて、問題が解決するかどうかをテストしましたが、効果は同じです。Mac OS では、開発中に多くのテストを集中的に実行したランダムな時間の後に、このエラーがスローされることがよくあります。ただし、docker イメージ内で実行している場合、エラーは常に持続します。
エラーの抜粋:
@pytest.fixture(scope="module")
def simulate_mirror(fixtures):
"""
Thjs fixture creates a file/directory structure that simulates an offline PyPI mirror
Used to test the `mirror://` bandersnatch integration for scanning the whole PyPI repository
"""
from aura import mirror as amirror
with tempfile.TemporaryDirectory(prefix="aura_test_mirror_") as mirror:
pmirror = Path(mirror)
assert pmirror.is_dir()
os.mkdir(pmirror / "json")
for pkg, pkg_files in MIRROR_FILES.items():
# copy the package JSON metadata
os.link(
fixtures.path(f"mirror/{pkg}.json"),
pmirror / "json" / pkg
)
for p in pkg_files:
os.makedirs(pmirror / p["path"])
os.link(
fixtures.path(f"mirror/{p['name']}"),
> os.fspath(pmirror / p["path"] / p["name"])
)
E OSError: [Errno 27] File too large: '/analyzer/tests/files/mirror/wheel-0.34.2-py2.py3-none-any.whl' -> '/tmp/aura_test_mirror_a6o5p8fn/packages/8c/23/848298cccf8e40f5bbb59009b32848a4c38f4e7f3364297ab3c3e2e2cd14/wheel-0.34.2-py2.py3-none-any.whl'
tests/conftest.py:204: OSError
def test_apip():
# Test package taken from pip tests
# https://github.com/pypa/pip/tree/master/tests/data/packages
whl = Path(__file__).parent /'files' / 'simplewheel-1.0-py2.py3-none-any.whl'
venv_dir = tempfile.mkdtemp(suffix="_pytest_aura_apip")
# print(f'Virtualenv created in {venv_dir}')
try:
# Create virtualenv
venv.create(
env_dir=venv_dir,
> with_pip=True,
# symlinks=True
)
tests/test_apip.py:56:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.7/venv/__init__.py:390: in create
builder.create(env_dir)
/usr/local/lib/python3.7/venv/__init__.py:66: in create
self.setup_python(context)
/usr/local/lib/python3.7/venv/__init__.py:233: in setup_python
copier(context.executable, path)
/usr/local/lib/python3.7/venv/__init__.py:176: in symlink_or_copy
shutil.copyfile(src, dst)
/usr/local/lib/python3.7/shutil.py:122: in copyfile
copyfileobj(fsrc, fdst)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
fsrc = <_io.BufferedReader name='/usr/local/bin/python'>, fdst = <_io.BufferedWriter name='/tmp/tmpw5gbckwv_pytest_aura_apip/bin/python'>, length = 16384
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
> fdst.write(buf)
E OSError: [Errno 27] File too large
/usr/local/lib/python3.7/shutil.py:82: OSError
これらのエラーは、を使用して virtualenv を作成するときにスローされることもありvenv.create
ます。また、同じ問題に関連している可能性がある docker イメージ内で、常に sqlite3.OperationalError: disk I/O error を受け取ります。詳細な技術情報: Mac OS Catalina を完全にアップグレードし、brew を介して Python を最新の 3.7.7 に再インストールし、すべての virtualenv を再作成し、すべての依存関係を再インストールしました。他の SO の質問 ( File too Large python ) に基づいて、ファイル システムが制限内のファイル サイズと、ディレクトリで許可される最大ファイル数をサポートしていることを既に確認しました。問題を含む最新のコミット (エラーで失敗する dockerfile を含む):
https://github.com/RootLUG/aura/commit/b4c730693e8f7fd36ab2acc78997694002c4e345
エラーをトリガーするコードの場所:
https://github.com/RootLUG/aura/blob/dev/tests/conftest.py#L181
https://github.com/RootLUG/aura/blob/dev/tests/test_api.py#L54
単体テストからの Travis ログ: