import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.primitives.UnsignedLong;
+import java.io.File;
import java.io.IOException;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayDeque;
import org.opendaylight.controller.cluster.datastore.persisted.MetadataShardDataTreeSnapshot;
import org.opendaylight.controller.cluster.datastore.persisted.ShardDataTreeSnapshot;
import org.opendaylight.controller.cluster.datastore.persisted.ShardDataTreeSnapshotMetadata;
+import org.opendaylight.controller.cluster.datastore.utils.DataTreeModificationOutput;
import org.opendaylight.controller.cluster.datastore.utils.PruningDataTreeModification;
import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
ImmutableMap.builder();
for (ShardDataTreeMetadata<?> m : metadata) {
- final ShardDataTreeSnapshotMetadata<?> meta = m.toStapshot();
+ final ShardDataTreeSnapshotMetadata<?> meta = m.toSnapshot();
if (meta != null) {
metaBuilder.put(meta.getType(), meta);
}
final DataTreeModification unwrapped = unwrap(mod);
dataTree.validate(unwrapped);
- dataTree.commit(dataTree.prepare(unwrapped));
+ DataTreeCandidateTip candidate = dataTree.prepare(unwrapped);
+ dataTree.commit(candidate);
+ notifyListeners(candidate);
+
LOG.debug("{}: state snapshot applied in %s", logContext, elapsed);
}
final DataTreeModification unwrapped = mod.delegate();
LOG.trace("{}: Applying recovery modification {}", logContext, unwrapped);
- dataTree.validate(unwrapped);
- dataTree.commit(dataTree.prepare(unwrapped));
+ try {
+ dataTree.validate(unwrapped);
+ dataTree.commit(dataTree.prepare(unwrapped));
+ } catch (Exception e) {
+ File file = new File(System.getProperty("karaf.data", "."),
+ "failed-recovery-payload-" + logContext + ".out");
+ DataTreeModificationOutput.toFile(file, unwrapped);
+ throw new IllegalStateException(String.format(
+ "%s: Failed to apply recovery payload. Modification data was written to file %s",
+ logContext, file), e);
+ }
}
/**
} else if (payload instanceof DataTreeCandidatePayload) {
applyRecoveryCandidate(((DataTreeCandidatePayload) payload).getCandidate());
} else {
- LOG.warn("{}: ignoring unhandled payload {}", logContext, payload);
+ LOG.debug("{}: ignoring unhandled payload {}", logContext, payload);
}
}
return ensureTransactionChain(txId.getHistoryId()).newReadWriteTransaction(txId);
}
+ @VisibleForTesting
public void notifyListeners(final DataTreeCandidate candidate) {
treeChangeListenerPublisher.publishChanges(candidate, logContext);
dataChangeListenerPublisher.publishChanges(candidate, logContext);
return dataTree.takeSnapshot().readNode(path);
}
- public DataTreeSnapshot takeSnapshot() {
+ DataTreeSnapshot takeSnapshot() {
return dataTree.takeSnapshot();
}
+ @VisibleForTesting
public DataTreeModification newModification() {
return dataTree.takeSnapshot().newModification();
}