the-algorithm/src/java/com/twitter/search/earlybird/common/CaughtUpMonitor.java
twitter-team ef4c5eb65e Twitter Recommendation Algorithm
Please note we have force-pushed a new initial commit in order to remove some publicly-available Twitter user information. Note that this process may be required in the future.
2023-03-31 17:36:31 -05:00

56 lines
1.6 KiB
Java

package com.twitter.search.earlybird.common;
import java.util.concurrent.atomic.AtomicBoolean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.twitter.search.common.metrics.SearchCustomGauge;
/**
* A monitor which enforces the condition that a single thread's work is caught up, and allows
* other threads to wait to be notified when the work is complete. An AtomicBoolean ensures the
* current status is visible to all threads.
*/
public class CaughtUpMonitor {
private static final Logger LOG = LoggerFactory.getLogger(CaughtUpMonitor.class);
protected final AtomicBoolean isCaughtUp = new AtomicBoolean(false);
public CaughtUpMonitor(String statPrefix) {
SearchCustomGauge.export(statPrefix + "_is_caught_up", () -> isCaughtUp() ? 1 : 0);
}
public boolean isCaughtUp() {
return isCaughtUp.get();
}
/**
* Set caught up state, and notify waiting threads if caught up.
*/
public synchronized void setAndNotify(boolean caughtUp) {
isCaughtUp.set(caughtUp);
if (caughtUp) {
// Readers are caught up, notify waiting threads
notifyAll();
}
}
/**
* Wait using Object.wait() until caught up or until thread is interrupted.
*/
public synchronized void resetAndWaitUntilCaughtUp() {
LOG.info("Waiting to catch up.");
// Explicitly set isCaughtUp to false before waiting
isCaughtUp.set(false);
try {
while (!isCaughtUp()) {
wait();
}
} catch (InterruptedException e) {
LOG.error("{} was interrupted while waiting to catch up", Thread.currentThread());
}
LOG.info("Caught up.");
}
}