nickva opened a new pull request, #4284:
URL: https://github.com/apache/couchdb/pull/4284

   Global has a tendency to create deadlocks [1], and when that happens 
replication jobs can't start on any of the nodes in the cluster.
   
   We don't really need strict consistent locking for replication jobs. It's 
mostly to avoid replication jobs thrashing the same checkpoint docs back and 
forth between different session IDs. So, remove global to avoid any issues 
around it, and replace it with `pg` -- the new (Erlang 23+) process group 
implementation. (Technically `global` is still running in the runtime system as 
it's started by the `kernel` app. We just avoid interacting with it and 
registering any names to avoid deadlocks).
   
   In `pg` we start a replication `scope`, and then in that scope make every 
RepId a process `group`. When replication processes spawn, their Pids becomes 
`members` of that group:
   
   ```
   couch_replicator_pg (scope):
           "a12c+create_target" (RepId group):
                   [Pid1, Pid2] (members)
           ...
   ```
   
   As per `pg` implementation, groups are created and remove automatically as 
members are added/removed from it, so we don't have to do anything there.
   
   If there are already any running Pids in the same group, we avoid starting 
the jobs, and fail like we did before when we used global. In the even more 
rare case of a race condition, when 2+ jobs do manage to start, we do a 
membership check before each checkpoint. One of the jobs then stops to yield to 
another. For simplicity pick the one running on the lowest lexicographically 
sorted node name to survive.
   
   [1] https://github.com/erlang/otp/issues/6524
   [2] https://www.erlang.org/doc/man/pg.html
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to