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 <yhalp...@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 > _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel