[Spice-devel] [PATCH migration 02/19] server/spice.h: semi-seamless migration interface, RHBZ #738266
Alon Levy
alevy at redhat.com
Tue Nov 1 01:33:48 PDT 2011
On Wed, Oct 12, 2011 at 12:38:52PM +0200, Yonit Halperin wrote:
> semi-seamless migration details:
>
ACK
> migration source side
> ---------------------
> (1) spice_server_migrate_connect (*): tell client to link
> to the target side - send SPICE_MSG_MAIN_MIGRATE_BEGIN.
> This should be called upon client_migrate_info cmd.
> client_migrate_info is asynchronous.
> (2) Complete spice_server_migrate_connect only when the client has been connected
> to the target - wait for SPICE_MSGC_MAIN_MIGRATE_(CONNECTED|CONNECT_ERROR) or a timeout.
> (3) spice_server_migrate_end: tell client migration it can switch to the target - send
> SPICE_MSG_MAIN_MIGRATE_END.
> (4) client cleans up all data related to the connection to the source and switches to the target.
> It sends SPICE_MSGC_MAIN_MIGRATE_END.
>
> migration target side
> ---------------------
> (1) the server identifies itself as a migraiton target since the client is linked with (connection_id != 0)
> (2) server doesn't start the channels' logic (channel->link) till it receives SPICE_MSGC_MAIN_MIGRATE_END
> from the client.
>
> * After migration starts, the target qemu is blocked and cannot accept new spice client
> connections. Thus, we trigger the connection to the target upon client_migrate_info
> command.
> (cherry picked from commit 6e56bea67c5648b0c81990171d4bc0cf1a402043 branch 0.8)
>
> Conflicts:
>
> server/spice.h
>
> Signed-off-by: Yonit Halperin <yhalperi at redhat.com>
> ---
> server/reds.c | 9 +++++++++
> server/spice-experimental.h | 3 ---
> server/spice.h | 27 ++++++++++++++++++++++++++-
> 3 files changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/server/reds.c b/server/reds.c
> index ff609ce..79c2796 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -3858,6 +3858,15 @@ SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *s, int enab
> return 0;
> }
>
> +/* semi-seamless client migration */
> +SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s, const char* dest,
> + int port, int secure_port,
> + const char* cert_subject)
> +{
> + red_printf("not implemented yet");
> + return 0;
> +}
> +
> SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *s, const char* dest,
> int port, int secure_port,
> const char* cert_subject)
> diff --git a/server/spice-experimental.h b/server/spice-experimental.h
> index 482ac44..6997aa0 100644
> --- a/server/spice-experimental.h
> +++ b/server/spice-experimental.h
> @@ -29,16 +29,13 @@ void spice_server_net_wire_recv_packet(SpiceNetWireInstance *sin,
> const uint8_t *pkt, int len);
>
> /* spice seamless client migration (broken) */
> -
> enum {
> SPICE_MIGRATE_CLIENT_NONE = 1,
> SPICE_MIGRATE_CLIENT_WAITING,
> SPICE_MIGRATE_CLIENT_READY,
> };
>
> -int spice_server_migrate_start(SpiceServer *s);
> int spice_server_migrate_client_state(SpiceServer *s);
> -int spice_server_migrate_end(SpiceServer *s, int completed);
>
> #endif // __SPICE_EXPERIMENTAL_H__
>
> diff --git a/server/spice.h b/server/spice.h
> index 74f9fdb..974975a 100644
> --- a/server/spice.h
> +++ b/server/spice.h
> @@ -475,8 +475,26 @@ int spice_server_set_agent_copypaste(SpiceServer *s, int enable);
> int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
> int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
>
> -/* spice switch-host client migration */
> +/* migration interface */
> +#define SPICE_INTERFACE_MIGRATION "migration"
> +#define SPICE_INTERFACE_MIGRATION_MAJOR 1
> +#define SPICE_INTERFACE_MIGRATION_MINOR 1
> +typedef struct SpiceMigrateInterface SpiceMigrateInterface;
> +typedef struct SpiceMigrateInstance SpiceMigrateInstance;
> +typedef struct SpiceMigrateState SpiceMigrateState;
> +
> +struct SpiceMigrateInterface {
> + SpiceBaseInterface base;
> + void (*migrate_connect_complete)(SpiceMigrateInstance *sin);
> + void (*migrate_end_complete)(SpiceMigrateInstance *sin);
> +};
> +
> +struct SpiceMigrateInstance {
> + SpiceBaseInstance base;
> + SpiceMigrateState *st;
> +};
>
> +/* spice switch-host client migration */
> int spice_server_migrate_info(SpiceServer *s, const char* dest,
> int port, int secure_port,
> const char* cert_subject);
> @@ -485,4 +503,11 @@ int spice_server_migrate_switch(SpiceServer *s);
> /* server status */
> int spice_server_get_num_clients(SpiceServer *s);
>
> +/* spice (semi-)seamless client migration */
> +int spice_server_migrate_connect(SpiceServer *s, const char* dest,
> + int port, int secure_port,
> + const char* cert_subject);
> +int spice_server_migrate_start(SpiceServer *s);
> +int spice_server_migrate_end(SpiceServer *s, int completed);
> +
> #endif
> --
> 1.7.6.4
>
More information about the Spice-devel
mailing list