n: the number of servers that's going to retrieve */
| 146 | |
| 147 | /* n: the number of servers that's going to retrieve */ |
| 148 | void ch_ring_get_servers(const char *const key, const ring_t *const ring, |
| 149 | const unsigned int n, unsigned int *idxs) { |
| 150 | vnode_t *vnodes = ring->vnodes; |
| 151 | int start_vnode_idx = ch_ring_get_vnode_idx(key, ring); |
| 152 | |
| 153 | unsigned int i = 0, vnode_pos = 0; |
| 154 | char chosen_server[ring->n_server]; |
| 155 | memset(chosen_server, 0, sizeof(char) * ring->n_server); |
| 156 | while (i < n) { |
| 157 | unsigned int server_id = |
| 158 | vnodes[(start_vnode_idx + vnode_pos) % (ring->n_point)].server_id; |
| 159 | if (chosen_server[server_id] == 0) { |
| 160 | idxs[i] = server_id; |
| 161 | chosen_server[server_id] = 1; |
| 162 | i++; |
| 163 | } |
| 164 | vnode_pos++; |
| 165 | if (vnode_pos > ring->n_point) { |
| 166 | printf( |
| 167 | "ERROR: searched all points on the consistent hash ring, but cannot " |
| 168 | "find enough servers\n"); |
| 169 | abort(); |
| 170 | } |
| 171 | } |
| 172 | } |
| 173 | |
| 174 | void ch_ring_get_available_servers(const char *const key, |
| 175 | const ring_t *const ring, |
nothing calls this directly
no test coverage detected