Nextcloud File Locking gets out of sync
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 738
- Forks
- 162
- Avg merge
- 6h 2m
- Merged PRs (30d)
- 35
Description
Sometimes the nextcloud android app break and fails to sync a note. Only opening the file in the browser and closing it again resolves it
Steps to reproduce
This issue is not 100% reproducible every time, but I found it using that way:
- Use Android app to edit notes
- Edit the file with the website again (after closing the android app)
- Use the Android app again to edit again
Expected behaviour
The app syncs fine
Actual behaviour
The Server logs an error (attached below)
And the notes app shows an error that is not able to sync. Only if you go to the website, open and close the note, the sync works again
Server
- Notes app version: 6.0.1
- Nextcloud version: 34.0.1
- OS: Debian/LXC
- Web server: apache2 2.4.68-1~deb13u1
- PHP version: 8.4.23
- Database: mariadb
Nextcloud is ran behind an apache proxy server
Client
- Browser (incl. version): Firefox ESR 140.12.0
- OS: Debian Trixie with Wayland
The other Client is Android 16 using the latest available version of the notes android app
Log files
{
"reqId": "REDACTED",
"level": 3,
"time": "2026-07-17T04:12:11+00:00",
"remoteAddr": "REDACTED",
"user": "REDACTED",
"app": "notes",
"method": "PUT",
"url": "/index.php/apps/notes/api/v1/notes/23228?",
"scriptName": "/index.php",
"message": "Controller failed with OCP\\Lock\\ManuallyLockedException",
"userAgent": "Mozilla/5.0 (Android) Nextcloud-android/34.0.1",
"version": "34.0.1.2",
"exception": {
"Exception": "OCP\\Lock\\ManuallyLockedException",
"Message": "\"files/Notizen/Privat/Todo.md\" is locked, existing lock on file: files_lock/1ed743bc-1034-40ef-9711-3a5ab33e994c",
"Code": 0,
"Trace": [
{
"file": "/var/www/nextcloud/apps/files_lock/lib/Storage/LockWrapper.php",
"line": 213,
"function": "checkPermissions",
"class": "OCA\\FilesLock\\Storage\\LockWrapper",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/Files/Storage/Wrapper/Wrapper.php",
"line": 150,
"function": "file_put_contents",
"class": "OCA\\FilesLock\\Storage\\LockWrapper",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/Files/View.php",
"line": 1235,
"function": "file_put_contents",
"class": "OC\\Files\\Storage\\Wrapper\\Wrapper",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/Files/View.php",
"line": 680,
"function": "basicOperation",
"class": "OC\\Files\\View",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/Files/Node/File.php",
"line": 56,
"function": "file_put_contents",
"class": "OC\\Files\\View",
"type": "->"
},
{
"file": "/var/www/nextcloud/apps/notes/lib/Service/Note.php",
"line": 174,
"function": "putContent",
"class": "OC\\Files\\Node\\File",
"type": "->"
},
{
"file": "/var/www/nextcloud/apps/notes/lib/Controller/NotesApiController.php",
"line": 174,
"function": "setContent",
"class": "OCA\\Notes\\Service\\Note",
"type": "->"
},
{
"file": "/var/www/nextcloud/apps/notes/lib/Service/Util.php",
"line": 25,
"function": "{closure:OCA\\Notes\\Controller\\NotesApiController::update():164}",
"class": "OCA\\Notes\\Controller\\NotesApiController",
"type": "->",
"args": [
"*** sensitive parameters replaced ***"
]
},
{
"file": "/var/www/nextcloud/apps/notes/lib/Controller/Helper.php",
"line": 135,
"function": "retryIfLocked",
"class": "OCA\\Notes\\Service\\Util",
"type": "::"
},
{
"file": "/var/www/nextcloud/apps/notes/lib/Controller/NotesApiController.php",
"line": 164,
"function": "handleErrorResponse",
"class": "OCA\\Notes\\Controller\\Helper",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php",
"line": 165,
"function": "update",
"class": "OCA\\Notes\\Controller\\NotesApiController",
"type": "->",
"args": [
"*** sensitive parameters replaced ***"
]
},
{
"file": "/var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php",
"line": 78,
"function": "executeController",
"class": "OC\\AppFramework\\Http\\Dispatcher",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/AppFramework/App.php",
"line": 137,
"function": "dispatch",
"class": "OC\\AppFramework\\Http\\Dispatcher",
"type": "->"
},
{
"file": "/var/www/nextcloud/lib/private/Route/Router.php",
"line": 324,
"function": "main",
"class": "OC\\AppFramework\\App",
"type": "::"
},
{
"file": "/var/www/nextcloud/lib/base.php",
"line": 1159,
"function": "match",
"class": "OC\\Route\\Router",
"type": "->"
},
{
"file": "/var/www/nextcloud/index.php",
"line": 25,
"function": "handleRequest",
"class": "OC",
"type": "::"
}
],
"File": "/var/www/nextcloud/apps/files_lock/lib/Storage/LockWrapper.php",
"Line": 82,
"message": "Controller failed with OCP\\Lock\\ManuallyLockedException",
"exception": "{\"class\":\"OCP\\Lock\\ManuallyLockedException\",\"message\":\"\\\"files/Notizen/Privat/Todo.md\\\" is locked, existing lock on file: files_lock/1ed743bc-1034-40ef-9711-3a5ab33e994c\",\"code\":0,\"file\":\"/var/www/nextcloud/apps/files_lock/lib/Storage/LockWrapper.php:82\",\"trace\":\"#0 /var/www/nextcloud/apps/files_lock/lib/Storage/LockWrapper.php(213): OCA\\FilesLock\\Storage\\LockWrapper->checkPermissions()\\n#1 /var/www/nextcloud/lib/private/Files/Storage/Wrapper/Wrapper.php(150): OCA\\FilesLock\\Storage\\LockWrapper->file_put_contents()\\n#2 /var/www/nextcloud/lib/private/Files/View.php(1235): OC\\Files\\Storage\\Wrapper\\Wrapper->file_put_contents()\\n#3 /var/www/nextcloud/lib/private/Files/View.php(680): OC\\Files\\View->basicOperation()\\n#4 /var/www/nextcloud/lib/private/Files/Node/File.php(56): OC\\Files\\View->file_put_contents()\\n#5 /var/www/nextcloud/apps/notes/lib/Service/Note.php(174): OC\\Files\\Node\\File->putContent()\\n#6 /var/www/nextcloud/apps/notes/lib/Controller/NotesApiController.php(174): OCA\\Notes\\Service\\Note->setContent()\\n#7 /var/www/nextcloud/apps/notes/lib/Service/Util.php(25): OCA\\Notes\\Controller\\NotesApiController->{closure:OCA\\Notes\\Controller\\NotesApiController::update():164}()\\n#8 /var/www/nextcloud/apps/notes/lib/Controller/Helper.php(135): OCA\\Notes\\Service\\Util::retryIfLocked()\\n#9 /var/www/nextcloud/apps/notes/lib/Controller/NotesApiController.php(164): OCA\\Notes\\Controller\\Helper->handleErrorResponse()\\n#10 /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php(165): OCA\\Notes\\Controller\\NotesApiController->update()\\n#11 /var/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php(78): OC\\AppFramework\\Http\\Dispatcher->executeController()\\n#12 /var/www/nextcloud/lib/private/AppFramework/App.php(137): OC\\AppFramework\\Http\\Dispatcher->dispatch()\\n#13 /var/www/nextcloud/lib/private/Route/Router.php(324): OC\\AppFramework\\App::main()\\n#14 /var/www/nextcloud/lib/base.php(1159): OC\\Route\\Router->match()\\n#15 /var/www/nextcloud/index.php(25): OC::handleRequest()\\n#16 {main}\"}",
"CustomMessage": "Controller failed with OCP\\Lock\\ManuallyLockedException"
},
"id": "REDACTED"
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with apps/notes/lib/Service/Note.php around line 174 and apps/notes/lib/Controller/NotesApiController.php around lines 164-174, then trace the lock handling through apps/notes/lib/Service/Util.php and lib/Controller/Helper.php. Reproduce the Android/browser editing sequence and inspect the files_lock LockWrapper trace. Done means the note can sync after alternating clients without the file remaining blocked or producing ManuallyLockedException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, php
- Domain
- backend, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100