[Kimchi-devel] [PATCH V3 1/5] Fix 'disk full' issue: Change objectstore exception handling
Rodrigo Trujillo
rodrigo.trujillo at linux.vnet.ibm.com
Wed Apr 2 13:15:51 UTC 2014
On 04/02/2014 03:33 AM, Royce Lv wrote:
> On 2014年04月01日 20:47, Rodrigo Trujillo wrote:
>> On 04/01/2014 04:04 AM, Royce Lv wrote:
>>> On 2014年03月29日 00:40, Rodrigo Trujillo wrote:
>>>> This patch changes __exit__ function of objectstore in order to log
>>>> the
>>>> error information. It also changes the return to make python raise the
>>>> exception again, which will be caught by the functions that are using
>>>> the objectstore.
>>>>
>>>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>>>> ---
>>>> src/kimchi/objectstore.py | 7 +++++++
>>>> 1 file changed, 7 insertions(+)
>>>>
>>>> diff --git a/src/kimchi/objectstore.py b/src/kimchi/objectstore.py
>>>> index d960ca9..b1c1bdd 100644
>>>> --- a/src/kimchi/objectstore.py
>>>> +++ b/src/kimchi/objectstore.py
>>>> @@ -19,6 +19,7 @@
>>>> import json
>>>> import sqlite3
>>>> import threading
>>>> +import traceback
>>>>
>>>>
>>>> try:
>>>> @@ -29,6 +30,7 @@ except ImportError:
>>>>
>>>> from kimchi import config
>>>> from kimchi.exception import NotFoundError
>>>> +from kimchi.utils import kimchi_log
>>>>
>>>>
>>>> class ObjectStoreSession(object):
>>>> @@ -116,3 +118,8 @@ class ObjectStore(object):
>>>>
>>>> def __exit__(self, type, value, tb):
>>>> self._lock.release()
>>>> + if type is not None and issubclass(type,
>>>> sqlite3.DatabaseError):
>>>> + # Logs the error and return False, which makes
>>>> __exit__ raise
>>>> + # exception again
>>>> + kimchi_log.error(traceback.format_exc())
>>>> + return False
>>> I appreciate the idea of this patch.
>>> Howerver, I wrote a demo and it seems if I don't explicitly return
>>> True, it raises error as its default behavior
>>> And as __exit__ accepted tb as its param, instead of format a
>>> traceback for ourselves,
>>> we need to use the passed in tb.
>>> And I'm not sure why we just raise DBerror?
>>>
>>
>> Hi Royce,
>>
>> yeap, the __exit__ is a function of "with" command that will always
>> be called in the end of "with" command, or when an error happens.
>> If "type, value, tb" are None, means everything went ok in "with".
>> Otherwise, __exit__ is going to re-raise the exception received in
>> function end or re-raise when its code return a False.
>> My idea here is: the __exit__ of objectstore should log only
>> database errors... so, I check for this type of exception, log and
>> make sure the exception is re-raised (the "return False" is kind of
>> redundant, but its ok).
>> Any other problem/exception generated by "with" is going to re-raised
>> without treatment. Python internally checks if "type, value and tb"
>> are None, if not, it re-raises in the end... so, for instance,
>> "NotFoundError" exception (raised when an item is not found in the
>> database) are always returned to "with" ... which is going to deal
>> with it.
>>
>> Let me know if its more clear now.
> So idea is to distinguish DBError and normal error, just log dberror,
> and raise both.I think it's reasonable.
> I mean, the 'tb' argument passed to 'exit' function is traceback
> object when exception raised,this helps us locate error point, we use
> that instead of format an excecution stack on the exit point. Does
> that make sense?
No, does not make sense. I am not understanding your point here.
Notice. I did not change anything in the __exit__ behaviour, I am just
logging db error. What is the problem on this ?
>>
>>
>>
>>> _______________________________________________
>>> Kimchi-devel mailing list
>>> Kimchi-devel at ovirt.org
>>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
More information about the Kimchi-devel
mailing list