API timeouts broken and returning no useful data...
Bug #740750 reported by
Robert Collins
This bug affects 1 person
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Launchpad itself |
Fix Released
|
Critical
|
William Grant | ||
lazr.restful |
Invalid
|
Critical
|
Unassigned |
Bug Description
OOPS-1907C2337, OOPS-1907D1360, OOPS-1907D687, OOPS-1907F790, OOPS-1907G1375
OOPS-1907A567, OOPS-1907B612, OOPS-1907C486, OOPS-1907G2210, OOPS-1907G542
these oops have tiny (1-10ms) durations, and claim to have taken no external actions at all, but the exceptions (e.g. in OOPS-1907G542) are clearly of db calls that have timed out.
The most likely cause I can think of is something starting a new publication cycle for the error (this happens in web requests too - but only *after* errorlog.raising() is called to capture the data).
This has crippled our data gathering, marking critical as it blocks our ability to fix other critical bugs.
Related branches
lp:~wgrant/launchpad/unbreak-api-timeouts
- Robert Collins (community): Approve
-
Diff: 106 lines (+0/-86)3 files modifiedlib/canonical/launchpad/webapp/error.py (+0/-4)
lib/canonical/launchpad/webapp/tests/test_request_expire_render.py (+0/-27)
lib/canonical/launchpad/webapp/tests/test_request_expire_render.txt (+0/-55)
Changed in lazr.restful: | |
status: | New → Triaged |
importance: | Undecided → Critical |
Changed in launchpad: | |
status: | New → Triaged |
importance: | Undecided → Critical |
tags: | added: regression |
Changed in launchpad: | |
assignee: | nobody → William Grant (wgrant) |
status: | Triaged → In Progress |
Changed in lazr.restful: | |
status: | Triaged → Invalid |
tags: |
added: qa-ok removed: qa-needstesting |
Changed in launchpad: | |
status: | Fix Committed → Fix Released |
To post a comment you must log in.
The recent lazr.restful exception changes broke this. The exception handler in lazr.restful. _resource gets the view for the exception, somewhat like this:
Traceback (most recent call last): wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. publisher- 3.12.0- py2.6.egg/ zope/publisher/ publish. py", line 134, in publish callObject( request, obj) wgrant/ launchpad/ lp-sourcedeps/ eggs/lazr. restful- 0.18.1- py2.6.egg/ lazr/restful/ publisher. py", line 211, in callObject ublicationMixin , self).callObjec t(request, object) wgrant/ launchpad/ lp-branches/ devel/lib/ canonical/ launchpad/ webapp/ publication. py", line 488, in callObject getPositionalAr guments( ), request) wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. publisher- 3.12.0- py2.6.egg/ zope/publisher/ publish. py", line 109, in mapply wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. publisher- 3.12.0- py2.6.egg/ zope/publisher/ publish. py", line 115, in debug_call wgrant/ launchpad/ lp-sourcedeps/ eggs/lazr. restful- 0.18.1- py2.6.egg/ lazr/restful/ _resource. py", line 923, in __call__ wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. component- 3.9.3-py2. 6.egg/zope/ component/ _api.py" , line 109, in getMultiAdapter er(objects, interface, name, context=context) wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. component- 3.9.3-py2. 6.egg/zope/ component/ _api.py" , line 122, in queryMultiAdapter queryMultiAdapt er(objects, interface, name, default) wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. component- 3.9.3-py2. 6.egg/zope/ component/ registry. py", line 240, in queryMultiAdapter wgrant/ launchpad/ lp-sourcedeps/ eggs/zope. interface- 3.5.2-py2. 6-linux- x86_64. egg/zope/ interface/ adapter. py", line 526, in queryMultiAdapter wgrant/ launchpad/ lp-branches/ devel/lib/ canonical/ launchpad/ webapp/ error.py" , line 246, in __init__ request_ started( ) wgrant/ launchpad/ lp-branches/ devel/lib/ canonical/ launchpad/ webapp/ adapter. py", line 205, in clear_request_ started
File "/home/
result = publication.
File "/home/
WebServiceP
File "/home/
return mapply(ob, request.
File "/home/
return debug_call(obj, args)
File "/home/
return obj(*args)
File "/home/
view = getMultiAdapter((e, self.request), name="index.html")
File "/home/
adapter = queryMultiAdapt
File "/home/
return sitemanager.
File "/home/
objects, interface, name, default)
File "/home/
result = factory(*objects)
File "/home/
clear_
File "/home/
raise Exception("I should not be called here!")
So it instantiates the error handling view, which resets the request in __init__ so the page can actually do stuff.