Instead of keeping two AtomicLong instances, we instantiate two shared
updater classes and keep the values in volatile fields. This lowers the
memory consumption.
Change-Id: I9e6ce426500ee61b8c02d75cb0edd361e996a443
Signed-off-by: Robert Varga <rovarga@cisco.com>
import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import scala.concurrent.duration.FiniteDuration;
public class FollowerLogInformationImpl implements FollowerLogInformation {
import scala.concurrent.duration.FiniteDuration;
public class FollowerLogInformationImpl implements FollowerLogInformation {
+ private static final AtomicLongFieldUpdater<FollowerLogInformationImpl> NEXT_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(FollowerLogInformationImpl.class, "nextIndex");
+ private static final AtomicLongFieldUpdater<FollowerLogInformationImpl> MATCH_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(FollowerLogInformationImpl.class, "matchIndex");
- private final AtomicLong nextIndex;
+ private final Stopwatch stopwatch = new Stopwatch();
- private final AtomicLong matchIndex;
+ private final long followerTimeoutMillis;
- private final Stopwatch stopwatch;
+ private volatile long nextIndex;
- private final long followerTimeoutMillis;
+ private volatile long matchIndex;
public FollowerLogInformationImpl(String id, long nextIndex,
long matchIndex, FiniteDuration followerTimeoutDuration) {
this.id = id;
public FollowerLogInformationImpl(String id, long nextIndex,
long matchIndex, FiniteDuration followerTimeoutDuration) {
this.id = id;
- this.nextIndex = new AtomicLong(nextIndex);
- this.matchIndex = new AtomicLong(matchIndex);
- this.stopwatch = new Stopwatch();
+ this.nextIndex = nextIndex;
+ this.matchIndex = matchIndex;
this.followerTimeoutMillis = followerTimeoutDuration.toMillis();
}
@Override
public long incrNextIndex(){
this.followerTimeoutMillis = followerTimeoutDuration.toMillis();
}
@Override
public long incrNextIndex(){
- return nextIndex.incrementAndGet();
+ return NEXT_INDEX_UPDATER.incrementAndGet(this);
}
@Override
public long decrNextIndex() {
}
@Override
public long decrNextIndex() {
- return nextIndex.decrementAndGet();
+ return NEXT_INDEX_UPDATER.decrementAndGet(this);
}
@Override
public void setNextIndex(long nextIndex) {
}
@Override
public void setNextIndex(long nextIndex) {
- this.nextIndex.set(nextIndex);
+ this.nextIndex = nextIndex;
}
@Override
public long incrMatchIndex(){
}
@Override
public long incrMatchIndex(){
- return matchIndex.incrementAndGet();
+ return MATCH_INDEX_UPDATER.incrementAndGet(this);
}
@Override
public void setMatchIndex(long matchIndex) {
}
@Override
public void setMatchIndex(long matchIndex) {
- this.matchIndex.set(matchIndex);
+ this.matchIndex = matchIndex;
@Override
public long getNextIndex() {
@Override
public long getNextIndex() {
- return nextIndex.get();
}
@Override
public long getMatchIndex() {
}
@Override
public long getMatchIndex() {
- return matchIndex.get();