Task #8858 (closed)
Opened 12 years ago
Closed 12 years ago
Blitz getDetails.__init__()
Reported by: | wmoore | Owned by: | cneves |
---|---|---|---|
Priority: | critical | Milestone: | OMERO-4.4 |
Component: | OmeroPy | Version: | n.a. |
Keywords: | n.a. | Cc: | python-team@… |
Resources: | n.a. | Referenced By: | n.a. |
References: | n.a. | Remaining Time: | n.a. |
Sprint: | 2012-07-03 (18) |
Description
I just got a stack trace (see below) when calling getDetails() on a TagAnnotationLinkWrapper? because the wrapper had been passed a Tag instead of conn in it's constructor. #8828.
This is easily fixed! However, it illustrated unnecessary loading of details.owner when calling getDetails().
I call getDetails().getPermissions().canDelete() OR canAnnotate() OR canEdit() etc many times with the new permissions rules and to do this, I DON'T need to load the owner or group of the details in order to do this, so the DetailsWrapper? doesn't need to load them:
def __init__ (self, *args, **kwargs): super(DetailsWrapper, self).__init__ (*args, **kwargs) owner = self._obj.getOwner() group = self._obj.getGroup() self._owner = owner and ExperimenterWrapper(self._conn, self._obj.getOwner()) or None self._group = group and ExperimenterGroupWrapper(self._conn, self._obj.getGroup()) or None
I *could* fix my initial bug by commenting out the line # self._owner = ... since I can call getDetails().getPermissions().canDelete() without needing the details._owner.
Is it possible to leave these unloaded during DetailsWrapper?.init() and only load them if we need them?
My original stack trace below:
Traceback: File "/Users/will/Desktop/OMERO/dist/lib/python/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) File "/Users/will/Desktop/OMERO/components/tools/OmeroWeb/omeroweb/../omeroweb/decorators.py" in wrapped 311. retval = f(request, *args, **kwargs) File "/Users/will/Desktop/OMERO/components/tools/OmeroWeb/omeroweb/../omeroweb/decorators.py" in wrapper 345. context = f(request, *args, **kwargs) File "/Users/will/Desktop/OMERO/components/tools/OmeroWeb/omeroweb/../omeroweb/webclient/views.py" in manage_action_containers 1386. manager.remove(parent) File "/Users/will/Desktop/OMERO/components/tools/OmeroWeb/omeroweb/../omeroweb/webclient/controller/container.py" in remove 873. print "al", al.canDelete() File "/Users/will/Desktop/OMERO/dist/lib/python/omero/gateway/__init__.py" in canDelete 513. return self.getDetails().getPermissions().canDelete() File "/Users/will/Desktop/OMERO/dist/lib/python/omero/gateway/__init__.py" in getDetails 311. return omero.gateway.DetailsWrapper (self._conn, self._obj.getDetails()) File "/Users/will/Desktop/OMERO/dist/lib/python/omero/gateway/__init__.py" in __init__ 4348. self._owner = owner and ExperimenterWrapper(self._conn, self._obj.getOwner()) or None File "/Users/will/Desktop/OMERO/dist/lib/python/omero/gateway/__init__.py" in __init__ 166. self._obj = self._conn.getQueryService().get(self._obj.__class__.__name__, self._oid, self._conn.CONFIG['SERVICE_OPTS']) File "/Users/will/Desktop/OMERO/dist/lib/python/omero/gateway/__init__.py" in __getattr__ 1102. raise AttributeError("'%s' object has no attribute '%s'" % (self._obj.__class__.__name__, attr)) Exception Type: AttributeError at /webclient/action/remove/tag/104/ Exception Value: 'TagAnnotationI' object has no attribute 'getQueryService'
Change History (7)
comment:1 Changed 12 years ago by wmoore
comment:2 Changed 12 years ago by jmoore
- Priority changed from major to critical
comment:3 Changed 12 years ago by jmoore
- Cc python-team@… added; atarkowska cxallan removed
- Sprint set to 2012-06-19 (17)
comment:4 Changed 12 years ago by atarkowska
Referring to the conversation on devteam chat about #8988.
File "/home/omero/slave/workspace/OMERO-merge-green/src/dist/lib/python/omero/gateway/__init__.py", line 1148, in getOwner return self.getDetails().getOwner() AttributeError: 'NoneType' object has no attribute 'getOwner'
There is a chance that client side proxy object might not exist in database any more, but reference is still in place (like deleted image still kept in share). In that edge case object look like:
object #0 (::omero::model::Image) { _id = object #1 (::omero::RLong) { _val = 107 } _details = <nil> _loaded = False _version = <nil> ... }
As there is no such object any more, because exception is valid. That could be potentially fixed by throwing different exception like ObjectDoesNotExist?.
comment:5 Changed 12 years ago by jburel
- Sprint changed from 2012-06-19 (17) to 2012-07-03 (18)
Moved from sprint 2012-06-19 (17)
comment:6 Changed 12 years ago by wmoore
Josh:
re: the recent slowness on loading web, I know I have a crazy number of groups but
~/git/dist $ grep -E "2012-06-29 10:0[789]" var/log/Blitz-0.log | grep -E "(Meth|Rslt)" | cut -f4 -d: | sort | uniq -c 7331 interface ome.api.IQuery.findByQuery 58617 interface ome.api.IQuery.get 29309 ome.model.meta.Experimenter 36638 ome.model.meta.ExperimenterGroup In the last 3 minutes, over 60K "IQuery.get" calls on Experimenters and ExperimenterGroups.
comment:7 Changed 12 years ago by cxallan
- Resolution set to fixed
- Status changed from new to closed
Closed by various upstream commits on sprint18-bugfixes.
Another example of this problem:
This code:
causes the DetailsWrapper? to be created 4 times, each time loading the Experimenter and Group from the server. ie 8 iQuery calls!
When I add a print out in the Blitz Object Wrapper init
I see this printed when running the code above: