*/
package org.opendaylight.controller.cluster.datastore;
+import com.google.common.base.Preconditions;
import com.google.common.collect.Collections2;
+import com.google.common.collect.Maps;
import java.util.HashMap;
import java.util.Map;
+import javax.annotation.Nonnull;
import javax.annotation.concurrent.NotThreadSafe;
import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier;
private static final Logger LOG = LoggerFactory.getLogger(FrontendMetadata.class);
private final Map<FrontendIdentifier, FrontendClientMetadataBuilder> clients = new HashMap<>();
+ private final String shardName;
+
+ FrontendMetadata(final String shardName) {
+ this.shardName = Preconditions.checkNotNull(shardName);
+ }
@Override
Class<FrontendShardDataTreeSnapshotMetadata> getSupportedType() {
@Override
void reset() {
+ LOG.debug("{}: clearing clients {}", shardName, clients);
clients.clear();
}
@Override
void doApplySnapshot(final FrontendShardDataTreeSnapshotMetadata snapshot) {
+ LOG.debug("{}: applying snapshot {} over clients {}", shardName, snapshot, clients);
clients.clear();
for (FrontendClientMetadata m : snapshot.getClients()) {
- clients.put(m.getIdentifier().getFrontendId(), new FrontendClientMetadataBuilder(m));
+ LOG.debug("{}: applying metadata {}", shardName, m);
+ final FrontendClientMetadataBuilder b = new FrontendClientMetadataBuilder(shardName, m);
+ final FrontendIdentifier client = m.getIdentifier().getFrontendId();
+
+ LOG.debug("{}: client {} updated to {}", shardName, client, b);
+ clients.put(client, b);
}
}
return existing;
}
- final FrontendClientMetadataBuilder client = new FrontendClientMetadataBuilder(id);
+ final FrontendClientMetadataBuilder client = new FrontendClientMetadataBuilder(shardName, id);
final FrontendClientMetadataBuilder previous = clients.put(id.getFrontendId(), client);
if (previous != null) {
- LOG.debug("Replaced client {} with {}", previous, client);
+ LOG.debug("{}: Replaced client {} with {}", shardName, previous, client);
} else {
- LOG.debug("Added client {}", client);
+ LOG.debug("{}: Added client {}", shardName, client);
}
return client;
}
+ @Override
+ void onHistoryCreated(final LocalHistoryIdentifier historyId) {
+ ensureClient(historyId.getClientId()).onHistoryCreated(historyId);
+ }
+
@Override
void onHistoryClosed(final LocalHistoryIdentifier historyId) {
ensureClient(historyId.getClientId()).onHistoryClosed(historyId);
ensureClient(historyId.getClientId()).onHistoryPurged(historyId);
}
+ @Override
+ void onTransactionAborted(final TransactionIdentifier txId) {
+ ensureClient(txId.getHistoryId().getClientId()).onTransactionAborted(txId);
+ }
+
@Override
void onTransactionCommitted(final TransactionIdentifier txId) {
ensureClient(txId.getHistoryId().getClientId()).onTransactionCommitted(txId);
}
+
+ @Override
+ void onTransactionPurged(final TransactionIdentifier txId) {
+ ensureClient(txId.getHistoryId().getClientId()).onTransactionPurged(txId);
+ }
+
+ /**
+ * Transform frontend metadata into an active leader state map.
+ *
+ * @return Leader frontend state
+ */
+ @Nonnull Map<FrontendIdentifier, LeaderFrontendState> toLeaderState(@Nonnull final Shard shard) {
+ return new HashMap<>(Maps.transformValues(clients, meta -> meta.toLeaderState(shard)));
+ }
}