This patch makes a two improvements to CFM logging which should
make debugging connectivity problems a bit more intuitive. First,
when a remote_mp disappears, the length of time since its last CCM
reception is logged. Second, the "CFM fault status changed"
message is reformatted in a more intuitive way. Instead of
prefixing additions and deletions with pluses and minuses, the full
old fault status and new fault status are logged.
Requested-by: Ben Basler <bbasler@nicira.com>,
Signed-off-by: Ethan Jackson <ethan@nicira.com>
uint32_t seq; /* Most recently received sequence number. */
uint8_t num_health_ccm; /* Number of received ccm frames every
CFM_HEALTH_INTERVAL * 'fault_interval'. */
uint32_t seq; /* Most recently received sequence number. */
uint8_t num_health_ccm; /* Number of received ccm frames every
CFM_HEALTH_INTERVAL * 'fault_interval'. */
+ long long int last_rx; /* Last CCM reception time. */
-ds_put_cfm_fault(struct ds *ds, int old_fault, int new_fault)
+ds_put_cfm_fault(struct ds *ds, int fault)
{
int i;
for (i = 0; i < CFM_FAULT_N_REASONS; i++) {
int reason = 1 << i;
{
int i;
for (i = 0; i < CFM_FAULT_N_REASONS; i++) {
int reason = 1 << i;
- if ((old_fault | new_fault) & reason) {
- ds_put_format(ds, " %s%s",
- (!(old_fault & reason) ? "+"
- : !(new_fault & reason) ? "-"
- : ""),
- cfm_fault_reason_to_str(reason));
+ if (fault & reason) {
+ ds_put_format(ds, "%s ", cfm_fault_reason_to_str(reason));
HMAP_FOR_EACH_SAFE (rmp, rmp_next, node, &cfm->remote_mps) {
if (!rmp->recv) {
HMAP_FOR_EACH_SAFE (rmp, rmp_next, node, &cfm->remote_mps) {
if (!rmp->recv) {
- VLOG_DBG("%s: no CCM from RMP %"PRIu64" in the last %lldms",
- cfm->name, rmp->mpid, interval);
+ VLOG_INFO("%s: Received no CCM from RMP %"PRIu64" in the last"
+ " %lldms", cfm->name, rmp->mpid,
+ time_msec() - rmp->last_rx);
hmap_remove(&cfm->remote_mps, &rmp->node);
free(rmp);
} else {
hmap_remove(&cfm->remote_mps, &rmp->node);
free(rmp);
} else {
if (old_cfm_fault != cfm->fault && !VLOG_DROP_INFO(&rl)) {
struct ds ds = DS_EMPTY_INITIALIZER;
if (old_cfm_fault != cfm->fault && !VLOG_DROP_INFO(&rl)) {
struct ds ds = DS_EMPTY_INITIALIZER;
- ds_put_cfm_fault(&ds, old_cfm_fault, cfm->fault);
- VLOG_INFO("%s: CFM fault status changed:%s", cfm->name,
- ds_cstr_ro(&ds));
+ ds_put_cstr(&ds, "from [");
+ ds_put_cfm_fault(&ds, old_cfm_fault);
+ ds_put_cstr(&ds, "] to [");
+ ds_put_cfm_fault(&ds, cfm->fault);
+ ds_put_char(&ds, ']');
+ VLOG_INFO("%s: CFM faults changed %s.", cfm->name, ds_cstr(&ds));
cfm->recv_fault |= cfm_fault;
rmp->seq = ccm_seq;
rmp->opup = !ccm_opdown;
cfm->recv_fault |= cfm_fault;
rmp->seq = ccm_seq;
rmp->opup = !ccm_opdown;
+ rmp->last_rx = time_msec();
fault = cfm_get_fault(cfm);
if (fault) {
fault = cfm_get_fault(cfm);
if (fault) {
- ds_put_cstr(ds, "\tfault:");
- ds_put_cfm_fault(ds, fault, fault);
+ ds_put_cstr(ds, "\tfault: ");
+ ds_put_cfm_fault(ds, fault);