[Bug]: Deck 1.18.2 + notify_push 1.3.3 on NC34 — opening any board returns 404 (dirty table reads in LiveUpdateListener)
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 1.4k
- Forks
- 354
- Avg merge
- 1d 10h
- Merged PRs (30d)
- 43
Description
Describe the bug
After upgrading to Nextcloud 34.0.1, opening any board in Deck returns Request failed with status code 404. The issue only occurs when notify_push is enabled. Disabling notify_push (occ app:disable notify_push) resolves the problem immediately.
To Reproduce
- Have Nextcloud 34.0.1 running with Deck 1.18.2 and notify_push 1.3.3 enabled
- Open Deck from the top navigation menu
- Click on any board
- Frontend immediately returns: Request failed with status code 404
Expected behavior
The board loads normally.
Server details
Operating system: Synology DSM (ARM64)
PHP version: 8.4
Nextcloud version: 34.0.1
Deck version: 1.18.2
notify_push version: 1.3.3
What happens
The request PUT /ocs/v2.php/apps/deck/api/v1.0/session/create fails. The following exception appears in nextcloud.log at level 0 (debug):
Exception: dirty table reads: SELECT `id`, `board_id`, `last_contact`, `user_id`, `token`
FROM `oc_deck_sessions`
WHERE (`board_id` = :dcValue1) AND (`last_contact` > :dcValue2)
Stack trace
SessionController::create()
→ SessionService::initSession()
→ EventDispatcher::dispatchTyped(SessionCreatedEvent)
→ LiveUpdateListener::handle() [LiveUpdateListener.php line 73]
→ SessionService::notifyAllSessions()
→ SessionMapper::findAllActive() [SessionMapper.php line 49-51]
→ QueryBuilder::executeQuery()
→ Exception: dirty table reads [Connection.php line 407]
Root cause analysis
NC34 appears to have tightened enforcement of "dirty table reads" detection (reads outside an active DB transaction). When a user opens a board, LiveUpdateListener fires a SessionCreatedEvent and attempts to notify active sessions via notify_push/Redis. Inside that event handler, SessionMapper::findAllActive() executes a SELECT on oc_deck_sessions outside a transaction. In NC34 this triggers an exception that aborts the entire request, which the frontend receives as a 404.
Workaround
Disabling notify_push resolves the issue:
occ app:disable notify_push
Workaround that does NOT work
occ config:app:set deck disable_push_notifications --value=1
This config key has no effect — the LiveUpdateListener still fires and the exception still occurs.
Suggested fix
The SELECT in SessionMapper::findAllActive() called from LiveUpdateListener should be wrapped in a proper transaction context, or the dirty read check should be explicitly bypassed for this read-only lookup in the event listener.
This issue started after upgrading from Nextcloud 33 to Nextcloud 34.0.1.
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
Read LiveUpdateListener.php around line 73 and SessionMapper.php around lines 49-51, then reproduce the PUT /ocs/v2.php/apps/deck/api/v1.0/session/create request with notify_push enabled. Compare the lookup with transaction patterns in the surrounding session code. Done means opening a Deck board no longer returns 404 and the dirty table reads exception is absent.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php, redis
- Domain
- api, backend, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100