blob: dff9861baff7527e14150f926692b56fc50eeb7d [file] [log] [blame]
package org.apache.helix.common.caches;
import org.apache.helix.PropertyKey;
import org.apache.helix.model.CurrentState;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class CurrentStateSnapshot extends AbstractDataSnapshot<CurrentState> {
private Set<PropertyKey> _updatedStateKeys = null;
private Map<PropertyKey, CurrentState> _prevStateMap = null;
public CurrentStateSnapshot(final Map<PropertyKey, CurrentState> currentStateMap) {
super(currentStateMap);
}
public CurrentStateSnapshot(final Map<PropertyKey, CurrentState> currentStateMap,
final Map<PropertyKey, CurrentState> prevStateMap, final Set<PropertyKey> updatedStateKeys) {
this(currentStateMap);
_updatedStateKeys = Collections.unmodifiableSet(new HashSet<>(updatedStateKeys));
_prevStateMap = Collections.unmodifiableMap(new HashMap<>(prevStateMap));
}
/**
* Return the end times of all recent changed current states update.
*/
public Map<PropertyKey, Map<String, Long>> getNewCurrentStateEndTimes() {
Map<PropertyKey, Map<String, Long>> endTimeMap = new HashMap<>();
if (_updatedStateKeys != null && _prevStateMap != null) {
// Note if the prev state map is empty, this is the first time refresh.
// So the update is not considered as "recent" change.
for (PropertyKey propertyKey : _updatedStateKeys) {
CurrentState prevState = _prevStateMap.get(propertyKey);
CurrentState curState = _properties.get(propertyKey);
Map<String, Long> partitionUpdateEndTimes = null;
for (String partition : curState.getPartitionStateMap().keySet()) {
long newEndTime = curState.getEndTime(partition);
if (prevState == null || prevState.getEndTime(partition) < newEndTime) {
if (partitionUpdateEndTimes == null) {
partitionUpdateEndTimes = new HashMap<>();
}
partitionUpdateEndTimes.put(partition, newEndTime);
}
}
if (partitionUpdateEndTimes != null) {
endTimeMap.put(propertyKey, partitionUpdateEndTimes);
}
}
}
return endTimeMap;
}
}