1414from celery .canvas import group
1515from django .conf import settings
1616from django .contrib .auth .models import User
17- from django .db import models
17+ from django .db import models , connections
1818from django .db .models import Max
1919from django .db .models .signals import post_delete
2020from django .db .models .signals import post_save
@@ -36,6 +36,20 @@ def log_event(app, msg, level=logging.INFO):
3636 logger .log (level , msg )
3737
3838
39+ def close_db_connections (func , * args , ** kwargs ):
40+ """
41+ Decorator to close db connections during threaded execution
42+
43+ Note this is necessary to work around:
44+ https://code.djangoproject.com/ticket/22420
45+ """
46+ def _inner (* args , ** kwargs ):
47+ func (* args , ** kwargs )
48+ for conn in connections .all ():
49+ conn .close ()
50+ return _inner
51+
52+
3953class AuditedModel (models .Model ):
4054 """Add created and updated fields to a model."""
4155
@@ -290,18 +304,21 @@ def _get_command(self):
290304
291305 _command = property (_get_command )
292306
307+ @close_db_connections
293308 @transition (field = state , source = INITIALIZED , target = CREATED )
294309 def create (self ):
295310 image = self .release .image
296311 c_type = self .type
297312 self ._scheduler .create (self ._job_id , image , self ._command .format (** locals ()))
298313
314+ @close_db_connections
299315 @transition (field = state ,
300316 source = [CREATED , UP , DOWN ],
301317 target = UP , crashed = DOWN )
302318 def start (self ):
303319 self ._scheduler .start (self ._job_id )
304320
321+ @close_db_connections
305322 @transition (field = state ,
306323 source = [INITIALIZED , CREATED , UP , DOWN ],
307324 target = UP ,
@@ -320,10 +337,12 @@ def deploy(self, release):
320337 # destroy old container
321338 self ._scheduler .destroy (old_job_id )
322339
340+ @close_db_connections
323341 @transition (field = state , source = UP , target = DOWN )
324342 def stop (self ):
325343 self ._scheduler .stop (self ._job_id )
326344
345+ @close_db_connections
327346 @transition (field = state ,
328347 source = [INITIALIZED , CREATED , UP , DOWN ],
329348 target = DESTROYED )
0 commit comments