diff --git a/src/mirror.h b/src/mirror.h new file mode 100644 index 0000000..9e4ee0c --- /dev/null +++ b/src/mirror.h @@ -0,0 +1,94 @@ +#ifndef MIRROR_H +#define MIRROR_H + +#include +#include +#include + +#include "bitset.h" +#include "self_pipe.h" +enum mirror_state; +#include "serve.h" + +/* MS_CONNECT_TIME_SECS + * The length of time after which the sender will assume a connect() to + * the destination has failed. + */ +#define MS_CONNECT_TIME_SECS 60 + +/* MS_HELLO_TIME_SECS + * The length of time the sender will wait for the NBD hello message + * after connect() before aborting the connection attempt. + */ +#define MS_HELLO_TIME_SECS 5 + + +/* MS_RETRY_DELAY_SECS + * The delay after a failed migration attempt before launching another + * thread to try again. + */ +#define MS_RETRY_DELAY_SECS 1 + +enum mirror_finish_action { + ACTION_EXIT, + ACTION_NOTHING +}; + +enum mirror_state { + MS_UNKNOWN, + MS_INIT, + MS_GO, + MS_FINALISE, + MS_DONE, + MS_FAIL_CONNECT, + MS_FAIL_REJECTED, + MS_FAIL_NO_HELLO, + MS_FAIL_SIZE_MISMATCH +}; + +struct mirror_status { + pthread_t thread; + /* set to 1, then join thread to make mirror terminate early */ + int signal_abandon; + union mysockaddr * connect_to; + union mysockaddr * connect_from; + int client; + const char * filename; + off64_t max_bytes_per_second; + enum mirror_finish_action action_at_finish; + + char *mapped; + struct bitset_mapping *dirty_map; + + enum mirror_state commit_state; + + /* commit_signal is sent immediately after attempting to connect + * and checking the remote size, whether successful or not. + */ + struct self_pipe * commit_signal; +}; + + +struct mirror_super { + struct mirror_status * mirror; + pthread_t thread; + struct mbox * state_mbox; +}; + + + +/* We need these declaration to get around circular dependencies in the + * .h's + */ +struct server; +struct flexnbd; + +struct mirror_super * mirror_super_create( + const char * filename, + union mysockaddr * connect_to, + union mysockaddr * connect_from, + int max_Bps, + int action_at_finish); +void * mirror_super_runner( void * serve_uncast ); +enum mirror_state mirror_super_wait( struct mirror_super * ); +#endif