Opened 5 years ago

Closed 5 years ago

Last modified 5 years ago

#19918 closed Bug (fixed)

select_for_update runs on db_for_read rather than db_for_write

Reported by: alexandruioan.cucu@… Owned by: Ioan Alexandru Cucu
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


Discussion on the developer group:!topic/django-developers/38gWxf5qfxg

This bug is quite easy to reproduce if you use mysql with a master-slave replication setup and start the slave db with a --read-only flag:

File "/home/kux/workspace/src/other/django/django/core/handlers/" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/kux/workspace/src/other/django/django/contrib/admin/" in wrapper
  366.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/kux/workspace/src/other/django/django/utils/" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/home/kux/workspace/src/other/django/django/views/decorators/" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/home/kux/workspace/src/other/django/django/contrib/admin/" in inner
  196.             return view(request, *args, **kwargs)
File "/home/kux/workspace/src/other/django/django/db/" in inner
  209.                 return func(*args, **kwargs)
File "/home/kux/workspace/src/other/django-cms/cms/admin/" in wrap
  154.             Page.objects.select_for_update()
File "/home/kux/workspace/src/other/django/django/db/models/" in exists
  562.             return self.query.has_results(using=self.db)
File "/home/kux/workspace/src/other/django/django/db/models/sql/" in has_results
  441.         return bool(compiler.execute_sql(SINGLE))
File "/home/kux/workspace/src/other/django/django/db/models/sql/" in execute_sql
  818.         cursor.execute(sql, params)
File "/home/kux/workspace/src/other/django/django/db/backends/" in execute
  40.             return self.cursor.execute(sql, params)
File "/home/kux/workspace/src/other/django/django/db/backends/mysql/" in execute
  114.             return self.cursor.execute(query, args)
File "/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/MySQLdb/" in execute
  174.             self.errorhandler(self, exc, value)
File "/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/MySQLdb/" in defaulterrorhandler
  36.     raise errorclass, errorvalue

Exception Type: DatabaseError at /admin/cms/page/add/
Exception Value: (1290, 'The MySQL server is running with the --read-only option so it cannot execute this statement')

Change History (9)

comment:1 Changed 5 years ago by Ioan Alexandru Cucu

Owner: changed from nobody to Ioan Alexandru Cucu
Status: newassigned

comment:2 Changed 5 years ago by Ioan Alexandru Cucu

For patch see pull request:

comment:3 Changed 5 years ago by Anssi Kääriäinen

Triage Stage: UnreviewedAccepted

comment:4 Changed 5 years ago by Ioan Alexandru Cucu

Triage Stage: AcceptedReady for checkin

comment:5 Changed 5 years ago by Claude Paroz

Triage Stage: Ready for checkinAccepted

Sorry, but the "Ready for checkin" flag should be set by another reviewer, not by the patch author.

comment:6 Changed 5 years ago by anonymous coward

Nifty. I'm glad to see a patch for this. I was having the same issue, and decided to search for an existing ticket before adding excessive bytes to the Interwebz.

comment:7 Changed 5 years ago by anonymous

The fact that the db was running with --read-only flag is a fortunate case. Otherwise this bug would cause subtle concurrency issues since all exclusive locks would be held on the slave db instead of master.

comment:8 Changed 5 years ago by Tim Graham <timograham@…>

Resolution: fixed
Status: assignedclosed

In 1c64a0f29e47a3da1dfac06b04ef84280bd809a7:

Fixed #19918 -- Modified select_for_update to run on the write database.

comment:9 Changed 5 years ago by Tim Graham <timograham@…>

In 80b95a2b1fc8c8425a81a23706af971061dc238f:

[1.6.x] Fixed #19918 -- Modified select_for_update to run on the write database.

Backport of 1c64a0f29e from master

Note: See TracTickets for help on using tickets.
Back to Top