package com.hubspot.baragon.cache;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hubspot.baragon.data.BaragonStateDatastore;
import java.util.concurrent.atomic.AtomicReference;
@Singleton
public class BaragonStateCache {
private final BaragonStateDatastore stateDatastore;
private final AtomicReference<CachedBaragonState> currentState;
@Inject
public BaragonStateCache(BaragonStateDatastore stateDatastore) {
this.stateDatastore = stateDatastore;
this.currentState = new AtomicReference<>(new CachedBaragonState(new byte[0], -2));
}
public CachedBaragonState getState() {
CachedBaragonState previousState = currentState.get();
int version = stateDatastore.getStateVersion().or(-1);
if (previousState.getVersion() == version) {
return previousState;
} else {
return updateState(version);
}
}
private synchronized CachedBaragonState updateState(int version) {
CachedBaragonState previousState = currentState.get();
if (previousState.getVersion() >= version) {
return previousState;
} else {
CachedBaragonState newState = fetchState(version);
currentState.set(newState);
return newState;
}
}
private CachedBaragonState fetchState(int version) {
return new CachedBaragonState(stateDatastore.getGlobalStateAsBytes(), version);
}
}