summaryrefslogtreecommitdiffstats
path: root/kernel/servers.h
blob: 83d9b46b47248cfa09243655bda0098308bccab1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 * kernel/servers.h
 */


#define SRTT_BETA       990
#define SRTT_BETA_COMP   10
#define SRTT_BETA_BASE 1000

/*
 * Though presented as a 16-bit number in sysfs, the SRTT is stored in
 * an unsigned long, SRTT_SHIFT bits left-shifted.  This helps
 * preserve the precision we need tou update the SRTTs.  If we stored
 * SRTT in an integer, it would only be changed by RTTS *very* far
 * away from it.
 */
#define SRTT_SHIFT       10

/*
 * After this interval without answering
 * requests a server is considered down.
 */
#define TIMEOUT_STALLED 3*HZ


/*
 * Configure @srv_info based on @server: Create a socket, connect it
 * and start a dnbd2_rx_loop for it.
 */
int add_server(dnbd2_server_t server, struct srv_info *srv_info);

/*
 * Reset @srv_info: Stop dnbd2_rx_loop, close the socket and zero all
 * variables.
 */
void del_server(struct srv_info *srv_info);

/*
 * Look for an unused server-slot in @dev and configure it according
 * to @server (using add_server). Nothing happens if the list of
 * servers if full or if there is already a server in the list with
 * the same IP and port as @server.
 */
void try_add_server(dnbd2_server_t server, dnbd2_device_t *dev);

/*
 * This function enqueues into the send-queue a request for the device
 * capacity (CMD_GET_SIZE). This type of request is retransmitted
 * every second. If an answer doesn't arrive within 4 seconds it
 * assumes that the server is down.
 */
sector_t srv_get_capacity(struct srv_info *srv_info);

/*
 * Update min, max and srtt in @srv_info.
 */
void update_rtt(uint16_t rtt, struct srv_info *srv_info, uint16_t cmd);

/*
 * Enqueue a heartbeat request (CMD_GET_SERVERS) for @srv_info into
 * the send-queue.
 */
void enqueue_hb(struct srv_info *srv_info);

/*
 * Schedule the removal of @srv_info to be processed by the global
 * kernel workqueue as soon as possible. This function allows to
 * trigger the removal of servers from within timers, in which
 * sleeping is not allowed.
 */
void schedule_del_server(struct srv_info *srv_info);

/*
 * Schedule the search for a faster server:
 * 1. Detect if the active server is stalled (down). In this case
 *    switch to another server, if possible, and remove the old one
 *    from the list.  If no servers are available to switch to
 *    start the emergency mode.
 * 2. If the emergency mode was not started go through the list of
 *    servers and pick the one with the smallest SRTT.  If this
 *    server meets our requirements (to_jiffies and to_percent)
 *    switch to it.
 */
void schedule_activate_fastest(dnbd2_device_t *dev);