/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.internal.nearcache.impl.invalidation;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import static java.util.concurrent.atomic.AtomicLongFieldUpdater.newUpdater;
import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
/**
* Contains one partitions' invalidation metadata.
*/
public final class MetaDataContainer {
private static final AtomicLongFieldUpdater<MetaDataContainer> SEQUENCE
= newUpdater(MetaDataContainer.class, "sequence");
private static final AtomicLongFieldUpdater<MetaDataContainer> STALE_SEQUENCE
= newUpdater(MetaDataContainer.class, "staleSequence");
private static final AtomicLongFieldUpdater<MetaDataContainer> MISSED_SEQUENCE_COUNT =
newUpdater(MetaDataContainer.class, "missedSequenceCount");
private static final AtomicReferenceFieldUpdater<MetaDataContainer, UUID> UUID =
newUpdater(MetaDataContainer.class, java.util.UUID.class, "uuid");
/**
* Sequence number of last received invalidation event
*/
private volatile long sequence;
/**
* Holds the biggest sequence number that is lost, lower sequences from this sequence are accepted as stale
*
* @see StaleReadDetector
*/
private volatile long staleSequence;
/**
* Number of missed sequence count
*/
private volatile long missedSequenceCount;
/**
* Uuid of the source partition that generates invalidation events
*/
private volatile UUID uuid;
public MetaDataContainer() {
}
public UUID getUuid() {
return uuid;
}
public void setUuid(UUID uuid) {
UUID.set(this, uuid);
}
public boolean casUuid(UUID prevUuid, UUID newUuid) {
return UUID.compareAndSet(this, prevUuid, newUuid);
}
public long getSequence() {
return sequence;
}
public boolean casSequence(long currentSequence, long nextSequence) {
return SEQUENCE.compareAndSet(this, currentSequence, nextSequence);
}
public void resetSequence() {
SEQUENCE.set(this, 0);
}
public long getStaleSequence() {
return STALE_SEQUENCE.get(this);
}
public boolean casStaleSequence(long lastKnownStaleSequence, long lastReceivedSequence) {
return STALE_SEQUENCE.compareAndSet(this, lastKnownStaleSequence, lastReceivedSequence);
}
public void resetStaleSequence() {
STALE_SEQUENCE.set(this, 0);
}
public long addAndGetMissedSequenceCount(long missCount) {
return MISSED_SEQUENCE_COUNT.addAndGet(this, missCount);
}
public long getMissedSequenceCount() {
return missedSequenceCount;
}
}