diff options
Diffstat (limited to '')
-rw-r--r-- | src/director/director-host.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/director/director-host.h b/src/director/director-host.h new file mode 100644 index 0000000..3bf05d2 --- /dev/null +++ b/src/director/director-host.h @@ -0,0 +1,81 @@ +#ifndef DIRECTOR_HOST_H +#define DIRECTOR_HOST_H + +#include "net.h" + +struct director; + +struct director_host { + struct director *dir; + int refcount; + + struct ip_addr ip; + char *ip_str; + in_port_t port; + + /* name contains "ip:port" */ + char *name; + /* change commands each have originating host and originating sequence. + we'll keep track of the highest sequence we've seen from the host. + if we find a lower sequence, we've already handled the command and + it can be ignored (or: it must be ignored to avoid potential command + loops) */ + unsigned int last_seq; + /* use these to avoid infinitely sending SYNCs for directors that + aren't connected in the ring. */ + unsigned int last_sync_seq, last_sync_seq_counter, last_sync_timestamp; + /* whenever we receive a SYNC with stale hosts_hash, set this. if it's + already set and equals the current hosts_hash, re-send our hosts to + everybody in case they somehow got out of sync. */ + unsigned int desynced_hosts_hash; + /* Last time host was detected to be down */ + time_t last_network_failure; + time_t last_protocol_failure; + + /* When we finish getting a right connection, send a SYNC with these + parameters (if delayed_sync_seq != 0) */ + uint32_t delayed_sync_seq; + unsigned int delayed_sync_minor_version; + unsigned int delayed_sync_timestamp; + unsigned int delayed_sync_hosts_hash; + + /* we are this director */ + bool self:1; + bool removed:1; +}; + +struct director_host * +director_host_add(struct director *dir, const struct ip_addr *ip, + in_port_t port); +void director_host_free(struct director_host **host); + +void director_host_ref(struct director_host *host); +void director_host_unref(struct director_host *host); + +void director_host_restarted(struct director_host *host); + +struct director_host * +director_host_get(struct director *dir, const struct ip_addr *ip, + in_port_t port); +struct director_host * +director_host_lookup(struct director *dir, const struct ip_addr *ip, + in_port_t port); +struct director_host * +director_host_lookup_ip(struct director *dir, const struct ip_addr *ip); + +/* Returns 0 if b1 equals b2. + -1 if b1 is closer to our left side than b2 or + -1 if b2 is closer to our right side than b1 + 1 vice versa */ +int director_host_cmp_to_self(const struct director_host *b1, + const struct director_host *b2, + const struct director_host *self); +/* Compare directors by IP/port. */ +int director_host_cmp_p(struct director_host *const *host1, + struct director_host *const *host2); + +/* Parse hosts list (e.g. "host1:port host2 host3:port") and them as + directors */ +void director_host_add_from_string(struct director *dir, const char *hosts); + +#endif |