*/
package org.opendaylight.controller.cluster.datastore;
+import static com.google.common.base.Verify.verify;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Collections2;
import com.google.common.collect.Maps;
@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 = FrontendClientMetadataBuilder.of(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.Enabled(shardName, id);
final FrontendClientMetadataBuilder previous = clients.put(id.getFrontendId(), client);
if (previous != null) {
LOG.debug("{}: Replaced client {} with {}", shardName, previous, client);
@Nonnull Map<FrontendIdentifier, LeaderFrontendState> toLeaderState(@Nonnull final Shard shard) {
return new HashMap<>(Maps.transformValues(clients, meta -> meta.toLeaderState(shard)));
}
+
+ void disableTracking(final ClientIdentifier clientId) {
+ final FrontendIdentifier frontendId = clientId.getFrontendId();
+ final FrontendClientMetadataBuilder client = clients.get(frontendId);
+ if (client == null) {
+ // When we havent seen the client before, we still need to disable tracking for him since this only gets
+ // triggered once.
+ LOG.debug("{}: disableTracking {} does not match any client, pre-disabling client.", shardName, clientId);
+ clients.put(frontendId, new FrontendClientMetadataBuilder.Disabled(shardName, clientId));
+ return;
+ }
+ if (!clientId.equals(client.getIdentifier())) {
+ LOG.debug("{}: disableTracking {} does not match client {}, ignoring", shardName, clientId, client);
+ return;
+ }
+ if (client instanceof FrontendClientMetadataBuilder.Disabled) {
+ LOG.debug("{}: client {} is has already disabled tracking", shardName, client);
+ return;
+ }
+
+ verify(clients.replace(frontendId, client, new FrontendClientMetadataBuilder.Disabled(shardName, clientId)));
+ }
}