MEDIUM: peers: re-schedule stick-table's entry for sync when data is modified.
This was correctly done for data of type 'serverid' but it is now
necessary for all stick-tables data-types if we want to perform their
sync.
diff --git a/src/stream.c b/src/stream.c
index 0b70e28..0a38f2e 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -448,7 +448,7 @@
{
struct session *sess = s->sess;
unsigned long long bytes;
- void *ptr;
+ void *ptr1,*ptr2;
int i;
bytes = s->req.total - s->logs.bytes_in;
@@ -473,14 +473,18 @@
continue;
}
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_CNT);
- if (ptr)
- stktable_data_cast(ptr, bytes_in_cnt) += bytes;
+ ptr1 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_CNT);
+ if (ptr1)
+ stktable_data_cast(ptr1, bytes_in_cnt) += bytes;
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_RATE);
- if (ptr)
- update_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
+ ptr2 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_RATE);
+ if (ptr2)
+ update_freq_ctr_period(&stktable_data_cast(ptr2, bytes_in_rate),
stkctr->table->data_arg[STKTABLE_DT_BYTES_IN_RATE].u, bytes);
+
+ /* If data was modified, we need to touch to re-schedule sync */
+ if (ptr1 || ptr2)
+ stktable_touch(stkctr->table, stkctr_entry(stkctr), 1);
}
}
@@ -506,14 +510,18 @@
continue;
}
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_CNT);
- if (ptr)
- stktable_data_cast(ptr, bytes_out_cnt) += bytes;
+ ptr1 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_CNT);
+ if (ptr1)
+ stktable_data_cast(ptr1, bytes_out_cnt) += bytes;
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_RATE);
- if (ptr)
- update_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
+ ptr2 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_RATE);
+ if (ptr2)
+ update_freq_ctr_period(&stktable_data_cast(ptr2, bytes_out_rate),
stkctr->table->data_arg[STKTABLE_DT_BYTES_OUT_RATE].u, bytes);
+
+ /* If data was modified, we need to touch to re-schedule sync */
+ if (ptr1 || ptr2)
+ stktable_touch(stkctr->table, stkctr_entry(stkctr), 1);
}
}
}
@@ -2688,22 +2696,25 @@
smp->type = SMP_T_UINT;
smp->data.uint = 0;
if (stkctr_entry(stkctr) != NULL) {
- void *ptr;
+ void *ptr1,*ptr2;
/* First, update gpc0_rate if it's tracked. Second, update its
* gpc0 if tracked. Returns gpc0's value otherwise the curr_ctr.
*/
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0_RATE);
- if (ptr) {
- update_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
+ ptr1 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0_RATE);
+ if (ptr1) {
+ update_freq_ctr_period(&stktable_data_cast(ptr1, gpc0_rate),
stkctr->table->data_arg[STKTABLE_DT_GPC0_RATE].u, 1);
- smp->data.uint = (&stktable_data_cast(ptr, gpc0_rate))->curr_ctr;
+ smp->data.uint = (&stktable_data_cast(ptr1, gpc0_rate))->curr_ctr;
}
- ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0);
- if (ptr)
- smp->data.uint = ++stktable_data_cast(ptr, gpc0);
+ ptr2 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0);
+ if (ptr2)
+ smp->data.uint = ++stktable_data_cast(ptr2, gpc0);
+ /* If data was modified, we need to touch to re-schedule sync */
+ if (ptr1 || ptr2)
+ stktable_touch(stkctr->table, stkctr_entry(stkctr), 1);
}
return 1;
}
@@ -2729,6 +2740,8 @@
return 0; /* parameter not stored */
smp->data.uint = stktable_data_cast(ptr, gpc0);
stktable_data_cast(ptr, gpc0) = 0;
+ /* If data was modified, we need to touch to re-schedule sync */
+ stktable_touch(stkctr->table, stkctr_entry(stkctr), 1);
}
return 1;
}
@@ -2814,6 +2827,7 @@
smp->type = SMP_T_UINT;
smp->data.uint = ++stktable_data_cast(ptr, conn_cnt);
+ /* Touch was previously performed by stktable_update_key */
smp->flags = SMP_F_VOL_TEST;
return 1;
}