if (!(peer->flags & PEER_F_TEACH_PROCESS)) {
int must_send;
- HA_RWLOCK_RDLOCK(STK_TABLE_UPDT_LOCK, &st->table->updt_lock);
+ if (HA_RWLOCK_TRYRDLOCK(STK_TABLE_UPDT_LOCK, &st->table->updt_lock)) {
+ applet_have_more_data(appctx);
+ return -1;
+ }
must_send = (peer->learnstate == PEER_LR_ST_NOTASSIGNED) && (st->last_pushed != st->table->localupdate);
HA_RWLOCK_RDUNLOCK(STK_TABLE_UPDT_LOCK, &st->table->updt_lock);
{
struct peer *peer;
struct shared_table *st;
+ int must_resched = 0;
/* resync timeout set to TICK_ETERNITY means we just start
* a new process and timer was not initialized.
/* For each session */
for (peer = peers->remote; peer; peer = peer->next) {
- HA_SPIN_LOCK(PEER_LOCK, &peer->lock);
+ if (HA_SPIN_TRYLOCK(PEER_LOCK, &peer->lock) != 0) {
+ must_resched = 1;
+ continue;
+ }
sync_peer_learn_state(peers, peer);
sync_peer_app_state(peers, peer);
HA_ATOMIC_OR(&peers->flags, PEERS_F_RESYNC_REMOTE_FINISHED|PEERS_F_DBG_RESYNC_REMOTETIMEOUT);
}
- if ((peers->flags & PEERS_RESYNC_STATEMASK) != PEERS_RESYNC_FINISHED) {
+ if (!must_resched && (peers->flags & PEERS_RESYNC_STATEMASK) != PEERS_RESYNC_FINISHED) {
/* Resync not finished*/
/* reschedule task to resync timeout if not expired, to ended resync if needed */
if (!tick_is_expired(peers->resync_timeout, now_ms))
task->expire = tick_first(task->expire, peers->resync_timeout);
- }
+ } else if (must_resched)
+ task_wakeup(task, TASK_WOKEN_OTHER);
}
/* Process the sync task for a stopping process. It is called from process_peer_sync() only */