private static void logFailureAndThrow(final BootstrapInfo bootstrapInfo) {
        final String outcome = bootstrapInfo.getUpgradeOutcome()
                .map(UpgradeOutcome::toString)
                .orElse("empty");
        final String msg = LogUtil.message("Build version '{}' has an upgrade outcome of {} on node {}. " +
                                           "Either deploy a new version; or fix the issue, set column {}.{} to null " +
                                           "then re-try this version. Aborting application startup.",
                bootstrapInfo.getBuildVersion(),
                outcome,
                bootstrapInfo.getExecutingNode(),
                BUILD_VERSION_TABLE_NAME,
                OUTCOME_COL_NAME);

        LOGGER.error(msg);
        throw new BootstrapFailureException(msg);
    }
Use a table lock on a noddy table created just for this purpose to enforce
a cluster wide lock so we can do all the flyway migrations in isolation.
Flyway migrations should work under lock but we have lots of independent flyway
migrations so it is safer to do it this way.
Can't user the cluster lock service as that is not a thing at this point.
stroom-app/src/main/java/stroom/app/BootstrapUtil.java