public CompletionStage<Void> migrate(MigrationSet set) {
        InterProcessLock lock = new InterProcessSemaphoreMutex(client.unwrap(), ZKPaths.makePath(lockPath, set.id()));
        CompletionStage<Void> lockStage = lockAsync(lock, lockMax.toMillis(), TimeUnit.MILLISECONDS, executor);
        return lockStage.thenCompose(__ -> runMigrationInLock(lock, set));
    }
@Test
    public void testTransactionForBadOps() throws Exception {
        CuratorOp op1 = client.transactionOp().create().forPath("/test2", "something".getBytes());
        CuratorOp op2 = client.transactionOp().create().forPath("/a/b/c/d");
        Migration migration = () -> Arrays.asList(op1, op2);
        MigrationSet migrationSet = MigrationSet.build("1", Collections.singletonList(migration));
        try {
            complete(manager.migrate(migrationSet));
            fail("Should throw");
        } catch (Throwable e) {
            assertTrue(Throwables.getRootCause(e) instanceof KeeperException.NoNodeException);
        }

        assertNull(client.unwrap().checkExists().forPath("/test"));
    }