Commit Graph

8664 Commits

Author SHA1 Message Date
Dan Newton
bfc311e660
Merge pull request #6428 from corda/dan/os-4.4-to-4.5-merge-2020-07-01
OS 4.4 to 4.5 merge 2020-07-01
2020-07-02 12:35:21 +01:00
LankyDan
cfe66fc662 Merge branch 'release/os/4.4' into dan/os-4.4-to-4.5-merge-2020-07-01 2020-07-02 10:39:40 +01:00
Dan Newton
ce146bdd59
Merge pull request #6427 from corda/dan/CORDA-3722-session-rollbacks-backport-4.4
BACKPORT - NOTICK Non-database error handling in `withEntityManager` (#6239)
2020-07-02 09:50:22 +01:00
Dan Newton
5f4401d16a NOTICK Non-database error handling in withEntityManager (#6239)
When a non-database exception is thrown out of a `withEntityManager`
block, always check if the session needs to be rolled back.

This means if a database error is caught and a new non-database error is
thrown out of the `withEntityManager` block, the transaction is still
rolled back. The flow can then continue progressing as normal.
2020-07-01 18:18:21 +01:00
LankyDan
c06830d851 Merge branch 'release/os/4.4' into dan/os-4.4-to-4.5-merge-2020-07-01
# Conflicts:
#	core/src/main/kotlin/net/corda/core/node/ServiceHub.kt
#	node/src/integration-test-slow/kotlin/net/corda/node/services/statemachine/StatemachineGeneralErrorHandlingTest.kt
#	node/src/integration-test-slow/kotlin/net/corda/node/services/statemachine/StatemachineKillFlowErrorHandlingTest.kt
#	node/src/integration-test/kotlin/net/corda/node/flows/FlowEntityManagerTest.kt
#	node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt
#	node/src/main/kotlin/net/corda/node/services/statemachine/TransitionExecutorImpl.kt
#	node/src/main/kotlin/net/corda/node/services/statemachine/interceptors/HospitalisingInterceptor.kt
2020-07-01 17:32:36 +01:00
Razvan Codreanu
33cfa27f0b
INFRA-357 adding nexusIQ stage to JDK 11 regression job (#6421) 2020-06-30 20:13:58 +01:00
Razvan Codreanu
bf4d733336
INFRA-371 publish nightly and publish tag to docker hub steps (#6399) 2020-06-30 20:12:27 +01:00
Dan Newton
8cd2d4891a
Merge pull request #6416 from corda/dan/CORDA-3722-session-rollbacks-backport-4.4
CORDA-3722 session rollbacks - backport
2020-06-30 13:35:14 +01:00
LankyDan
d35e8ba526 CORDA-3722 Add imports in RestrictedEntityManager
Needed after backporting a change
2020-06-30 11:54:16 +01:00
Dan Newton
efd633c7b9 CORDA-3722 withEntityManager can rollback its session (#6187)
* CORDA-3722 withEntityManager can rollback its session

Improve the handling of database transactions when using
`withEntityManager` inside a flow.

Extra changes have been included to improve the safety and
correctness of Corda around handling database transactions.

This focuses on allowing flows to catch errors that occur inside an
entity manager and handle them accordingly.

Errors can be caught in two places:

- Inside `withEntityManager`
- Outside `withEntityManager`

Further changes have been included to ensure that transactions are
rolled back correctly.

Errors caught inside `withEntityManager` require the flow to manually
`flush` the current session (the entity manager's individual session).
By manually flushing the session, a `try-catch` block can be placed
around the `flush` call, allowing possible exceptions to be caught.

Once an error is thrown from a call to `flush`, it is no longer possible
to use the same entity manager to trigger any database operations. The
only possible option is to rollback the changes from that session.
The flow can continue executing updates within the same session but they
will never be committed. What happens in this situation should be handled
by the flow. Explicitly restricting the scenario requires a lot of effort
and code. Instead, we should rely on the developer to control complex
workflows.

To continue updating the database after an error like this occurs, a new
`withEntityManager` block should be used (after catching the previous
error).

Exceptions can be caught around `withEntityManager` blocks. This allows
errors to be handled in the same way as stated above, except the need to
manually `flush` the session is removed. `withEntityManager` will
automatically `flush` a session if it has not been marked for rollback
due to an earlier error.

A `try-catch` can then be placed around the whole of the
`withEntityManager` block, allowing the error to be caught while not
committing any changes to the underlying database transaction.

To make `withEntityManager` blocks work like mini database transactions,
save points have been utilised. A new savepoint is created when opening
a `withEntityManager` block (along with a new session). It is then used
as a reference point to rollback to if the session errors and needs to
roll back. The savepoint is then released (independently from
completing successfully or failing).

Using save points means, that either all the statements inside the
entity manager are executed, or none of them are.

- A new session is created every time an entity manager is requested,
but this does not replace the flow's main underlying database session.
- `CordaPersistence.transaction` can now determine whether it needs
to execute its extra error handling code. This is needed to allow errors
escape `withEntityManager` blocks while allowing some of our exception
handling around subscribers (in `NodeVaultService`) to continue to work.
2020-06-30 11:54:16 +01:00
Dan Newton
f6b5737277
ENT-5196 handle errors during flow initialisation (#6378)
## Summary

This change deals with multiple issues:

* Errors that occur during flow initialisation.

* Errors that occur when handling the outcome of an existing flow error.

* Failures to rollback and close a database transaction when an error
occurs in `TransitionExecutorImpl`.

* Removal of create and commit transaction actions around retrying a flow.

## Errors that occur during flow initialisation

Flow initialisation has been moved into the try/catch that exists inside
`FlowStateMachineImpl.run`. This means if an error is thrown all the way
out of `initialiseFlow` (which should rarely happen) it will be caught 
and move into a flow's standard error handling path. The flow should 
then properly terminate.

`Event.Error` was changed to make the choice to rollback be optional. 
Errors during flow initialisation cause the flow to not have a open 
database transaction. Therefore there is no need to rollback.

## Errors that occur when handling the outcome of an existing flow error

When an error occurs a flow goes to the flow hospital and is given an 
outcome event to address the original error. If the transition that was 
processing the error outcome event (`StartErrorPropagation` and
`RetryFlowFromSafePoint`) has an error then the flow aborts and
nothing happens. This means that the flow is left in a runnable state.

To resolve this, we now retry the original error outcome event whenever 
another error occurs doing so.

This is done by adding a new staff member that looks for 
`ErrorStateTransitionException` thrown in the error code path of 
`TransitionExecutorImpl`. It then takes the last outcome for that flow 
and schedules it to run again. This scheduling runs with a backoff.

This means that a flow will continually retry the original error outcome
event until it completes it successfully.

## Failures to rollback and close a database transaction when an error occurs in `TransitionExecutorImpl`
   
Rolling back and closing the database transaction inside of 
`TransitionExecutorImpl` is now done inside individual try/catch blocks
as this should not prevent the flow from continuing.

## Removal of create and commit transaction actions around retrying a flow

The database commit that occurs after retrying a flow can fail which 
required some custom code just for that event to prevent inconsistent 
behaviour. The transaction was only needed for reading checkpoints from 
the database, therefore the transaction was moved into 
`retryFlowFromSafePoint` instead and the commit removed.

If we need to commit data inside of `retryFlowFromSafePoint` in the 
future, a commit should be added directly to `retryFlowFromSafePoint`. 
The commit should occur before the flow is started on a new fiber.
2020-06-30 11:50:42 +01:00
Chris Rankin
0ddc430b4d
INRFA-415: Publish empty source and JavaDoc for deterministic modules (#6406)
Create empty source and javadoc artifacts for the deterministic modules so that they can be published to Maven Central.
2020-06-29 20:38:51 +01:00
Denis Rekalov
5228817fb4
Merge pull request #6410 from corda/denis/CORDA-3856-amqp-header-os-4.5
OS 4.4 to 4.5 merge
2020-06-29 13:10:36 +01:00
Denis Rekalov
7686ca2944 Merge branch 'release/os/4.4' into denis/CORDA-3856-amqp-header-os-4.5 2020-06-29 12:35:05 +01:00
Viktor Kolomeyko
4391585fa9
CORDA-3868: Use specific exception to determine SSL handshake timeout (#6409) 2020-06-29 12:24:03 +01:00
Denis Rekalov
3f03de6fbd
CORDA-3856: Add Artemis plugin for validating AMQP message header and type (#6407) 2020-06-29 09:23:29 +01:00
Dan Newton
619a2c9af3
Merge pull request #6402 from corda/NOTICK-rfowler-merge-OS4.4-OS4.5-20200626
NOTICK rfowler merge os4.4 os4.5 20200626
2020-06-26 12:12:51 +01:00
Waldemar Żurowski
b21a3c33cd
Added Sonatype check for regression builds (#6401) 2020-06-26 10:48:47 +01:00
Ryan Fowler
881d8d687c Merge branch 'release/os/4.4' into NOTICK-rfowler-merge-OS4.4-OS4.5-20200626 2020-06-26 09:52:16 +01:00
Ryan Fowler
ef582900cf
NOTICK Expand the regex to match what we already do in ENT (#6400) 2020-06-25 17:26:55 +01:00
Waldemar Zurowski
3377df2212 Switched to CMD for Windows Server
* when using shell there are huge performance penalty
2020-06-20 17:26:57 +01:00
Waldemar Żurowski
5bfc693a71
Merge pull request #6384 from corda/INFRA-357
INFRA-357 4.4 to 4.5 merge + JDK 11 regression build changes for tag publishing
2020-06-20 14:33:24 +01:00
Schife
84583d2a1c INFRA-357 Re adding JDK 11 regression build file that was removed in the 4.4 to 4.5 merge 2020-06-20 11:25:20 +01:00
Schife
6a12cf34ad Merge branch 'release/os/4.4' of https://github.com/corda/corda into INFRA-357
 Conflicts:
	testing/DockerfileJDK11Azul
2020-06-20 11:22:30 +01:00
Razvan Codreanu
e021022d0d
INFRA-357 Publish build tag (#6375) 2020-06-20 11:08:52 +01:00
Waldemar Zurowski
a7644dab8b Cosmetic change for Windows Server builds 2020-06-19 22:09:02 +01:00
Waldemar Żurowski
ac0e35c854
Trying to ignore push events for Windows Server builds (#6383) 2020-06-19 22:03:09 +01:00
Waldemar Żurowski
99b761e0e2
Merge pull request #6381 from corda/merge-44-to-45
NOTICK: merge Corda OS 4.4 to 4.5
2020-06-19 19:44:13 +01:00
Waldemar Zurowski
f1fcce4247 Merge branch 'release/os/4.4' into merge-44-to-45 2020-06-19 19:42:19 +01:00
Waldemar Żurowski
8a601e6d62
Merge pull request #6380 from corda/merge-43-to-44
NOTICK: forward merge from Corda OS 4.3 to 4.4
2020-06-19 19:35:19 +01:00
Waldemar Zurowski
f7b38f0b6d Merge branch 'release/os/4.3' into merge-43-to-44 2020-06-19 19:32:55 +01:00
Waldemar Żurowski
23f81e73a6
Remove obsolete Jenkins configration for smoke tests (#6379) 2020-06-19 19:30:11 +01:00
Razvan Codreanu
ad21e381dc
INFRA-357 Adding JDK 11 Regression and Build tag jenkinsfile (#6374) 2020-06-19 14:10:31 +01:00
Waldemar Żurowski
f7f2b0cea4
Merge pull request #6373 from corda/merge-44-45
NOTICK: merging OS 4.4 with OS 4.5
2020-06-19 11:34:39 +01:00
Waldemar Zurowski
68771cf430 Merge branch 'release/os/4.4' into merge-44-45 2020-06-19 11:02:34 +01:00
alicer3
e77f7a7546
center console message for registration (#6191) 2020-06-19 09:49:07 +01:00
Euan Cairncross
4bfb595e57
INFRA-357 - Add release tag Jenkins build for OS 4.4 (#6362) 2020-06-18 23:46:29 +01:00
Waldemar Żurowski
494073590b
INFRA-347: Corda builds for Windows Servers (#6356) 2020-06-18 23:19:06 +01:00
Razvan Codreanu
813e9dd242
INFRA-394 enable full junit log to avoid truncation (#6368) 2020-06-18 12:52:33 +01:00
Matthew Nesbit
5b3ca5f112
Merge pull request #6367 from corda/chrisr3-os44-merge
NOTICK: Merge from OS 4.4 -> OS 4.5 up to fe61781
2020-06-18 12:03:21 +01:00
Chris Rankin
1ef62870bb Merge commit 'fe617818895edab334d80c5e8de2b38f39e67af6' into chrisr3-os44-merge 2020-06-17 18:54:54 +01:00
Rick Parker
fe61781889
Merge pull request #6358 from corda/adel/merge-4.3-to-4.4-17June
Merge OS 4.3 to OS 4.4
2020-06-17 18:13:55 +01:00
Chris Rankin
d0c0a1d9ba
ENT-5430: Fix deserialisation of commands containing generic types. (#6359) 2020-06-17 17:28:26 +01:00
James Higgs
24b0240d82
EG-2654 - Ensure stack traces are printed to the logs in error reporting (#6345)
* EG-2654 Ensure stack trace is printed to the logs in error reporting

* EG-2654 - Add a test case for exception logging
2020-06-17 14:32:12 +01:00
Adel El-Beik
debc962d1d Merge remote-tracking branch 'origin/release/os/4.3' into adel/merge-4.3-to-4.4-17June 2020-06-17 10:06:34 +01:00
Dan Newton
7ab6a8f600
CORDA-3841 Check isAnyCheckpointPersisted in startFlowInternal (#6351)
Only hit the database if `StateMachineState.isAnyCheckpointPersisted`
returns true. Otherwise, there will be no checkpoint to retrieve from the
database anyway. This can prevent errors due to a transient loss of
connection to the database.
2020-06-16 09:22:26 +01:00
Waldemar Żurowski
4b63bab4fc
Merge pull request #6346 from corda/raz/os44to45
NOTICK: MERGE OS 4.4 -> OS 4.5
2020-06-12 17:11:01 +01:00
James Higgs
2c253d806d
EG-2684 Ensure original message is logged with old-style error codes (#6340)
* [EG-2684] Ensure original message is logged with old-style error codes

* [EG-2684] Address detekt issues
2020-06-12 16:52:01 +01:00
Schife
b39aaacd3a Merge branch 'release/os/4.4' of https://github.com/corda/corda into raz/os44to45 2020-06-12 15:35:33 +01:00
Razvan Codreanu
2b7c220522
INFRA-387 preallocation and deployNodes migration to Code Checks (#6339)
* preallocate for slow integration tests as well
2020-06-12 15:30:15 +01:00