net/colo-compare.c: Expose "compare_timeout" to users

The "compare_timeout" determines the maximum time to hold the primary net packet.
This patch expose the "compare_timeout", make user have ability to
adjest the value according to application scenarios.

QMP command demo:
    { "execute": "qom-get",
         "arguments": { "path": "/objects/comp0",
                        "property": "compare_timeout" } }

    { "execute": "qom-set",
         "arguments": { "path": "/objects/comp0",
                        "property": "compare_timeout",
                        "value": 5000} }

Signed-off-by: Zhang Chen <chen.zhang@intel.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Zhang Chen 2020-03-18 16:23:19 +08:00 committed by Jason Wang
parent 767cc9a9c1
commit 9cc43c94b3
2 changed files with 50 additions and 5 deletions

View File

@ -50,6 +50,7 @@ static NotifierList colo_compare_notifiers =
/* TODO: Should be configurable */ /* TODO: Should be configurable */
#define REGULAR_PACKET_CHECK_MS 3000 #define REGULAR_PACKET_CHECK_MS 3000
#define DEFAULT_TIME_OUT_MS 3000
static QemuMutex event_mtx; static QemuMutex event_mtx;
static QemuCond event_complete_cond; static QemuCond event_complete_cond;
@ -92,6 +93,7 @@ typedef struct CompareState {
SocketReadState sec_rs; SocketReadState sec_rs;
SocketReadState notify_rs; SocketReadState notify_rs;
bool vnet_hdr; bool vnet_hdr;
uint32_t compare_timeout;
/* /*
* Record the connection that through the NIC * Record the connection that through the NIC
@ -607,10 +609,9 @@ static int colo_old_packet_check_one_conn(Connection *conn,
CompareState *s) CompareState *s)
{ {
GList *result = NULL; GList *result = NULL;
int64_t check_time = REGULAR_PACKET_CHECK_MS;
result = g_queue_find_custom(&conn->primary_list, result = g_queue_find_custom(&conn->primary_list,
&check_time, &s->compare_timeout,
(GCompareFunc)colo_old_packet_check_one); (GCompareFunc)colo_old_packet_check_one);
if (result) { if (result) {
@ -984,6 +985,39 @@ static void compare_set_notify_dev(Object *obj, const char *value, Error **errp)
s->notify_dev = g_strdup(value); s->notify_dev = g_strdup(value);
} }
static void compare_get_timeout(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
CompareState *s = COLO_COMPARE(obj);
uint32_t value = s->compare_timeout;
visit_type_uint32(v, name, &value, errp);
}
static void compare_set_timeout(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
CompareState *s = COLO_COMPARE(obj);
Error *local_err = NULL;
uint32_t value;
visit_type_uint32(v, name, &value, &local_err);
if (local_err) {
goto out;
}
if (!value) {
error_setg(&local_err, "Property '%s.%s' requires a positive value",
object_get_typename(obj), name);
goto out;
}
s->compare_timeout = value;
out:
error_propagate(errp, local_err);
}
static void compare_pri_rs_finalize(SocketReadState *pri_rs) static void compare_pri_rs_finalize(SocketReadState *pri_rs)
{ {
CompareState *s = container_of(pri_rs, CompareState, pri_rs); CompareState *s = container_of(pri_rs, CompareState, pri_rs);
@ -1090,6 +1124,11 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
return; return;
} }
if (!s->compare_timeout) {
/* Set default value to 3000 MS */
s->compare_timeout = DEFAULT_TIME_OUT_MS;
}
if (find_and_check_chardev(&chr, s->pri_indev, errp) || if (find_and_check_chardev(&chr, s->pri_indev, errp) ||
!qemu_chr_fe_init(&s->chr_pri_in, chr, errp)) { !qemu_chr_fe_init(&s->chr_pri_in, chr, errp)) {
return; return;
@ -1185,6 +1224,10 @@ static void colo_compare_init(Object *obj)
compare_get_notify_dev, compare_set_notify_dev, compare_get_notify_dev, compare_set_notify_dev,
NULL); NULL);
object_property_add(obj, "compare_timeout", "uint32",
compare_get_timeout,
compare_set_timeout, NULL, NULL, NULL);
s->vnet_hdr = false; s->vnet_hdr = false;
object_property_add_bool(obj, "vnet_hdr_support", compare_get_vnet_hdr, object_property_add_bool(obj, "vnet_hdr_support", compare_get_vnet_hdr,
compare_set_vnet_hdr, NULL); compare_set_vnet_hdr, NULL);

View File

@ -4615,7 +4615,7 @@ SRST
stored. The file format is libpcap, so it can be analyzed with stored. The file format is libpcap, so it can be analyzed with
tools such as tcpdump or Wireshark. tools such as tcpdump or Wireshark.
``-object colo-compare,id=id,primary_in=chardevid,secondary_in=chardevid,outdev=chardevid,iothread=id[,vnet_hdr_support][,notify_dev=id]`` ``-object colo-compare,id=id,primary_in=chardevid,secondary_in=chardevid,outdev=chardevid,iothread=id[,vnet_hdr_support][,notify_dev=id][,compare_timeout=@var{ms}]``
Colo-compare gets packet from primary\_inchardevid and Colo-compare gets packet from primary\_inchardevid and
secondary\_inchardevid, than compare primary packet with secondary\_inchardevid, than compare primary packet with
secondary packet. If the packets are same, we will output secondary packet. If the packets are same, we will output
@ -4624,8 +4624,10 @@ SRST
outdevchardevid. In order to improve efficiency, we need to put outdevchardevid. In order to improve efficiency, we need to put
the task of comparison in another thread. If it has the the task of comparison in another thread. If it has the
vnet\_hdr\_support flag, colo compare will send/recv packet with vnet\_hdr\_support flag, colo compare will send/recv packet with
vnet\_hdr\_len. If you want to use Xen COLO, will need the vnet\_hdr\_len. Then compare\_timeout=@var{ms} determines the
notify\_dev to notify Xen colo-frame to do checkpoint. maximum delay colo-compare wait for the packet.
If you want to use Xen COLO, will need the notify\_dev to
notify Xen colo-frame to do checkpoint.
we must use it with the help of filter-mirror and we must use it with the help of filter-mirror and
filter-redirector. filter-redirector.