void CanvasState::restoreToCount(int saveCount) { if (saveCount < 1) saveCount = 1; while (mSaveCount > saveCount) { restoreSnapshot(); } }
TEST_P(SnapshotRestoreTest, snapshot_restoration_on_a_clone) { const auto wrns_parent(make_random_namespace()); const std::string parent_name(wrns_parent->ns().str()); SharedVolumePtr parent = newVolume(VolumeId(parent_name), be::Namespace(parent_name)); const std::string pattern1("before-parent-snapshot"); writeToVolume(*parent, 0, parent->getClusterSize(), pattern1); const SnapshotName parent_snap("parent-snapshot"); parent->createSnapshot(parent_snap); waitForThisBackendWrite(*parent); const auto wrns_clone(make_random_namespace()); const std::string clone_name(wrns_clone->ns().str()); SharedVolumePtr clone = createClone(clone_name, be::Namespace(clone_name), be::Namespace(parent_name), parent_snap); const std::string pattern2("before-clone-snapshot"); writeToVolume(*clone, 0, clone->getClusterSize(), pattern2); const SnapshotName clone_snap("clone-snapshot"); clone->createSnapshot(clone_snap); waitForThisBackendWrite(*clone); const std::string pattern3("after-clone-snapshot"); writeToVolume(*clone, 0, clone->getClusterSize(), pattern3); checkVolume(*clone, 0, clone->getClusterSize(), pattern3); restoreSnapshot(*clone, clone_snap); checkVolume(*clone, 0, clone->getClusterSize(), pattern2); }
void UndoManager::redoStep(bool execute, bool flyingRollback) { UndoAction* const action = d->redoActions.back(); UndoMetadataContainer dataBeforeStep = UndoMetadataContainer::fromImage(*d->core->getImg()); UndoMetadataContainer dataAfterStep = action->getMetadata(); QVariant originDataBeforeStep = d->core->getImg()->fileOriginData(); QVariant originDataAfterStep = action->fileOriginData(); DImageHistory originHistoryBeforeStep = d->core->getResolvedInitialHistory(); DImageHistory originHistoryAfterStep = action->fileOriginResolvedHistory(); UndoActionIrreversible* const irreversible = dynamic_cast<UndoActionIrreversible*>(action); UndoActionReversible* const reversible = dynamic_cast<UndoActionReversible*>(action); if (execute) { if (irreversible || flyingRollback) { restoreSnapshot(d->undoActions.size() + 1, dataAfterStep); } else if (reversible) // checking pointer just to check for null pointer in case of a bug { reversible->getFilter().apply(*d->core->getImg()); d->core->imageUndoChanged(dataAfterStep); } } else { // if we do not copy the data (fast roll-back), we at least set the history for subsequent steps d->core->imageUndoChanged(dataAfterStep); } action->setMetadata(dataBeforeStep); if (isAtOrigin()) { action->setFileOriginData(originDataBeforeStep, originHistoryBeforeStep); } else { action->setFileOriginData(QVariant(), DImageHistory()); } d->redoActions.removeLast(); d->undoActions << action; if (!originDataAfterStep.isNull()) { d->origin = 0; d->core->setFileOriginData(originDataAfterStep); d->core->setResolvedInitialHistory(originHistoryAfterStep); } else { d->origin++; } }
TEST_P(SnapshotRestoreTest, HaltOnError) { auto ns_ptr = make_random_namespace(); SharedVolumePtr v = newVolume(VolumeId("volume1"), ns_ptr->ns()); const std::string pattern1("blah"); const TLogId tlog_id(v->getSnapshotManagement().getCurrentTLogId()); writeToVolume(*v, 0, 4096, pattern1); v->createSnapshot(SnapshotName("snap1")); waitForThisBackendWrite(*v); EXPECT_THROW(restoreSnapshot(*v, "snap42"), std::exception); EXPECT_FALSE(v->is_halted()); v->getBackendInterface()->remove(boost::lexical_cast<std::string>(tlog_id)); EXPECT_THROW(restoreSnapshot(*v, "snap1"), std::exception); EXPECT_TRUE(v->is_halted()); }
double PostureIKSolver::lineSearch(int index, VectorXD& direction){ double energyO = energy(); direction * lineSearchStepSize; do{ //try step applyConfiguration(direction); double tmp = energy(); if(tmp < energyO || lineSearchStepSize < step){ return lineSearchStepSize; } restoreSnapshot(index); lineSearchStepSize /= 2; direction * 0.5; }while(1); }
TEST_P(SnapshotRestoreTest, RestoreAndWriteAgain1) { auto ns_ptr = make_random_namespace(); SharedVolumePtr v = newVolume(VolumeId("volume1"), ns_ptr->ns(), VolumeSize(1 << 26), SCOMultiplier(1)); const std::string pattern("e-manual"); v->createSnapshot(SnapshotName("snap1")); waitForThisBackendWrite(*v); writeToVolume(*v, 0, 5 * 4096, pattern); waitForThisBackendWrite(*v); restoreSnapshot(*v,"snap1"); writeToVolume(*v, 0, 4*4096, pattern); waitForThisBackendWrite(*v); checkCurrentBackendSize(*v); }
void CanvasState::restore() { if (mSaveCount > 1) { restoreSnapshot(); } }
TEST_P(SnapshotRestoreTest, SimpleRestore) { auto ns_ptr = make_random_namespace(); SharedVolumePtr v = newVolume(VolumeId("volume1"), ns_ptr->ns()); const std::string pattern1("Frederik"); writeToVolume(*v, 0, 4096, pattern1); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snap1")); const std::string pattern2("Frederik"); writeToVolume(*v, 0, 4096, pattern2); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snap2")); const std::string pattern3("Arne"); writeToVolume(*v, 0, 4096, pattern3); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snap3")); const std::string pattern4("Bart"); writeToVolume(*v, 0, 4096, pattern4); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snap4")); const std::string pattern5("Wouter"); writeToVolume(*v, 0, 4096, pattern5); checkVolume(*v,0,4096,pattern5); waitForThisBackendWrite(*v); EXPECT_NO_THROW(restoreSnapshot(*v, "snap4")); checkVolume(*v,0,4096,pattern4); writeToVolume(*v, 0, 4096, "Bollocks"); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snapper")); waitForThisBackendWrite(*v); EXPECT_NO_THROW(restoreSnapshot(*v, "snap3")); checkVolume(*v,0,4096,pattern3); writeToVolume(*v, 0, 4096, "Bollocks"); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snapper")); waitForThisBackendWrite(*v); EXPECT_NO_THROW(restoreSnapshot(*v, "snap2")); checkVolume(*v,0,4096,pattern2); writeToVolume(*v, 0, 4096, "Bollocks"); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snapper")); waitForThisBackendWrite(*v); EXPECT_NO_THROW(restoreSnapshot(*v, "snap1")); checkVolume(*v,0,4096,pattern1); writeToVolume(*v, 0, 4096, "Bollocks"); waitForThisBackendWrite(*v); v->createSnapshot(SnapshotName("snapper")); waitForThisBackendWrite(*v); checkCurrentBackendSize(*v); }