diff --git a/src/libpmempool/check_sds.c b/src/libpmempool/check_sds.c index 520421ea859463cf253ead6977c32e6cda3c4cea..8685ef97a9aef84f29b92e2dfd4b6099661b1777 100644 --- a/src/libpmempool/check_sds.c +++ b/src/libpmempool/check_sds.c @@ -26,6 +26,7 @@ enum question { #define SDS_CHECK_STR "checking shutdown state" #define SDS_OK_STR "shutdown state correct" #define SDS_DIRTY_STR "shutdown state is dirty" +#define SDS_NOT_SUPP "shutdown state not supported" #define ADR_FAILURE_STR \ "an ADR failure was detected - your pool might be corrupted" @@ -46,6 +47,22 @@ enum question { ? SDS_DIRTY_STR ".|" ZERO_SDS_STR \ : ADR_FAILURE_STR ".|" RESET_SDS_STR +/* + * + */ +static int +sds_is_supported(location *loc) +{ + LOG(3, NULL); + + ASSERTne(loc, NULL); + struct pool_replica *rep = REP(loc->set, 0); + ASSERTne(rep, NULL); + ASSERTne(PART(rep, 0)->fd, 0); + + return shutdown_state_is_supported(PART(rep, 0)->fd); +} + /* * sds_check_replica -- (internal) check if replica is healthy */ @@ -89,6 +106,13 @@ sds_check(PMEMpoolcheck *ppc, location *loc) CHECK_INFO(ppc, "%s" SDS_CHECK_STR, loc->prefix); + /* shutdown state is supported */ + if (sds_is_supported(loc)) { + CHECK_INFO(ppc, "%s" SDS_NOT_SUPP, loc->prefix); + loc->step = CHECK_STEP_COMPLETE; + return 0; + } + /* shutdown state is valid */ if (!sds_check_replica(loc)) { CHECK_INFO(ppc, "%s" SDS_OK_STR, loc->prefix); @@ -245,6 +269,20 @@ check_sds(PMEMpoolcheck *ppc) const unsigned nreplicas = ppc->pool->set_file->poolset->nreplicas; location *loc = check_get_step_data(ppc->data); + /* + * SDS check can be made before header repair so header features can be + * corrupted at this point. + */ + /* initialize replica 0 for sds check */ + loc->replica = 0; + init_location_data(ppc, loc); + if (!sds_is_supported(loc)) { + CHECK_INFO(ppc, "%s" SDS_CHECK_STR, + loc->prefix); + CHECK_INFO(ppc, "%s" SDS_NOT_SUPP, loc->prefix); + return; + } + if (!loc->init_done) { sds_get_healthy_replicas_num(ppc, loc);