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

The "expired_scan_cycle" determines period of scanning expired
primary node net packets.

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:20 +08:00 committed by Jason Wang
parent 9cc43c94b3
commit cca35ac4d1
2 changed files with 48 additions and 4 deletions

View File

@ -48,7 +48,6 @@ static NotifierList colo_compare_notifiers =
#define COLO_COMPARE_FREE_PRIMARY 0x01 #define COLO_COMPARE_FREE_PRIMARY 0x01
#define COLO_COMPARE_FREE_SECONDARY 0x02 #define COLO_COMPARE_FREE_SECONDARY 0x02
/* TODO: Should be configurable */
#define REGULAR_PACKET_CHECK_MS 3000 #define REGULAR_PACKET_CHECK_MS 3000
#define DEFAULT_TIME_OUT_MS 3000 #define DEFAULT_TIME_OUT_MS 3000
@ -94,6 +93,7 @@ typedef struct CompareState {
SocketReadState notify_rs; SocketReadState notify_rs;
bool vnet_hdr; bool vnet_hdr;
uint32_t compare_timeout; uint32_t compare_timeout;
uint32_t expired_scan_cycle;
/* /*
* Record the connection that through the NIC * Record the connection that through the NIC
@ -823,7 +823,7 @@ static void check_old_packet_regular(void *opaque)
/* if have old packet we will notify checkpoint */ /* if have old packet we will notify checkpoint */
colo_old_packet_check(s); colo_old_packet_check(s);
timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) +
REGULAR_PACKET_CHECK_MS); s->expired_scan_cycle);
} }
/* Public API, Used for COLO frame to notify compare event */ /* Public API, Used for COLO frame to notify compare event */
@ -853,7 +853,7 @@ static void colo_compare_timer_init(CompareState *s)
SCALE_MS, check_old_packet_regular, SCALE_MS, check_old_packet_regular,
s); s);
timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) +
REGULAR_PACKET_CHECK_MS); s->expired_scan_cycle);
} }
static void colo_compare_timer_del(CompareState *s) static void colo_compare_timer_del(CompareState *s)
@ -1018,6 +1018,39 @@ out:
error_propagate(errp, local_err); error_propagate(errp, local_err);
} }
static void compare_get_expired_scan_cycle(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
CompareState *s = COLO_COMPARE(obj);
uint32_t value = s->expired_scan_cycle;
visit_type_uint32(v, name, &value, errp);
}
static void compare_set_expired_scan_cycle(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->expired_scan_cycle = 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);
@ -1129,6 +1162,11 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
s->compare_timeout = DEFAULT_TIME_OUT_MS; s->compare_timeout = DEFAULT_TIME_OUT_MS;
} }
if (!s->expired_scan_cycle) {
/* Set default value to 3000 MS */
s->expired_scan_cycle = REGULAR_PACKET_CHECK_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;
@ -1228,6 +1266,10 @@ static void colo_compare_init(Object *obj)
compare_get_timeout, compare_get_timeout,
compare_set_timeout, NULL, NULL, NULL); compare_set_timeout, NULL, NULL, NULL);
object_property_add(obj, "expired_scan_cycle", "uint32",
compare_get_expired_scan_cycle,
compare_set_expired_scan_cycle, 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][,compare_timeout=@var{ms}]`` ``-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}][,expired_scan_cycle=@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
@ -4626,6 +4626,8 @@ SRST
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. Then compare\_timeout=@var{ms} determines the vnet\_hdr\_len. Then compare\_timeout=@var{ms} determines the
maximum delay colo-compare wait for the packet. maximum delay colo-compare wait for the packet.
The expired\_scan\_cycle=@var{ms} to set the period of scanning
expired primary node network packets.
If you want to use Xen COLO, will need the notify\_dev to If you want to use Xen COLO, will need the notify\_dev to
notify Xen colo-frame to do checkpoint. notify Xen colo-frame to do checkpoint.