[ 
https://issues.apache.org/jira/browse/FLINK-10043?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stefan Richter closed FLINK-10043.
----------------------------------
    Resolution: Implemented

Merged in:
master: 3bf06b9

> Refactor object construction/inititlization/restore code
> --------------------------------------------------------
>
>                 Key: FLINK-10043
>                 URL: https://issues.apache.org/jira/browse/FLINK-10043
>             Project: Flink
>          Issue Type: Sub-task
>            Reporter: Stefan Richter
>            Assignee: Stefan Richter
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Currently, the constructor of {{RocksDBKeyedStateBackend}} has the following 
> shortcomings:
> - It does creation and cleanup of some directories and files. This makes it 
> harder to unit-test because dependencies are created in the constructor and 
> not passed in from outside.
> - It leaves many important fields uninitialized and more methods e.g. 
> {{restore}} _have_ to be called before the backend object is fully 
> constructed. This is error-prone in many ways and hard to unit-test. I think 
> the origin of this problem was introducing incremental snapshots, because in 
> this case, we can only open a RocksDB instance AFTER the restore code was 
> executed and restored the working directory.
> As a solution, I would suggest to have a dedicated builder class that takes 
> the current constructor parameters and (optional) the state handles to 
> restore. Then, this class constructs and intializes all required objects, and 
> those objects are only passed to the new {{RocksDBKeyedStateBackend}} 
> constructor that does no other work besided assigning dependencies to fields.
> With this change, I would also extract the different restore strategies for 
> incremental and full snapshots out of the backend's main class, into their 
> own classes. They will then be used in the newly introduced builder from the 
> previous step. This builder would receive all objects that currently go into 
> the constructor and the restore method. It should create all directories, and 
> (if applicable) download state, create and restore a RocksDB instance object, 
> create and register states. Everything concerning the construction of 
> collaboratores for the backend should go into the builder and the backend 
> main class should can simply receive all collaboratores and assign them to 
> final fields.
> One detail to concider for the builder is that all resources for 
> collaboratores should be created and initialized in a 
> resource-acquisition-is-initialization (RAII) style, in particular because 
> some of them are backed by native (JNI) objects: If we fail to create a 
> resource during the process, all previously created resources should properly 
> be released and de-allocated. Releasing/De-allocation should happen in the 
> excact inverse order of creation, to avoid any transitive double-frees in the 
> native code. Only when all resources are created, the builder will create the 
> main backend object, so again that the constuctor does not have to deal with 
> any fault handling or cleanup-logic.  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to