*/
package org.opendaylight.controller.cluster.datastore;
+import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
import com.google.common.collect.Collections2;
-import com.google.common.collect.Range;
-import com.google.common.collect.RangeSet;
-import com.google.common.collect.TreeRangeSet;
-import com.google.common.primitives.UnsignedLong;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
import org.opendaylight.controller.cluster.datastore.persisted.FrontendClientMetadata;
import org.opendaylight.controller.cluster.datastore.persisted.FrontendHistoryMetadata;
+import org.opendaylight.controller.cluster.datastore.utils.UnsignedLongRangeSet;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.concepts.Identifiable;
import org.slf4j.Logger;
private static final Logger LOG = LoggerFactory.getLogger(FrontendClientMetadataBuilder.class);
private final Map<LocalHistoryIdentifier, FrontendHistoryMetadataBuilder> currentHistories = new HashMap<>();
- private final RangeSet<UnsignedLong> purgedHistories;
+ private final UnsignedLongRangeSet purgedHistories;
private final ClientIdentifier identifier;
+ private final String shardName;
- FrontendClientMetadataBuilder(final ClientIdentifier identifier) {
+ FrontendClientMetadataBuilder(final String shardName, final ClientIdentifier identifier) {
+ this.shardName = Preconditions.checkNotNull(shardName);
this.identifier = Preconditions.checkNotNull(identifier);
- purgedHistories = TreeRangeSet.create();
+ purgedHistories = UnsignedLongRangeSet.create();
// History for stand-alone transactions is always present
final LocalHistoryIdentifier standaloneId = standaloneHistoryId();
currentHistories.put(standaloneId, new FrontendHistoryMetadataBuilder(standaloneId));
}
- FrontendClientMetadataBuilder(final FrontendClientMetadata meta) {
+ FrontendClientMetadataBuilder(final String shardName, final FrontendClientMetadata meta) {
+ this.shardName = Preconditions.checkNotNull(shardName);
this.identifier = Preconditions.checkNotNull(meta.getIdentifier());
- purgedHistories = TreeRangeSet.create(meta.getPurgedHistories());
+ purgedHistories = UnsignedLongRangeSet.create(meta.getPurgedHistories());
for (FrontendHistoryMetadata h : meta.getCurrentHistories()) {
final FrontendHistoryMetadataBuilder b = new FrontendHistoryMetadataBuilder(identifier, h);
// Sanity check and recovery
final LocalHistoryIdentifier standaloneId = standaloneHistoryId();
if (!currentHistories.containsKey(standaloneId)) {
- LOG.warn("Client {} recovered histories {} do not contain stand-alone history, attempting recovery",
- identifier, currentHistories);
+ LOG.warn("{}: Client {} recovered histories {} do not contain stand-alone history, attempting recovery",
+ shardName, identifier, currentHistories);
currentHistories.put(standaloneId, new FrontendHistoryMetadataBuilder(standaloneId));
}
}
@Override
public FrontendClientMetadata build() {
- return new FrontendClientMetadata(identifier, purgedHistories,
+ return new FrontendClientMetadata(identifier, purgedHistories.toImmutable(),
Collections2.transform(currentHistories.values(), FrontendHistoryMetadataBuilder::build));
}
final FrontendHistoryMetadataBuilder oldMeta = currentHistories.putIfAbsent(historyId, newMeta);
if (oldMeta != null) {
// This should not be happening, warn about it
- LOG.warn("Reused local history {}", historyId);
+ LOG.warn("{}: Reused local history {}", shardName, historyId);
} else {
- LOG.debug("Created local history {}", historyId);
+ LOG.debug("{}: Created local history {}", shardName, historyId);
}
}
final FrontendHistoryMetadataBuilder builder = currentHistories.get(historyId);
if (builder != null) {
builder.onHistoryClosed();
- LOG.debug("Closed history {}", historyId);
+ LOG.debug("{}: Closed history {}", shardName, historyId);
} else {
- LOG.warn("Closed unknown history {}, ignoring", historyId);
+ LOG.warn("{}: Closed unknown history {}, ignoring", shardName, historyId);
}
}
void onHistoryPurged(final LocalHistoryIdentifier historyId) {
final FrontendHistoryMetadataBuilder history = currentHistories.remove(historyId);
if (history == null) {
- LOG.warn("Purging unknown history {}", historyId);
+ LOG.warn("{}: Purging unknown history {}", shardName, historyId);
}
// XXX: do we need to account for cookies?
- purgedHistories.add(Range.singleton(UnsignedLong.fromLongBits(historyId.getHistoryId())));
- LOG.debug("Purged history {}", historyId);
+ purgedHistories.add(historyId.getHistoryId());
+ LOG.debug("{}: Purged history {}", shardName, historyId);
}
void onTransactionAborted(final TransactionIdentifier txId) {
final FrontendHistoryMetadataBuilder history = getHistory(txId);
if (history != null) {
history.onTransactionAborted(txId);
- LOG.debug("Committed transaction {}", txId);
+ LOG.debug("{}: Aborted transaction {}", shardName, txId);
} else {
- LOG.warn("Unknown history for aborted transaction {}, ignoring", txId);
+ LOG.warn("{}: Unknown history for aborted transaction {}, ignoring", shardName, txId);
}
}
final FrontendHistoryMetadataBuilder history = getHistory(txId);
if (history != null) {
history.onTransactionCommitted(txId);
- LOG.debug("Aborted transaction {}", txId);
+ LOG.debug("{}: Committed transaction {}", shardName, txId);
} else {
- LOG.warn("Unknown history for commited transaction {}, ignoring", txId);
+ LOG.warn("{}: Unknown history for commited transaction {}, ignoring", shardName, txId);
}
}
final FrontendHistoryMetadataBuilder history = getHistory(txId);
if (history != null) {
history.onTransactionPurged(txId);
- LOG.debug("Purged transaction {}", txId);
+ LOG.debug("{}: Purged transaction {}", shardName, txId);
} else {
- LOG.warn("Unknown history for purged transaction {}, ignoring", txId);
+ LOG.warn("{}: Unknown history for purged transaction {}, ignoring", shardName, txId);
}
}
}
return new LeaderFrontendState(shard.persistenceId(), getIdentifier(), shard.getDataStore(),
- TreeRangeSet.create(purgedHistories), singleHistory, histories);
+ purgedHistories.copy(), singleHistory, histories);
}
private FrontendHistoryMetadataBuilder getHistory(final TransactionIdentifier txId) {
return currentHistories.get(txId.getHistoryId());
}
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("identifier", identifier).add("current", currentHistories)
+ .add("purged", purgedHistories).toString();
+ }
}