"Remove download" option missing randomly for materialised files/folders in v34.0.0
- Dominant language
- C++
- Stars
- 3.9k
- Forks
- 1k
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 123
Description
### ⚠️ Before submitting, please verify the following: ⚠️
- [x] This is a **bug**, not a question or a configuration issue.
- [x] This issue is **not** already reported on Github (I have searched for it).
- [x] Nextcloud Server and Desktop Client are **up to date**. See [Server Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) and [Desktop Releases](https://nextcloud.com/install/#install-clients) for supported versions.
- [x] I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/)
### Bug description
The “Remove download” context‑menu option is randomly missing in v34.0.0, even when the item is fully materialised and should be eligible for eviction via File Provider.
This prevents freeing local disk space and makes it impossible to remove local copies of certain files or folders. The issue appears intermittently and is not tied to file type, size, or sync state.
This seems related to the new File Provider-only sync model introduced in v34.0.0, where Finder actions depend on macOS’s materialisation state. The state is not reflected correctly in the context menu.
Could be similar-ish to #10085 but it happens on files as well.
File:
Folder:
### Steps to reproduce
1. Install Nextcloud Desktop v34.0.0 on macOS 26.6
2. Sync any folder from the server
3. Right‑click a file or folder → choose “Download now”/"Always keep downloaded" to materialise it
4. Once fully downloaded, right‑click the same item again
5. “Remove Download” option is missing, and sometimes it is present, even for similar items in the same folder
### Expected behavior
The Finder context menu should show the “Remove download” option for any file or folder that is fully materialised, allowing the user to remove the local copy while keeping it in the cloud
### Which files are affected by this bug
Files and folders
### Operating system
macOS
### Which version of the operating system you are running.
macOS Tahoe 26.6 (25G72)
### Installation method
Official Installer for macOS 13 and later
### Nextcloud Server version
34.0.2
### Nextcloud Desktop Client version
34.0.0
### Did this occur after an update or on a clean installation?
Clean desktop client installation
### Are you using the Nextcloud Server Encryption module?
No
### Are you using an external user-backend?
- [x] Default internal user-backend
- [ ] LDAP or Active Directory
- [ ] SSO - SAML
- [ ] Other
### Nextcloud Server logs
```shell
{"reqId":"R5cVWv87dQJ4ZVQgjQle","level":3,"time":"2026-07-29T11:20:46+00:00","remoteAddr":"IPADDRESS","user":"USER","app":"core","method":"MOVE","url":"/remote.php/dav/uploads/USER/web-file-upload-529dc7d130d6676c/.file","scriptName":"/remote.php","message":"More than 1000 expressions in a list are not allowed on Oracle.","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15","version":"34.0.2.1","exception":{"Exception":"Doctrine\\DBAL\\Query\\QueryException","Message":"More than 1000 expressions in a list are not allowed on Oracle.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php","line":256,"function":"prepareForExecute","class":"OC\\DB\\QueryBuilder\\QueryBuilder","type":"->","args":[]},{"file":"/var/www/html/lib/private/FilesMetadata/Service/MetadataRequestService.php","line":117,"function":"executeQuery","class":"OC\\DB\\QueryBuilder\\QueryBuilder","type":"->","args":[]},{"file":"/var/www/html/lib/private/FilesMetadata/FilesMetadataManager.php","line":150,"function":"getMetadataFromFileIds","class":"OC\\FilesMetadata\\Service\\MetadataRequestService","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Service/LivePhotosService.php","line":43,"function":"getMetadataForFiles","class":"OC\\FilesMetadata\\FilesMetadataManager","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php","line":98,"function":"getLivePhotoPeerIds","class":"OCA\\Files\\Service\\LivePhotosService","type":"->","args":[[0,1,2,3,4,"And 1995 more entries, set log level to debug to see all entries"]]},{"file":"/var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php","line":68,"function":"handleCacheEntriesRemovedEvent","class":"OCA\\Files\\Listener\\SyncLivePhotosListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/EventDispatcher/ServiceEventListener.php","line":57,"function":"handle","class":"OCA\\Files\\Listener\\SyncLivePhotosListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php","line":220,"function":"__invoke","class":"OC\\EventDispatcher\\ServiceEventListener","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"},"OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"Symfony\\Component\\EventDispatcher\\EventDispatcher"}]},{"file":"/var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php","line":56,"function":"callListeners","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"->","args":[[{"__class__":"Closure"},{"__class__":"Closure"}],"OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/EventDispatcher/EventDispatcher.php","line":73,"function":"dispatch","class":"Symfony\\Component\\EventDispatcher\\EventDispatcher","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"},"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"]},{"file":"/var/www/html/lib/private/EventDispatcher/EventDispatcher.php","line":86,"function":"dispatch","class":"OC\\EventDispatcher\\EventDispatcher","type":"->","args":["OCP\\Files\\Cache\\CacheEntriesRemovedEvent",{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/Files/Cache/Cache.php","line":669,"function":"dispatchTyped","class":"OC\\EventDispatcher\\EventDispatcher","type":"->","args":[{"__class__":"OCP\\Files\\Cache\\CacheEntriesRemovedEvent"}]},{"file":"/var/www/html/lib/private/Files/Cache/Cache.php","line":581,"function":"removeChildren","class":"OC\\Files\\Cache\\Cache","type":"->","args":[{"__class__":"OC\\Files\\Cache\\CacheEntry"}]},{"file":"/var/www/html/lib/private/Files/Cache/Wrapper/CacheWrapper.php","line":199,"function":"remove","class":"OC\\Files\\Cache\\Cache","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/Cache/Updater.php","line":108,"function":"remove","class":"OC\\Files\\Cache\\Wrapper\\CacheWrapper","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":292,"function":"remove","class":"OC\\Files\\Cache\\Updater","type":"->","args":["uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":1249,"function":"removeUpdate","class":"OC\\Files\\View","type":"->","args":[{"__class__":"OCA\\TermsOfService\\Filesystem\\StorageWrapper","cache":null,"scanner":{"__class__":"OC\\Files\\Cache\\Scanner"},"watcher":null,"propagator":null,"updater":{"__class__":"OC\\Files\\Cache\\Updater"},"mountPoint":"/USER/"},"uploads/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/lib/private/Files/View.php","line":319,"function":"basicOperation","class":"OC\\Files\\View","type":"->","args":["rmdir","/web-file-upload-529dc7d130d6676c",["delete"]]},{"file":"/var/www/html/apps/dav/lib/Connector/Sabre/Directory.php","line":316,"function":"rmdir","class":"OC\\Files\\View","type":"->","args":["/web-file-upload-529dc7d130d6676c"]},{"file":"/var/www/html/apps/dav/lib/Upload/FutureFile.php","line":89,"function":"delete","class":"OCA\\DAV\\Connector\\Sabre\\Directory","type":"->","args":[]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/Tree.php","line":182,"function":"delete","class":"OCA\\DAV\\Upload\\FutureFile","type":"->","args":[]},{"file":"/var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php","line":78,"function":"move","class":"Sabre\\DAV\\Tree","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php","line":60,"function":"performMove","class":"OCA\\DAV\\Upload\\ChunkingPlugin","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"beforeMove","class":"OCA\\DAV\\Upload\\ChunkingPlugin","type":"->","args":["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/CorePlugin.php","line":603,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["beforeMove",["uploads/USER/web-file-upload-529dc7d130d6676c/.file","files/USER/FOLDER/FILE"]]},{"file":"/var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"httpMove","class":"Sabre\\DAV\\CorePlugin","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/3rdparty/sabre/dav/lib/DAV/Server.php","line":472,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["method:MOVE",[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]]},{"file":"/var/www/html/apps/dav/lib/Connector/Sabre/Server.php","line":215,"function":"invokeMethod","class":"Sabre\\DAV\\Server","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/apps/dav/lib/Server.php","line":432,"function":"start","class":"OCA\\DAV\\Connector\\Sabre\\Server","type":"->","args":[]},{"file":"/var/www/html/apps/dav/appinfo/v2/remote.php","line":25,"function":"exec","class":"OCA\\DAV\\Server","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":152,"args":["/var/www/html/apps/dav/appinfo/v2/remote.php"],"function":"require_once"}],"File":"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php","Line":232,"message":"More than 1000 expressions in a list are not allowed on Oracle.","query":"SELECT `file_id`, `json`, `sync_token` FROM `*PREFIX*files_metadata` WHERE `file_id` IN (:dcValue1)","exception":"{\"class\":\"Doctrine\\DBAL\\Query\\QueryException\",\"message\":\"More than 1000 expressions in a list are not allowed on Oracle.\",\"code\":0,\"file\":\"/var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php:232\",\"trace\":\"#0 /var/www/html/lib/private/DB/QueryBuilder/QueryBuilder.php(256): OC\\DB\\QueryBuilder\\QueryBuilder->prepareForExecute()\\n#1 /var/www/html/lib/private/FilesMetadata/Service/MetadataRequestService.php(117): OC\\DB\\QueryBuilder\\QueryBuilder->executeQuery()\\n#2 /var/www/html/lib/private/FilesMetadata/FilesMetadataManager.php(150): OC\\FilesMetadata\\Service\\MetadataRequestService->getMetadataFromFileIds(Array)\\n#3 /var/www/html/apps/files/lib/Service/LivePhotosService.php(43): OC\\FilesMetadata\\FilesMetadataManager->getMetadataForFiles(Array)\\n#4 /var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php(98): OCA\\Files\\Service\\LivePhotosService->getLivePhotoPeerIds(Array)\\n#5 /var/www/html/apps/files/lib/Listener/SyncLivePhotosListener.php(68): OCA\\Files\\Listener\\SyncLivePhotosListener->handleCacheEntriesRemovedEvent(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#6 /var/www/html/lib/private/EventDispatcher/ServiceEventListener.php(57): OCA\\Files\\Listener\\SyncLivePhotosListener->handle(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#7 /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php(220): OC\\EventDispatcher\\ServiceEventListener->__invoke(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent), 'OCP\\\\Files\\\\Cache...', Object(Symfony\\Component\\EventDispatcher\\EventDispatcher))\\n#8 /var/www/html/3rdparty/symfony/event-dispatcher/EventDispatcher.php(56): Symfony\\Component\\EventDispatcher\\EventDispatcher->callListeners(Array, 'OCP\\\\Files\\\\Cache...', Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#9 /var/www/html/lib/private/EventDispatcher/EventDispatcher.php(73): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent), 'OCP\\\\Files\\\\Cache...')\\n#10 /var/www/html/lib/private/EventDispatcher/EventDispatcher.php(86): OC\\EventDispatcher\\EventDispatcher->dispatch('OCP\\\\Files\\\\Cache...', Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#11 /var/www/html/lib/private/Files/Cache/Cache.php(669): OC\\EventDispatcher\\EventDispatcher->dispatchTyped(Object(OCP\\Files\\Cache\\CacheEntriesRemovedEvent))\\n#12 /var/www/html/lib/private/Files/Cache/Cache.php(581): OC\\Files\\Cache\\Cache->removeChildren(Object(OC\\Files\\Cache\\CacheEntry))\\n#13 /var/www/html/lib/private/Files/Cache/Wrapper/CacheWrapper.php(199): OC\\Files\\Cache\\Cache->remove('uploads/web-fil...')\\n#14 /var/www/html/lib/private/Files/Cache/Updater.php(108): OC\\Files\\Cache\\Wrapper\\CacheWrapper->remove('uploads/web-fil...')\\n#15 /var/www/html/lib/private/Files/View.php(292): OC\\Files\\Cache\\Updater->remove('uploads/web-fil...')\\n#16 /var/www/html/lib/private/Files/View.php(1249): OC\\Files\\View->removeUpdate(Object(OCA\\TermsOfService\\Filesystem\\StorageWrapper), 'uploads/web-fil...')\\n#17 /var/www/html/lib/private/Files/View.php(319): OC\\Files\\View->basicOperation('rmdir', '/web-file-uploa...', Array)\\n#18 /var/www/html/apps/dav/lib/Connector/Sabre/Directory.php(316): OC\\Files\\View->rmdir('/web-file-uploa...')\\n#19 /var/www/html/apps/dav/lib/Upload/FutureFile.php(89): OCA\\DAV\\Connector\\Sabre\\Directory->delete()\\n#20 /var/www/html/3rdparty/sabre/dav/lib/DAV/Tree.php(182): OCA\\DAV\\Upload\\FutureFile->delete()\\n#21 /var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php(78): Sabre\\DAV\\Tree->move('uploads/USER/w...', 'files/USER/FOLDER...')\\n#22 /var/www/html/apps/dav/lib/Upload/ChunkingPlugin.php(60): OCA\\DAV\\Upload\\ChunkingPlugin->performMove('uploads/USER/w...', 'files/USER/FOLDER...')\\n#23 /var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php(89): OCA\\DAV\\Upload\\ChunkingPlugin->beforeMove('uploads/USER/w...', 'files/USER/FOLDER...')\\n#24 /var/www/html/3rdparty/sabre/dav/lib/DAV/CorePlugin.php(603): Sabre\\DAV\\Server->emit('beforeMove', Array)\\n#25 /var/www/html/3rdparty/sabre/event/lib/WildcardEmitterTrait.php(89): Sabre\\DAV\\CorePlugin->httpMove(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\\n#26 /var/www/html/3rdparty/sabre/dav/lib/DAV/Server.php(472): Sabre\\DAV\\Server->emit('method:MOVE', Array)\\n#27 /var/www/html/apps/dav/lib/Connector/Sabre/Server.php(215): Sabre\\DAV\\Server->invokeMethod(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\\n#28 /var/www/html/apps/dav/lib/Server.php(432): OCA\\DAV\\Connector\\Sabre\\Server->start()\\n#29 /var/www/html/apps/dav/appinfo/v2/remote.php(25): OCA\\DAV\\Server->exec()\\n#30 /var/www/html/remote.php(152): require_once('/var/www/html/a...')\\n#31 {main}\"}","CustomMessage":"More than 1000 expressions in a list are not allowed on Oracle."}}
```
### Additional info
Happy to share the Desktop client logs if needed!
Really appreciating all the effort you put into the development and maintenance🫰
Contributor guide
Research direction
No desktop source file or test is named. First reproduce the missing Finder “Remove download” action after choosing “Download now” on a fully materialised file and folder, then trace the macOS File Provider context-menu integration. Done means the action appears consistently for eligible materialised items and remains absent when it should not apply.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, macos
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100