nextcloud / nextcloud/notes

Nextcloud File Locking gets out of sync

Open
#1,940 11 comments 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug need to reproduce
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:

  1. Use Android app to edit notes
  2. Edit the file with the website again (after closing the android app)
  3. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.