SNAP_LOG.error(String.format("JSON exception on snapshot data \"%s\".", data),
e);
}
}
SnapshotWritePlan plan;
if (format == SnapshotFormat.NATIVE) {
plan = new NativeSnapshotWritePlan();
}
else if (format == SnapshotFormat.CSV) {
plan = new CSVSnapshotWritePlan();
}
else if (format == SnapshotFormat.STREAM) {
plan = new StreamSnapshotWritePlan();
}
else if (format == SnapshotFormat.INDEX) {
plan = new IndexSnapshotWritePlan();
}
else {
throw new RuntimeException("BAD BAD BAD");
}
final Callable<Boolean> deferredSetup = plan.createSetup(file_path, file_nonce, txnId,
partitionTransactionIds, jsData, context, result, exportSequenceNumbers, tracker,
hashinatorData, timestamp);
m_deferredSetupFuture =
VoltDB.instance().submitSnapshotIOWork(
new DeferredSnapshotSetup(plan, deferredSetup, txnId, partitionTransactionIds));
synchronized (m_createLock) {
//Seems like this should be cleared out just in case
//Log if there is actually anything to clear since it is unexpected
if (!m_taskListsForHSIds.isEmpty()) {
SNAP_LOG.warn("Found lingering snapshot tasks while setting up a snapshot");
}
m_taskListsForHSIds.clear();
m_createSuccess.set(true);
m_createResult.set(result);
m_taskListsForHSIds.putAll(plan.getTaskListsForHSIds());
// HACK HACK HACK. If the task list is empty, this host has no work to do for
// this snapshot. We're going to create an empty list of tasks for one of the sites to do
// so that we'll have a SnapshotSiteProcessor which will do the logSnapshotCompleteToZK.
if (m_taskListsForHSIds.isEmpty()) {
SNAP_LOG.debug("Node had no snapshot work to do. Creating a null task to drive completion.");
m_taskListsForHSIds.put(context.getSiteId(), new ArrayDeque<SnapshotTableTask>());
}
SNAP_LOG.debug("Planned tasks: " +
CoreUtils.hsIdCollectionToString(plan.getTaskListsForHSIds().keySet()));
SNAP_LOG.debug("Created tasks for HSIds: " +
CoreUtils.hsIdCollectionToString(m_taskListsForHSIds.keySet()));
}
}