summaryrefslogtreecommitdiffstats
path: root/src/director/director-host.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/director/director-host.h81
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