0

単体テストまたは特定の機能の一部として、いくつかの非常に小さな一時ファイルを作成するアプリケーションがあります。「ランダムな」エラーが頻繁に発生するようになりました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 ログ:

https://travis-ci.org/github/RootLUG/aura/builds/671722230

4

1 に答える 1