Re: [Qemu-devel] [PATCH V2 4/5] COLO-compare: Add colo-compare remote notify support

2019-06-27 Thread Zhang, Chen

> -Original Message-
> From: Jason Wang [mailto:jasow...@redhat.com]
> Sent: Thursday, June 27, 2019 9:58 AM
> To: Zhang, Chen ; Li Zhijian ;
> Dr. David Alan Gilbert ; Juan Quintela
> ; zhanghailiang ;
> qemu-dev ; Stefano Stabellini
> ; Paul Durrant 
> Cc: Zhang Chen 
> Subject: Re: [Qemu-devel] [PATCH V2 4/5] COLO-compare: Add colo-compare
> remote notify support
> 
> 
> On 2019/6/10 上午12:44, Zhang Chen wrote:
> > From: Zhang Chen 
> >
> > This patch make colo-compare can send message to remote COLO frame(Xen)
> when occur checkpoint.
> >
> > Signed-off-by: Zhang Chen 
> > ---
> >   net/colo-compare.c | 54 +
> -
> >   1 file changed, 44 insertions(+), 10 deletions(-)
> >
> > diff --git a/net/colo-compare.c b/net/colo-compare.c index
> > 16285f4a96..516b651ecd 100644
> > --- a/net/colo-compare.c
> > +++ b/net/colo-compare.c
> > @@ -120,11 +120,6 @@ enum {
> >   SECONDARY_IN,
> >   };
> >
> > -static void colo_compare_inconsistency_notify(void)
> > -{
> > -notifier_list_notify(_compare_notifiers,
> > -migrate_get_current());
> > -}
> >
> >   static int compare_chr_send(CompareState *s,
> >   const uint8_t *buf, @@ -132,6 +127,27 @@
> > static int compare_chr_send(CompareState *s,
> >   uint32_t vnet_hdr_len,
> >   bool notify_remote_frame);
> >
> > +static void notify_remote_frame(CompareState *s) {
> > +char msg[] = "DO_CHECKPOINT";
> > +int ret = 0;
> > +
> > +ret = compare_chr_send(s, (uint8_t *)msg, strlen(msg), 0, true);
> > +if (ret < 0) {
> > +error_report("Notify Xen COLO-frame failed");
> > +}
> > +}
> > +
> > +static void colo_compare_inconsistency_notify(CompareState *s) {
> > +if (s->notify_dev) {
> > +notify_remote_frame(s);
> > +} else {
> > +notifier_list_notify(_compare_notifiers,
> > + migrate_get_current());
> > +}
> > +}
> > +
> >   static gint seq_sorter(Packet *a, Packet *b, gpointer data)
> >   {
> >   struct tcp_hdr *atcp, *btcp;
> > @@ -435,7 +451,7 @@ sec:
> >   qemu_hexdump((char *)spkt->data, stderr,
> >"colo-compare spkt", spkt->size);
> >
> > -colo_compare_inconsistency_notify();
> > +colo_compare_inconsistency_notify(s);
> >   }
> >   }
> >
> > @@ -577,7 +593,7 @@ void colo_compare_unregister_notifier(Notifier
> *notify)
> >   }
> >
> >   static int colo_old_packet_check_one_conn(Connection *conn,
> > -   void *user_data)
> > +  CompareState *s)
> >   {
> >   GList *result = NULL;
> >   int64_t check_time = REGULAR_PACKET_CHECK_MS; @@ -588,7 +604,7
> > @@ static int colo_old_packet_check_one_conn(Connection *conn,
> >
> >   if (result) {
> >   /* Do checkpoint will flush old packet */
> > -colo_compare_inconsistency_notify();
> > +colo_compare_inconsistency_notify(s);
> >   return 0;
> >   }
> >
> > @@ -608,7 +624,7 @@ static void colo_old_packet_check(void *opaque)
> >* If we find one old packet, stop finding job and notify
> >* COLO frame do checkpoint.
> >*/
> > -g_queue_find_custom(>conn_list, NULL,
> > +g_queue_find_custom(>conn_list, s,
> >   (GCompareFunc)colo_old_packet_check_one_conn);
> >   }
> >
> > @@ -637,7 +653,8 @@ static void colo_compare_packet(CompareState *s,
> Connection *conn,
> >*/
> >   trace_colo_compare_main("packet different");
> >   g_queue_push_head(>primary_list, pkt);
> > -colo_compare_inconsistency_notify();
> > +
> > +colo_compare_inconsistency_notify(s);
> >   break;
> >   }
> >   }
> > @@ -989,7 +1006,24 @@ static void
> > compare_sec_rs_finalize(SocketReadState *sec_rs)
> >
> >   static void compare_notify_rs_finalize(SocketReadState *notify_rs)
> >   {
> > +CompareState *s = container_of(notify_rs, CompareState,
> > + notify_rs);
> > +
> >   /* Get Xen colo-frame's notify and handle the message */
> > +char *data = g_mem

Re: [Qemu-devel] [PATCH V2 4/5] COLO-compare: Add colo-compare remote notify support

2019-06-26 Thread Jason Wang



On 2019/6/10 上午12:44, Zhang Chen wrote:

From: Zhang Chen 

This patch make colo-compare can send message to remote COLO frame(Xen) when 
occur checkpoint.

Signed-off-by: Zhang Chen 
---
  net/colo-compare.c | 54 +-
  1 file changed, 44 insertions(+), 10 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 16285f4a96..516b651ecd 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -120,11 +120,6 @@ enum {
  SECONDARY_IN,
  };
  
-static void colo_compare_inconsistency_notify(void)

-{
-notifier_list_notify(_compare_notifiers,
-migrate_get_current());
-}
  
  static int compare_chr_send(CompareState *s,

  const uint8_t *buf,
@@ -132,6 +127,27 @@ static int compare_chr_send(CompareState *s,
  uint32_t vnet_hdr_len,
  bool notify_remote_frame);
  
+static void notify_remote_frame(CompareState *s)

+{
+char msg[] = "DO_CHECKPOINT";
+int ret = 0;
+
+ret = compare_chr_send(s, (uint8_t *)msg, strlen(msg), 0, true);
+if (ret < 0) {
+error_report("Notify Xen COLO-frame failed");
+}
+}
+
+static void colo_compare_inconsistency_notify(CompareState *s)
+{
+if (s->notify_dev) {
+notify_remote_frame(s);
+} else {
+notifier_list_notify(_compare_notifiers,
+ migrate_get_current());
+}
+}
+
  static gint seq_sorter(Packet *a, Packet *b, gpointer data)
  {
  struct tcp_hdr *atcp, *btcp;
@@ -435,7 +451,7 @@ sec:
  qemu_hexdump((char *)spkt->data, stderr,
   "colo-compare spkt", spkt->size);
  
-colo_compare_inconsistency_notify();

+colo_compare_inconsistency_notify(s);
  }
  }
  
@@ -577,7 +593,7 @@ void colo_compare_unregister_notifier(Notifier *notify)

  }
  
  static int colo_old_packet_check_one_conn(Connection *conn,

-   void *user_data)
+  CompareState *s)
  {
  GList *result = NULL;
  int64_t check_time = REGULAR_PACKET_CHECK_MS;
@@ -588,7 +604,7 @@ static int colo_old_packet_check_one_conn(Connection *conn,
  
  if (result) {

  /* Do checkpoint will flush old packet */
-colo_compare_inconsistency_notify();
+colo_compare_inconsistency_notify(s);
  return 0;
  }
  
@@ -608,7 +624,7 @@ static void colo_old_packet_check(void *opaque)

   * If we find one old packet, stop finding job and notify
   * COLO frame do checkpoint.
   */
-g_queue_find_custom(>conn_list, NULL,
+g_queue_find_custom(>conn_list, s,
  (GCompareFunc)colo_old_packet_check_one_conn);
  }
  
@@ -637,7 +653,8 @@ static void colo_compare_packet(CompareState *s, Connection *conn,

   */
  trace_colo_compare_main("packet different");
  g_queue_push_head(>primary_list, pkt);
-colo_compare_inconsistency_notify();
+
+colo_compare_inconsistency_notify(s);
  break;
  }
  }
@@ -989,7 +1006,24 @@ static void compare_sec_rs_finalize(SocketReadState 
*sec_rs)
  
  static void compare_notify_rs_finalize(SocketReadState *notify_rs)

  {
+CompareState *s = container_of(notify_rs, CompareState, notify_rs);
+
  /* Get Xen colo-frame's notify and handle the message */
+char *data = g_memdup(notify_rs->buf, notify_rs->packet_len);
+char msg[] = "COLO_COMPARE_GET_XEN_INIT";
+int ret;
+
+if (!strcmp(data, "COLO_USERSPACE_PROXY_INIT")) {
+ret = compare_chr_send(s, (uint8_t *)msg, strlen(msg), 0, true);
+if (ret < 0) {
+error_report("Notify Xen COLO-frame INIT failed");
+}
+}
+
+if (!strcmp(data, "COLO_CHECKPOINT")) {
+/* colo-compare do checkpoint, flush pri packet and remove sec packet 
*/
+g_queue_foreach(>conn_list, colo_flush_packets, s);
+}
  }



This protocol looks too simple, is this accepted by Xen?

Thanks


  
  /*




[Qemu-devel] [PATCH V2 4/5] COLO-compare: Add colo-compare remote notify support

2019-06-09 Thread Zhang Chen
From: Zhang Chen 

This patch make colo-compare can send message to remote COLO frame(Xen) when 
occur checkpoint.

Signed-off-by: Zhang Chen 
---
 net/colo-compare.c | 54 +-
 1 file changed, 44 insertions(+), 10 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 16285f4a96..516b651ecd 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -120,11 +120,6 @@ enum {
 SECONDARY_IN,
 };
 
-static void colo_compare_inconsistency_notify(void)
-{
-notifier_list_notify(_compare_notifiers,
-migrate_get_current());
-}
 
 static int compare_chr_send(CompareState *s,
 const uint8_t *buf,
@@ -132,6 +127,27 @@ static int compare_chr_send(CompareState *s,
 uint32_t vnet_hdr_len,
 bool notify_remote_frame);
 
+static void notify_remote_frame(CompareState *s)
+{
+char msg[] = "DO_CHECKPOINT";
+int ret = 0;
+
+ret = compare_chr_send(s, (uint8_t *)msg, strlen(msg), 0, true);
+if (ret < 0) {
+error_report("Notify Xen COLO-frame failed");
+}
+}
+
+static void colo_compare_inconsistency_notify(CompareState *s)
+{
+if (s->notify_dev) {
+notify_remote_frame(s);
+} else {
+notifier_list_notify(_compare_notifiers,
+ migrate_get_current());
+}
+}
+
 static gint seq_sorter(Packet *a, Packet *b, gpointer data)
 {
 struct tcp_hdr *atcp, *btcp;
@@ -435,7 +451,7 @@ sec:
 qemu_hexdump((char *)spkt->data, stderr,
  "colo-compare spkt", spkt->size);
 
-colo_compare_inconsistency_notify();
+colo_compare_inconsistency_notify(s);
 }
 }
 
@@ -577,7 +593,7 @@ void colo_compare_unregister_notifier(Notifier *notify)
 }
 
 static int colo_old_packet_check_one_conn(Connection *conn,
-   void *user_data)
+  CompareState *s)
 {
 GList *result = NULL;
 int64_t check_time = REGULAR_PACKET_CHECK_MS;
@@ -588,7 +604,7 @@ static int colo_old_packet_check_one_conn(Connection *conn,
 
 if (result) {
 /* Do checkpoint will flush old packet */
-colo_compare_inconsistency_notify();
+colo_compare_inconsistency_notify(s);
 return 0;
 }
 
@@ -608,7 +624,7 @@ static void colo_old_packet_check(void *opaque)
  * If we find one old packet, stop finding job and notify
  * COLO frame do checkpoint.
  */
-g_queue_find_custom(>conn_list, NULL,
+g_queue_find_custom(>conn_list, s,
 (GCompareFunc)colo_old_packet_check_one_conn);
 }
 
@@ -637,7 +653,8 @@ static void colo_compare_packet(CompareState *s, Connection 
*conn,
  */
 trace_colo_compare_main("packet different");
 g_queue_push_head(>primary_list, pkt);
-colo_compare_inconsistency_notify();
+
+colo_compare_inconsistency_notify(s);
 break;
 }
 }
@@ -989,7 +1006,24 @@ static void compare_sec_rs_finalize(SocketReadState 
*sec_rs)
 
 static void compare_notify_rs_finalize(SocketReadState *notify_rs)
 {
+CompareState *s = container_of(notify_rs, CompareState, notify_rs);
+
 /* Get Xen colo-frame's notify and handle the message */
+char *data = g_memdup(notify_rs->buf, notify_rs->packet_len);
+char msg[] = "COLO_COMPARE_GET_XEN_INIT";
+int ret;
+
+if (!strcmp(data, "COLO_USERSPACE_PROXY_INIT")) {
+ret = compare_chr_send(s, (uint8_t *)msg, strlen(msg), 0, true);
+if (ret < 0) {
+error_report("Notify Xen COLO-frame INIT failed");
+}
+}
+
+if (!strcmp(data, "COLO_CHECKPOINT")) {
+/* colo-compare do checkpoint, flush pri packet and remove sec packet 
*/
+g_queue_foreach(>conn_list, colo_flush_packets, s);
+}
 }
 
 /*
-- 
2.17.GIT