Opened 13 years ago
Closed 12 years ago
#19511 closed Bug (invalid)
Thread safe bound method weakrefs
| Reported by: | German M. Bravo | Owned by: | nobody |
|---|---|---|---|
| Component: | Core (Other) | Version: | 1.4 |
| Severity: | Normal | Keywords: | |
| Cc: | German M. Bravo | Triage Stage: | Accepted |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I'm often getting this traceback:
AttributeError: 'BoundMethodWeakref' object has no attribute 'deletionMethods'
Stacktrace (most recent call last):
File "django/core/handlers/base.py", line 119, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "posts/views.py", line 404, in get
posts_post.save()
File "django/db/models/base.py", line 475, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "django/db/models/base.py", line 506, in save_base
signals.pre_save.send(sender=origin, instance=self, raw=raw, using=using)
File "django/dispatch/dispatcher.py", line 183, in send
response = receiver(signal=self, sender=sender, **named)
File "haystack/models.py", line 268, in load_indexes
ui.setup_indexes()
File "haystack/utils/loading.py", line 283, in setup_indexes
index._setup_save()
File "celery_haystack/indexes.py", line 33, in _setup_save
signals.post_save.connect(self._enqueue_save, sender=model, dispatch_uid=CelerySearchIndex)
File "django/dispatch/dispatcher.py", line 105, in connect
receiver = saferef.safeRef(receiver, onDelete=self._remove_receiver)
File "django/dispatch/saferef.py", line 29, in safeRef
onDelete=onDelete
File "django/dispatch/saferef.py", line 248, in get_bound_method_weakref
return BoundMethodWeakref(target=target, onDelete=onDelete)
File "django/dispatch/saferef.py", line 88, in __new__
current.deletionMethods.append( onDelete)
I suspect this has something to do with the threading environment I'm using. I'm attaching a patch that I believe fixes the issue.
Attachments (2)
Change History (9)
by , 13 years ago
| Attachment: | #19510-thread_safe_template_cache.diff added |
|---|
comment:1 by , 13 years ago
| Cc: | added |
|---|
comment:2 by , 13 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
comment:3 by , 13 years ago
| Resolution: | fixed |
|---|---|
| Status: | closed → new |
Wth did the resolution get set to fixed :/
comment:4 by , 13 years ago
| Resolution: | → needsinfo |
|---|---|
| Status: | new → closed |
This may be a valid issue, but the description doesn't include enough information to reproduce it and the wrong patch was attached.
by , 13 years ago
| Attachment: | #19511-thread_safe_bound_method_weakref.diff added |
|---|
comment:5 by , 13 years ago
| Resolution: | needsinfo |
|---|---|
| Status: | closed → new |
Sorry I attached the wrong file, I've just attached the correct one.
The problem seems to be the BoundMethodWeakref._allInstances is filled with an uninitialised object, and when/if another thread tries to get and use the object, it doesn't still have at least the deletionMethods attribute which is added durin the call to __init__().
comment:6 by , 13 years ago
| Component: | Uncategorized → Core (Other) |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
The explanation seems correct to me. It also seems this will be impossible to test. You will need to switch to another thread in between the dict assignment and the __init__() call, and then you need to access the same key in another thread. An unlikely scenario.
comment:7 by , 12 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
Our implementation of weakrefs has now gone in favour of (backported) code from python 3.4. This should hopefully no longer be an issue.
Did you attach the wrong patch here?