Hi,
As I test, after apply this patch, it would triggers another Kimchi bug.
The problem is in
kimchi.model.debugreports.DebugReportsModel.sosreport_generate .
In sosreport_generate there is a big "try" block to catch exceptions and
translate into another exception OperationFailed. However the inner
exception raised can also be Kimchi specific exception such as
OperationFailed. So the error message gets translated and encoded twice
and it would raise UnicodeEncodeError.
This bug is related to but not caused by this patch. If you apply the
patch and run into this bug, it's good because it proves the translation
is working at least...
on 2014/04/01 15:55, zhshzhou(a)linux.vnet.ibm.com wrote:
From: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
cherrypy.request is a proxy for cherrypy.serving.request, and
cherrypy.serving stores the request information on the thread local
storage. When new threads created by Kimchi code, the related request
information is not propagated to the new threads. The problem is that
exception message translation code needs the Accept-Language header or
session cookie to determine which language the user speaks. If the
request information is missing, it assumes the language is English.
Usually this is not a problem because most of the threads in Kimchi just
run in background, and the exception message is written to log, so
English in log is OK. However the AsyncTask catches the exception in
thread and reports to the front-end, and this is not friendly to the
user without proper translation.
This patch propagates the request information to the new threads started
by the AsyncTask, so exception message gets translated according to the
request header or session cookie.
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
src/kimchi/asynctask.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/kimchi/asynctask.py b/src/kimchi/asynctask.py
index 8f0d96c..b54f143 100644
--- a/src/kimchi/asynctask.py
+++ b/src/kimchi/asynctask.py
@@ -37,6 +37,7 @@ class AsyncTask(object):
self.status = 'running'
self.message = 'OK'
self._save_helper()
+ self._cp_request = cherrypy.serving.request
self.thread = threading.Thread(target=self._run_helper,
args=(opaque, self._status_cb))
self.thread.setDaemon(True)
@@ -63,6 +64,7 @@ class AsyncTask(object):
session.store('task', self.id, obj)
def _run_helper(self, opaque, cb):
+ cherrypy.serving.request = self._cp_request
try:
self.fn(cb, opaque)
except Exception, e:
--
Thanks and best regards!
Zhou Zheng Sheng / 周征晟
E-mail: zhshzhou(a)linux.vnet.ibm.com
Telephone: 86-10-82454397