-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/44820/#review123572
-----------------------------------------------------------


Ship it!




Ship It!

- Jake Maes


On March 15, 2016, 1:06 a.m., Jagadish Venkatraman wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/44820/
> -----------------------------------------------------------
> 
> (Updated March 15, 2016, 1:06 a.m.)
> 
> 
> Review request for samza, Boris Shkolnik, Jake Maes, Yi Pan (Data 
> Infrastructure), Navina Ramesh, and Xinyu Liu.
> 
> 
> Repository: samza
> 
> 
> Description
> -------
> 
> The ContainerRequestState class is currently not thread-safe. The class's 
> methods and state variables are called from both the ContainerAllocator and 
> the AMRMCallback handler.
> Here's an analysis I summarized by looking at the current implementation. 
> From the below table, getContainersOnAHost() returns the entire list of 
> containers to the AbstractContainerAllocator which reads it. However, the 
> Callback thread invokes methods that write to the allocatedContainerQueue. 
> (causing a potential race condition)
> 
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | Method                      | requestQueue | hostsToCountMap | 
> allocatedContainerQueue | ThreadsAccesedFrom  |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | updateRequestState          | write        | write/read      | write        
>            | Callback, Allocator |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | addContainer                |              | read            | write        
>            | Callback            |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | updateStateAfterAssignment  | write        | write           | read         
>            | Allocator           |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | releaseExtraContainers      | write        | write           | write        
>            | Allocator           |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | releaseUnstartableContainer |              |                 |              
>            | Allocator           |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | getContainersOnAHost        |              |                 | read         
>            | Allocator           |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> | getRequestsQueue            | read         |                 |              
>            | Allocator           |
> +-----------------------------+--------------+-----------------+-------------------------+---------------------+
> 
> I'm proposing to make the ContainerRequestState class thread-safe by:
> i) Expose more granular synchronized APIs for things like:
> 1. Getting num containers on a host.
> 2. Getting the number of pending requests.
> 3. Checking if the queue is empty etc. / peeking a queue etc.
> 
> ii) Getting rid of the non-synchronized methods.
> 
> iii) Ensuring that methods that return a map, don't return the original map, 
> but a defensive copy instead.
> 
> The other methods are already synchronized.
> 
> This improvement is beneficial because:
> 1. This allows us to reason about concurrency more effectively when using the 
> request-state in multi-threaded contexts.
> 2. It's cleaner for the ContainerRequestState class to expose higher level 
> methods and not expose the guts of the class in its entirety.
> 
> 
> Diffs
> -----
> 
>   
> samza-yarn/src/main/java/org/apache/samza/job/yarn/AbstractContainerAllocator.java
>  b4789e62beb1120f11a8101664b10c34ae930e58 
>   
> samza-yarn/src/main/java/org/apache/samza/job/yarn/ContainerRequestState.java 
> 3e3f48ce2b5c0802e8c7c4f09b632df2d2265c12 
>   
> samza-yarn/src/test/java/org/apache/samza/job/yarn/TestContainerAllocator.java
>  2b1bdab3c8de3184e930c244a8cae55813c33565 
>   
> samza-yarn/src/test/java/org/apache/samza/job/yarn/TestContainerRequestState.java
>  402fe784120ac40ed542d9fa60d6a6d7df9c8cda 
>   
> samza-yarn/src/test/java/org/apache/samza/job/yarn/TestHostAwareContainerAllocator.java
>  0c7a09f3e4c4c2ce6788be729d0bf4a294243c68 
>   
> samza-yarn/src/test/java/org/apache/samza/job/yarn/TestSamzaTaskManager.java 
> 9da1edf6ff165ef0306de8730853ad30551a9831 
> 
> Diff: https://reviews.apache.org/r/44820/diff/
> 
> 
> Testing
> -------
> 
> All unit tests pass.
> 
> 
> Thanks,
> 
> Jagadish Venkatraman
> 
>

Reply via email to