@ -29,6 +29,7 @@
# include "sysemu/iothread.h"
# include "net/colo-compare.h"
# include "migration/colo.h"
# include "migration/migration.h"
# define TYPE_COLO_COMPARE "colo-compare"
# define COLO_COMPARE(obj) \
@ -37,6 +38,9 @@
static QTAILQ_HEAD ( , CompareState ) net_compares =
QTAILQ_HEAD_INITIALIZER ( net_compares ) ;
static NotifierList colo_compare_notifiers =
NOTIFIER_LIST_INITIALIZER ( colo_compare_notifiers ) ;
# define COMPARE_READ_LEN_MAX NET_BUFSIZE
# define MAX_QUEUE_SIZE 1024
@ -326,6 +330,12 @@ static bool colo_mark_tcp_pkt(Packet *ppkt, Packet *spkt,
return false ;
}
static void colo_compare_inconsistency_notify ( void )
{
notifier_list_notify ( & colo_compare_notifiers ,
migrate_get_current ( ) ) ;
}
static void colo_compare_tcp ( CompareState * s , Connection * conn )
{
Packet * ppkt = NULL , * spkt = NULL ;
@ -427,10 +437,7 @@ sec:
qemu_hexdump ( ( char * ) spkt - > data , stderr ,
" colo-compare spkt " , spkt - > size ) ;
/*
* colo_compare_inconsistent_notify ( ) ;
* TODO : notice to checkpoint ( ) ;
*/
colo_compare_inconsistency_notify ( ) ;
}
}
@ -561,8 +568,18 @@ static int colo_old_packet_check_one(Packet *pkt, int64_t *check_time)
}
}
void colo_compare_register_notifier ( Notifier * notify )
{
notifier_list_add ( & colo_compare_notifiers , notify ) ;
}
void colo_compare_unregister_notifier ( Notifier * notify )
{
notifier_remove ( notify ) ;
}
static int colo_old_packet_check_one_conn ( Connection * conn ,
void * user_data )
void * user_data )
{
GList * result = NULL ;
int64_t check_time = REGULAR_PACKET_CHECK_MS ;
@ -573,10 +590,7 @@ static int colo_old_packet_check_one_conn(Connection *conn,
if ( result ) {
/* Do checkpoint will flush old packet */
/*
* TODO : Notify colo frame to do checkpoint .
* colo_compare_inconsistent_notify ( ) ;
*/
colo_compare_inconsistency_notify ( ) ;
return 0 ;
}
@ -620,11 +634,12 @@ static void colo_compare_packet(CompareState *s, Connection *conn,
/*
* If one packet arrive late , the secondary_list or
* primary_list will be empty , so we can ' t compare it
* until next comparison .
* until next comparison . If the packets in the list are
* timeout , it will trigger a checkpoint request .
*/
trace_colo_compare_main ( " packet different " ) ;
g_queue_push_head ( & conn - > primary_list , pkt ) ;
/* TODO: colo_notify_checkpoint();*/
colo_compare_inconsistency_notify ( ) ;
break ;
}
}