ConnectionManager object destructed before LifecycleService may cause illegal memory access #316
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
HazelcastClient destruction should guarantee that the lifecycle service shutdown is completed so that no one accesses ConnectionManager object which is destructed before LifecycleService object. The construction order is LifecycleService first and then the ConnectionManager, and the destruction is in the opposite order (see https://stackoverflow.com/questions/2254263/order-of-member-constructor-and-destructor-calls and http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf page 255 item 8). Hence, we need to wait for LifecycleService finish its shutdown before leaving the HazelcastClient destructor to avoid illegal memory access. It is not only the ConnectionManager but the ClusterService and other objects created after LifecycleService.
Windows environment IssueTest::testIssue221 failures at windows may be due to this reason.
Solution: Let the client provide the shutdownLatch (remove the one in LifecycleService) on LifecycleService construction and client waits on this latch before destructor exit.