package com.hubspot.singularity.scheduler; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import com.google.common.math.DoubleMath; import com.google.inject.Inject; import com.google.inject.name.Named; import com.hubspot.singularity.SingularityMainModule; public class SingularityStatusUpdateDeltaPoller extends SingularityLeaderOnlyPoller { private final ConcurrentHashMap<Long, Long> statusUpdateDeltas; private final AtomicLong statusUpdateDelta30sAverage; @Inject public SingularityStatusUpdateDeltaPoller(@Named(SingularityMainModule.STATUS_UPDATE_DELTAS) ConcurrentHashMap<Long, Long> statusUpdateDeltas, @Named(SingularityMainModule.STATUS_UPDATE_DELTA_30S_AVERAGE) AtomicLong statusUpdateDelta30sAverage) { super(5L, TimeUnit.SECONDS); this.statusUpdateDeltas = statusUpdateDeltas; this.statusUpdateDelta30sAverage = statusUpdateDelta30sAverage; } @Override public void runActionOnPoll() { long now = System.currentTimeMillis(); List<Long> toRemove = statusUpdateDeltas.keySet().stream() .filter((e) -> e < now - 30000) .collect(Collectors.toList()); toRemove.forEach(statusUpdateDeltas::remove); if (statusUpdateDeltas.isEmpty()) { statusUpdateDelta30sAverage.set(0L); } else { statusUpdateDelta30sAverage.set((long) DoubleMath.mean(statusUpdateDeltas.values())); } } }