[ http://issues.apache.org/jira/browse/DERBY-1732?page=all ]

Sunitha Kambhampati updated DERBY-1732:
---------------------------------------

    Attachment: derby1732.diff.txt
                derby1732.stat.txt

Notes:
On a JVM error, the cleanup at the store layer treats it as a session_severity 
error -- 
see RAMTransactionContext.cleanupOnError(), XactContext.cleanupOnError().
the transaction is aborted,destroyed, transaction context is pop'd from the 
context stack.

At the language side however:
GenericStatementContext (SC) will treat a java error to be similar to 
STATEMENT_SEVERITY.
GenericLanguageConnectionContex (LCC) will treat a java error to be of 
TRANSACTION_SEVERITY.

If an exception occurs, the contextManager.cleanupOnError is called to ensure 
corrective action can be taken. The context manager will unwind the contexts 
during cleanup in the reverse order they were placed in the global stack.  

In ContextManager.cleanupOnError(), 
-- A non StandardException (a jvm error) gets mapped to NO_APPLICABLE_SEVERITY 
here:
                        int errorSeverity = error instanceof StandardException ?
                                ((StandardException) error).getSeverity() :
                                ExceptionSeverity.NO_APPLICABLE_SEVERITY;

-- Next, we walk down the stack calling cleanup on each context as long as if 
we reached the lastHandler or if we have reached end of stack. 

So if a given context is the last handler for an error of some severity, then 
we stop there and do not call cleanup on the context's below it.

The derby1707 repro debugging shows that in this case  - at prepare time for 
the statement, a NPE is thrown from GenericStatement.prepMinion. In the context 
stack,store contexts are first cleaned up and then the SC cleanup is called. 
Note: LCC is below in the stack and LCC cleanup does not get called since the 
SC.isLastHandler returns true.

Issue:
-- isLastHandler for GenericStatement is not right. JVM errors severity gets 
mapped to NO_APPLICABLE_SEVERITY in 
ContextManager.cleanupOnError().  Thus on cleanup, for JVM error 
SC.isLastHandler can return true for some cases(when rollbackParentContext is 
false, and inUse is true).  This is incorrect because for JVM errors, it is 
necessary to let the outer contexts know and take necessary corrective action.


This patch makes the following changes:
1. Make change to GenericStatementContext.isLastHandler() so it will return 
false for JVM errors thus allowing the outer contexts to take corrective action.
2. Store transaction context treats JVM errors as session severity. To ensure 
consistency, map severity for non StandardException instances to be 
SESSION_SEVERITY in GenericLanguageContext, and GenericStatementContext. 

There is an existing DERBY-1528 which also results in a npe and then the raw 
store protocol violation error. With this change, if you run the repro 
(repro1528_npe), instead of a raw store protocol violation error, you will get 
a java.sql.SQLException 'No current exception'

Ran derbyall on ibm142/linux ok with 2 expected failures unrelated to this 
change. (NSInSameJVM and blobclob4BLOB)

I have been using the derby1707 repro without the fix for this jira for testing 
purposes.  Are there any suggestions on how best to add a test for this case. 
One way is to simulate a java error using debug flags but I dont like that 
approach.  Suggestions welcome.  I can make the yet-to-be-fixed derby1528 repro 
as a test,but that will no longer test this fix when we eventually fix 
derby-1528.

Please take a look at this patch. I am new to this area, so would appreciate 
more eyes on this patch.  Thanks.

> The language and store systems treat a JVM error such as OutOfMemoryError 
> differently leading to the raw store protocol violation errors
> ----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1732
>                 URL: http://issues.apache.org/jira/browse/DERBY-1732
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL, Store
>            Reporter: Daniel John Debrunner
>         Assigned To: Sunitha Kambhampati
>         Attachments: derby1732.diff.txt, derby1732.stat.txt
>
>
> Don't have the exact details, but remember noticing it a while ago. I think 
> the store transaction context closes the transaction on such an error, while 
> the language conneciton context just rollsback the transaction or the 
> statement. I think the best and consistent approach would be to close the 
> connection.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to