50:50 split algorithm now works in following way:
- On client configuration change, membership change or disconnect wait
till membership is stable (= all client configuration node list are
equal, and all partitions has equal information).
- Choose best partition >= 50%
- If no such partition exists, send NACK to all clients
- Send NACK to all clients who should receive NACK
- After all clients who should receive NACK confirm vote reception, send
ACK to all clients who should get ACK
This ensures that there are never two partitions with ACK and it has
much better behavior than previous version, because if tie-breaker
partition is not connected, other partition gets ACK.
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Algo timer is simplified timer designed for qnetd algorithm. Instead of
full timer only one can exists per client. Workflow is:
- In one of algorithm callbacks qnetd_client_algo_timer_schedule is
called
- On timeout .timer_callback is called (for example
qnetd_algo_test_timer_callback). It's possible to set send_vote and
result_vote to send vote info to client
- It's possible to discard timer by calling
qnetd_client_algo_timer_abort
Timer is automatically deleted on client disconnect.
To make all this possible, qnetd main loop now has support for
timer-list (main_timer_list). To be able to handle error and disconnect
client from timer callback, client has schedule_disconnect. If this is
set to 1, client is disconnected on current call of poll loop.
Signed-off-by: Jan Friesse <jfriesse@redhat.com>