Katello repository sync with file:// url deletes source packages

Problem:
If I define a repository that uses a file based url - eg:

file:///var/repos/my-custom-rpms

When I perform a repository sync in Katello, the sync will fail if the packages are not owned by the pulp user:

Nov 22 18:32:09 katello pulpcore-worker-3[4872]: pulp [493a951f-336e-47c9-ab9e-8b21772a023d]: pulpcore.tasking.tasks:INFO: Task 018bf84d-3174-7baf-9b2d-ee98a85f83eb failed ([Errno 13] Permission denied: '/var/repos/my-custom-rpms/Pack
ages/l/localapp-1.0-12.el8.noarch.rpm')
Nov 22 18:32:09 katello pulpcore-worker-3[4872]: pulp [493a951f-336e-47c9-ab9e-8b21772a023d]: pulpcore.tasking.tasks:INFO:   File "/usr/lib/python3.9/site-packages/pulpcore/tasking/tasks.py", line 66, in _execute_task
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    result = func(*args, **kwargs)
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/pulp_rpm/app/tasks/synchronizing.py", line 565, in synchronize
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    repo_version = dv.create() or repo.latest_version()
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/pulpcore/plugin/stages/declarative_version.py", line 161, in create
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    loop.run_until_complete(pipeline)
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib64/python3.9/asyncio/base_events.py", line 647, in run_until_complete
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    return future.result()
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/pulpcore/plugin/stages/api.py", line 220, in create_pipeline
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    await asyncio.gather(*futures)
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/pulpcore/plugin/stages/api.py", line 41, in __call__
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    await self.run()
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/pulpcore/plugin/stages/artifact_stages.py", line 291, in run
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    await aos.remove(tmp_file_path)
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib/python3.9/site-packages/aiofiles/os.py", line 13, in run
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    return await loop.run_in_executor(executor, pfunc)
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:  File "/usr/lib64/python3.9/concurrent/futures/thread.py", line 58, in run
Nov 22 18:32:09 katello pulpcore-worker-3[4872]:    result = self.fn(*self.args, **self.kwargs)

If I change ownership on the files (chown -R pulp:pulp *) the reposync succeeds but the source rpms are removed as part of the sync

Expected outcome:
Repo sync succeeds, but source file based repository is left untouched (no packages removed)

Foreman and Proxy versions:
Foreman 3.8 / Katello 4.10

Foreman and Proxy plugin versions:

* candlepin-4.3.1-1.el8.noarch
* candlepin-selinux-4.3.1-1.el8.noarch
* foreman-3.8.0-1.el8.noarch
* foreman-cli-3.8.0-1.el8.noarch
* foreman-debug-3.8.0-1.el8.noarch
* foreman-dynflow-sidekiq-3.8.0-1.el8.noarch
* foreman-installer-3.8.0-2.el8.noarch
* foreman-installer-katello-3.8.0-2.el8.noarch
* foreman-postgresql-3.8.0-1.el8.noarch
* foreman-proxy-3.8.0-1.el8.noarch
* foreman-release-3.8.0-1.el8.noarch
* foreman-selinux-3.8.0-1.el8.noarch
* foreman-service-3.8.0-1.el8.noarch
* katello-4.10.0-1.el8.noarch
* katello-certs-tools-2.9.0-2.el8.noarch
* katello-client-bootstrap-1.7.9-2.el8.noarch
* katello-common-4.10.0-1.el8.noarch
* katello-debug-4.10.0-1.el8.noarch
* katello-repos-4.10.0-1.el8.noarch
* katello-selinux-5.0.2-1.el8.noarch
* pulpcore-selinux-1.3.3-1.el8.x86_64
* python39-pulp-ansible-0.18.1-1.el8.noarch
* python39-pulp-certguard-1.6.5-1.el8.noarch
* python39-pulp-cli-0.21.2-1.el8.noarch
* python39-pulp-container-2.15.2-1.el8.noarch
* python39-pulp-deb-3.0.0-1.el8.noarch
* python39-pulp-file-1.14.3-1.el8.noarch
* python39-pulp-glue-0.21.2-1.el8.noarch
* python39-pulp-python-3.10.0-1.el8.noarch
* python39-pulp-rpm-3.22.6-1.el8.noarch
* python39-pulpcore-3.28.19-1.el8.noarch
* rubygem-foreman-tasks-8.2.1-1.fm3_8.el8.noarch
* rubygem-foreman_maintain-1.3.5-1.el8.noarch
* rubygem-foreman_puppet-6.0.1-1.fm3_8.el8.noarch
* rubygem-foreman_remote_execution-11.1.0-1.fm3_8.el8.noarch
* rubygem-hammer_cli-3.8.0-1.el8.noarch
* rubygem-hammer_cli_foreman-3.8.0-1.el8.noarch
* rubygem-hammer_cli_foreman_puppet-0.0.6-1.fm3_4.el8.noarch
* rubygem-hammer_cli_foreman_remote_execution-0.2.3-1.fm3_7.el8.noarch
* rubygem-hammer_cli_foreman_tasks-0.0.19-1.fm3_7.el8.noarch
* rubygem-hammer_cli_katello-1.11.0-0.1.pre.master.20230905173948git1fa5f0c.el8.noarch
* rubygem-katello-4.10.0-1.el8.noarch
* rubygem-pulp_ansible_client-0.18.0-1.el8.noarch
* rubygem-pulp_certguard_client-1.6.5-1.el8.noarch
* rubygem-pulp_container_client-2.15.2-1.el8.noarch
* rubygem-pulp_deb_client-3.0.0-1.el8.noarch
* rubygem-pulp_file_client-1.14.3-1.el8.noarch
* rubygem-pulp_ostree_client-2.1.1-1.el8.noarch
* rubygem-pulp_python_client-3.10.0-1.el8.noarch
* rubygem-pulp_rpm_client-3.22.3-1.el8.noarch
* rubygem-pulpcore_client-3.28.11-1.el8.noarch
* rubygem-smart_proxy_pulp-3.2.0-3.fm3_3.el8.noarch

Distribution and version:
Red Hat Enterprise Linux release 8.9 (Ootpa)

Other relevant data:

Forgot to mention, in the example above the foreman-installer was called with the following option: --foreman-proxy-content-pulpcore-additional-import-paths /var/repos

I guess this may clear it up: Katello 4.10 During Sync of Local Repository, Katello Removes Local RPM File

Ah - many thanks, I did search for similar posts but didn’t spot that one. I’ll wait for the fix to roll out.