On 10 July 2014 14:25, Andi Vajda <va...@apache.org> wrote:
>
>> On Jul 10, 2014, at 12:23, Lee Skillen <lskil...@vulcanft.com> wrote:
>>
>> Hey,
>>
>>> On 9 July 2014 18:38, Andi Vajda <va...@apache.org> wrote:
>>>
>>>> On Wed, 9 Jul 2014, Andi Vajda wrote:
>>>>
>>>>
>>>>
>>>>> On Wed, 9 Jul 2014, Lee Skillen wrote:
>>>>>
>>>>> Hey Andi,
>>>>>
>>>>>> On 9 July 2014 13:50, Andi Vajda <va...@apache.org> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> Hi Lee,
>>>>>>
>>>>>>
>>>>>>> On Tue, 8 Jul 2014, Lee Skillen wrote:
>>>>>>>
>>>>>>> Andi, thanks for the reply - I've created a github mirror of the
>>>>>>> pylucene
>>>>>>> project for our own use (which I intend to keep synced with your SVN
>>>>>>> repository as its official upstream), located at:
>>>>>>>
>>>>>>> https://github.com/lskillen/pylucene
>>>>>>>
>>>>>>> As suggested I have formatted (and attached) a patch of the unfinished
>>>>>>> code
>>>>>>> that we're using for the through-layer exceptions.  Alternatively the
>>>>>>> diff
>>>>>>> can be inspected via github by diff'ing between the new
>>>>>>> feature-thru-exception branch that I have created and the master
>>>>>>> branch, as
>>>>>>> such:
>>>>>>>
>>>>>>>
>>>>>>> https://github.com/lskillen/pylucene/compare/feature-thru-exception?expand=1
>>>>>>>
>>>>>>> Although we've run the test suite without issues I realise there may
>>>>>>> still
>>>>>>> be functionality/style/logical issues with the code.  I also suspect
>>>>>>> that
>>>>>>> there may not be specific test cases that target regression failures
>>>>>>> for
>>>>>>> exceptions (yet), so confidence isn't high!  All comments are welcome
>>>>>>> and I
>>>>>>> realise this will likely require further changes and a repeatable test
>>>>>>> case
>>>>>>> before it is acceptable, but that's fine.
>>>>>>
>>>>>>
>>>>>>
>>>>>> I took a look at your patch and used the main idea to rewrite it so
>>>>>> that:
>>>>>>  - ref handling is correct (hopefully): you had it backwards when
>>>>>> calling
>>>>>>    Py_Restore(), it steals what you currently must own.
>>>>>>  - the Python error state is now saved as one tuple of (type, value,
>>>>>> tb) on
>>>>>>    PythonException, not as three strings and three fake Objects
>>>>>> (longs).
>>>>>>  - ref handling is correct via a finalize() method DECREF'ing the saved
>>>>>>    error state tuple on PythonException when that exception is
>>>>>> collected.
>>>>>>  - getMessage() still works as before but the traceback is extracted on
>>>>>>    demand, not at throw time as was done before.
>>>>>>
>>>>>> The previous implementation was done so that no Python cross-VM
>>>>>> reference had to be tracked, all the error data was string'ified at error
>>>>>> time.
>>>>>> Your change now requires that the error be kept 'alive' accross layers
>>>>>> and refs must be tracked to avoid leaks.
>>>>>
>>>>> Great feedback, thank you - I suspected that the reference handling
>>>>> wasn't quite there (first foray into CPython internals), and I also
>>>>> really wanted to utilise a tuple and get rid of the strings but wasn't
>>>>> sure what the standard was for extending a class such as
>>>>> PythonException.  I actually did a quick attempt at running everything
>>>>> under debug mode to inspect for leaks, but suffice to say that my
>>>>> usual toolbox for debugging and tracking memory leaks
>>>>> (gdb/clang/valgrind) didn't work too well - Had some minor success
>>>>> with the excellent objgraph Python package, but would need to spend
>>>>> more time on it.
>>>>>
>>>>>>
>>>>>> I did _not_ test this as I don't have a system currently running that
>>>>>> uses JCC in reverse like this. Since you're actively using the feature,
>>>>>> please test the attached patch (against trunk) and report back with
>>>>>> comments, bugs, fixes, etc...
>>>>>
>>>>> Not a problem!  I applied your modified patch against trunk, rebuilt
>>>>> and re-ran our application.  The good news is that everything is
>>>>> working really well, and the only bug that I could see was within the
>>>>> RegisterNatives() call within registerNatives() for PythonException
>>>>> (size was still 2, changed it to calculate the size of the struct).
>>>>> I'll re-attach the patch with the changes for you to review.
>>>>
>>>>
>>>> Woops, I missed that - even though I looked for it. Oh well. Thanks.
>>>
>>>
>>> I attached a new patch with your fix. I also removed the 'clear()' method
>>> since it's no longer necessary: once the PythonException is constructed, the
>>> error state in the Python VM is cleared because of PyErr_Fetch() being
>>> called during saveErrorState().
>>
>> Changes are looking great - Applied against trunk again here and all
>> working well.  I've also added a new (simple) test case within the
>> test directory under the pylucene root (test_PythonException.py) that
>> checks to see if the through-layer exceptions are working,
>> realistically it should probably be checking the traceback as well but
>> I think this would suffice to show that the exceptions are propagating
>> properly.  On a side note, I did have an issue building pylucene
>> because  java/org/apache/pylucene/store/PythonIndexOutput.java refused
>> to build, as it was referencing a BufferedIndexOutput that seems to
>> have been removed by LUCENE-5678 (I just removed it in my local trunk
>> but didn't want to add that to the patch).
>
> Yes, that's fixed in the upcoming release 4.9.0 available to be voted on. See 
> thread on this list started a few days ago for more details.
>
> I should try and integrate your testcase next...
> Thanks !
>
> Andi..
>

Great - I created PYLUCENE-30 to help track it further (hope that's acceptable).

Let me know if you need any other help or additional input!

>>
>> Cheers,
>> Lee
>>
>>>
>>> Andi..
>>>
>>>
>>>>
>>>>> The only other comments I have are that:
>>>>>
>>>>> (1) This was still an issue with my patch, but I don't know if there
>>>>> is anyone out there relying upon the exact format of the string that
>>>>> gets returned by getMessage(), as it is probably going to be different
>>>>> now that it is calculated at a different point - In saying that I
>>>>> imagine you would only be doing that if you were specifically trying
>>>>> to handle an exception from the Python layer and were trying to
>>>>> re-create it using the string, which wouldn't be an issue now.
>>>>
>>>>
>>>> Yeah, I'm just concatenating the strings. I'm already using PyErr_Print().
>>>>
>>>>> (2) I also noticed that your patch doesn't have the #if
>>>>> defined(PYTHON) part to protect certain parts that rely on things like
>>>>> getPythonExceptionClass() - Not sure if that was intentional or not
>>>>> (guessing it might be one of those things that are always defined
>>>>> anyway), but just wanted to highlight it.
>>>>
>>>>
>>>> Not needed, all of functions.cpp depends on python amyway.
>>>>
>>>>> Apart from that, it looks great - In order to assist with replication
>>>>> of the through-exception issue on your side I also whipped up a (very)
>>>>> quick example and am also attaching this to the email.  Utilises a
>>>>> noddy Makefile to get the job done, but running "make" or "make test"
>>>>> will generate the java/jcc packages and then run the test.  Running
>>>>> "make uninstall" will remove the jcc package, and "make clean" will
>>>>> tidy up the build artifacts.  Standard stuff!
>>>>>
>>>>> Hope that helps!
>>>>
>>>>
>>>> Excellent, thanks !
>>>>
>>>> Andi..
>>>>
>>>>>
>>>>> Thanks,
>>>>> Lee
>>>>>
>>>>>> Thanks !
>>>>>>
>>>>>> Andi..
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Lee
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On 4 July 2014 18:17, Andi Vajda <va...@apache.org> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On Jul 4, 2014, at 18:33, Lee Skillen <lskil...@vulcanft.com> wrote:
>>>>>>>>
>>>>>>>> Hi Andi,
>>>>>>>>
>>>>>>>> First of all, absolutely fantastic work on the JCC project, we love it
>>>>>>>> -
>>>>>>>> Second of all, apologies for contacting you out of the blue via email,
>>>>>>>> but
>>>>>>>> I wasn't sure of the best place to contact you to ask a few questions
>>>>>>>> (technical-level, not support-level).  If it isn't acceptable to email
>>>>>>>> please let me know and I can move the discussion somewhere else.
>>>>>>>>
>>>>>>>>
>>>>>>>> Yes, please include pylucene-dev@lucene.apache.org (subscription
>>>>>>>> required. send mail pylucene-dev-subscribe@ and follow the
>>>>>>>> instructions
>>>>>>>> in the reply).
>>>>>>>>
>>>>>>>> A bit of background first of all :-
>>>>>>>>
>>>>>>>> We've been integrating JCC for the past two weeks on a sizeable
>>>>>>>> Python/Java/C++ project (where Python is a controller/glue layer)
>>>>>>>> having
>>>>>>>> migrated from a previous solution to integrate across the languages,
>>>>>>>> and
>>>>>>>> for the most part JCC has been a lifesaver.
>>>>>>>>
>>>>>>>> Technically we've only hit one major issue so far and that has been
>>>>>>>> the
>>>>>>>> translation of exceptions through the layers.  Our Java application
>>>>>>>> does a
>>>>>>>> lot of double-dispatch (visitation) type of execution and we're
>>>>>>>> calling
>>>>>>>> outwards to Python to implement the concrete visitation logic.
>>>>>>>>
>>>>>>>> In the case of an exception being thrown it results in JCC collating a
>>>>>>>> traceback and captured exception at every level of scope, resulting in
>>>>>>>> a
>>>>>>>> giant JavaError exception which has lost it's original PythonException
>>>>>>>> context.
>>>>>>>>
>>>>>>>> I was actually able to fix this by attempting to capture the full
>>>>>>>> context
>>>>>>>> via PyErr_Fetch() when the first python object is thrown and storing
>>>>>>>> it
>>>>>>>> within PythonException, and then ensuring that this is carried through
>>>>>>>> each
>>>>>>>> layer appropriately - This seems to work very well, although
>>>>>>>> admittedly I
>>>>>>>> haven't considered regressive errors or compatibility yet, but just
>>>>>>>> wanted
>>>>>>>> to proof-of-concept it first of all then speak with a JCC maintainer.
>>>>>>>>
>>>>>>>> The net result is being able to catch errors in a pipeline similar to
>>>>>>>> the
>>>>>>>> following:
>>>>>>>>
>>>>>>>> Python
>>>>>>>>   -> Java
>>>>>>>>       -> Python
>>>>>>>>         -> Raise MyException
>>>>>>>>       <- Throw PythonException (containing MyException)
>>>>>>>>   <- Inject MyException
>>>>>>>> Catch MyException
>>>>>>>>
>>>>>>>> My main questions are to ask your thoughts about :-
>>>>>>>>
>>>>>>>> - What are your thoughts about through-layer exceptions and a feature
>>>>>>>> improvement like this?
>>>>>>>>
>>>>>>>>
>>>>>>>> I agree that losing information during exception throwing is not good.
>>>>>>>> If
>>>>>>>> you've got an improvement in the form of a patch, do not hesitate in
>>>>>>>> sending it in.
>>>>>>>>
>>>>>>>> - JCC is (I think) currently at home with pylucene, are there are
>>>>>>>> plans to
>>>>>>>> making it separate?
>>>>>>>>
>>>>>>>>
>>>>>>>> No such plans at the moment.
>>>>>>>>
>>>>>>>> - Are you happy if I create a public github project and add the
>>>>>>>> patched
>>>>>>>> code in there for review?
>>>>>>>>
>>>>>>>>
>>>>>>>> You're welcome to fork the code if you'd like but you don't have to if
>>>>>>>> all
>>>>>>>> you want is sending a patch. Your call.
>>>>>>>>
>>>>>>>> Thank you for the kind words !
>>>>>>>>
>>>>>>>> Andi..
>>>>>>>>
>>>>>>>>
>>>>>>>> Hope to hear from you!
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Lee
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> TL;DR;
>>>>>>>>
>>>>>>>> We would like to :-
>>>>>>>>
>>>>>>>> - Improve JCC's through-layer exception support.
>>>>>>>> - Establish a github project for JCC alone.
>>>>>>>>
>>>>>>>> --
>>>>>>>> Lee Skillen
>>>>>>>>
>>>>>>>> Vulcan Financial Technologies
>>>>>>>> 1st Floor, 47 Malone Road, Belfast, BT9 6RY
>>>>>>>>
>>>>>>>> Office:  +44 (0)28 95 817888
>>>>>>>> Mobile:  +44 (0)78 41 425152
>>>>>>>> Web:     www.vulcanft.com
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Lee Skillen
>>>>>>>
>>>>>>> Vulcan Financial Technologies
>>>>>>> 1st Floor, 47 Malone Road, Belfast, BT9 6RY
>>>>>>>
>>>>>>> Office:  +44 (0)28 95 817888
>>>>>>> Mobile:  +44 (0)78 41 425152
>>>>>>> Web:     www.vulcanft.com
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Lee Skillen
>>>>>
>>>>> Vulcan Financial Technologies
>>>>> 1st Floor, 47 Malone Road, Belfast, BT9 6RY
>>>>>
>>>>> Office:  +44 (0)28 95 817888
>>>>> Web:     www.vulcanft.com
>>
>>
>>
>> --
>> Lee Skillen
>>
>> Vulcan Financial Technologies
>> 1st Floor, 47 Malone Road, Belfast, BT9 6RY
>>
>> Office:  +44 (0)28 95 817888
>> Web:     www.vulcanft.com
>> <feature-thru-exception-3.patch>



-- 
Lee Skillen

Vulcan Financial Technologies
1st Floor, 47 Malone Road, Belfast, BT9 6RY

Office:  +44 (0)28 95 817888
Web:     www.vulcanft.com

Reply via email to