unsigned int expire; /* session expiration date */
unsigned int ref_cnt; /* reference count, can only purge when zero */
__decl_thread(HA_RWLOCK_T lock); /* lock related to the table entry */
- int shard; /* shard */
+ int shard; /* shard number used by peers */
+ int seen; /* 0 only when no peer has seen this entry yet */
struct eb32_node exp; /* ebtree node used to hold the session in expiration tree */
struct eb32_node upd; /* ebtree node used to hold the update sequence tree */
struct ebmb_node key; /* ebtree node used to hold the session in table */
static inline struct stksess *peer_teach_process_stksess_lookup(struct shared_table *st)
{
struct eb32_node *eb;
+ struct stksess *ret;
eb = eb32_lookup_ge(&st->table->updates, st->last_pushed+1);
if (!eb) {
return NULL;
}
- return eb32_entry(eb, struct stksess, upd);
+ ret = eb32_entry(eb, struct stksess, upd);
+ if (!_HA_ATOMIC_LOAD(&ret->seen))
+ _HA_ATOMIC_STORE(&ret->seen, 1);
+ return ret;
}
/*
static inline struct stksess *peer_teach_stage1_stksess_lookup(struct shared_table *st)
{
struct eb32_node *eb;
+ struct stksess *ret;
eb = eb32_lookup_ge(&st->table->updates, st->last_pushed+1);
if (!eb) {
return NULL;
}
- return eb32_entry(eb, struct stksess, upd);
+ ret = eb32_entry(eb, struct stksess, upd);
+ if (!_HA_ATOMIC_LOAD(&ret->seen))
+ _HA_ATOMIC_STORE(&ret->seen, 1);
+ return ret;
}
/*
static inline struct stksess *peer_teach_stage2_stksess_lookup(struct shared_table *st)
{
struct eb32_node *eb;
+ struct stksess *ret;
eb = eb32_lookup_ge(&st->table->updates, st->last_pushed+1);
if (!eb || eb->key > st->teaching_origin) {
return NULL;
}
- return eb32_entry(eb, struct stksess, upd);
+ ret = eb32_entry(eb, struct stksess, upd);
+ if (!_HA_ATOMIC_LOAD(&ret->seen))
+ _HA_ATOMIC_STORE(&ret->seen, 1);
+ return ret;
}
/*
memset((void *)ts - t->data_size, 0, t->data_size);
ts->ref_cnt = 0;
ts->shard = 0;
+ ts->seen = 0;
ts->key.node.leaf_p = NULL;
ts->exp.node.leaf_p = NULL;
ts->upd.node.leaf_p = NULL;
/* here we're write-locked */
+ ts->seen = 0;
ts->upd.key = ++t->update;
t->localupdate = t->update;
eb32_delete(&ts->upd);
/* here we're write-locked */
+ ts->seen = 0;
ts->upd.key= (++t->update)+(2147483648U);
eb = eb32_insert(&t->updates, &ts->upd);
if (eb != &ts->upd) {