> 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..

> 
> 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>

Reply via email to