diff --git a/src/backend/fts/ftsfilerep.c b/src/backend/fts/ftsfilerep.c index 2db67eb1a7780361a7bce4a101563d42aba2b192..c1414fdb358c2c70a87225e758e8e93b9659abfe 100644 --- a/src/backend/fts/ftsfilerep.c +++ b/src/backend/fts/ftsfilerep.c @@ -53,10 +53,10 @@ enum filerep_segment_pair_state_e /* we always assume that primary is up */ #define IS_VALID_OLD_STATE_FILEREP(state) \ - (state >= FILEREP_PUS_MUS && state <= FILEREP_PUC_MDX) + ((unsigned int)(state) <= FILEREP_PUC_MDX) #define IS_VALID_NEW_STATE_FILEREP(state) \ - (state >= FILEREP_PUS_MUS && state < FILEREP_SENTINEL) + ((unsigned int)(state) < FILEREP_SENTINEL) /* * state machine matrix for filerep; @@ -171,15 +171,17 @@ FtsGetPairStateFilerep(CdbComponentDatabaseInfo *primary, CdbComponentDatabaseIn /* - * get new state for primary and mirror using filerep state machine + * Get new state for primary and mirror using filerep state machine. + * In case of an invalid old state, log the old state and do not transition. */ uint32 FtsTransitionFilerep(uint32 stateOld, uint32 trans) { - Assert(IS_VALID_OLD_STATE_FILEREP(stateOld)); - int i = 0; + if (!(IS_VALID_OLD_STATE_FILEREP(stateOld))) + elog(ERROR, "FTS: invalid old state for transition: %d", stateOld); + /* check state machine for transition */ for (i = 0; i < FILEREP_SENTINEL; i++) { @@ -253,6 +255,8 @@ FtsResolveStateFilerep(FtsSegmentPairState *pairState) case (FILEREP_PUS_MUS): case (FILEREP_PUR_MUR): Assert(!"FTS is not responsible for bringing segments back to life"); + break; + default: Assert(!"Invalid transition in filerep state machine"); } diff --git a/src/backend/fts/ftsprobe.c b/src/backend/fts/ftsprobe.c index cc2cc37a7e27be55df32fb08f0622b9cf4b45801..ddf44a9f41e6103461b6ea1eb14e4426b4f4852e 100644 --- a/src/backend/fts/ftsprobe.c +++ b/src/backend/fts/ftsprobe.c @@ -676,7 +676,7 @@ probeTimeout(ProbeConnectionInfo *probeInfo, const char* calledFrom) } /* If connection takes more than the gp_fts_probe_timeout, we fail. */ - if (elapsed_ms > gp_fts_probe_timeout * 1000) + if (elapsed_ms > (uint64)gp_fts_probe_timeout * 1000) { write_log("FTS: failed to probe segment (content=%d, dbid=%d) due to timeout expiration, " "probe elapsed time: " UINT64_FORMAT " ms.", diff --git a/src/backend/fts/ftssan.c b/src/backend/fts/ftssan.c index 6fb533437fd78d09b8562cfef1faf2ff2a1dfba1..bbb1084260c6f3d2ce4811ccfb448590c0f17c3d 100644 --- a/src/backend/fts/ftssan.c +++ b/src/backend/fts/ftssan.c @@ -33,6 +33,9 @@ #include #endif +#include + + /* * CONSTANTS */ @@ -67,10 +70,10 @@ enum san_segment_pair_state_e }; #define IS_VALID_OLD_STATE_SAN(state) \ - (state >= SAN_PU_MU && state <= SAN_PU_MD) + ((unsigned int)(state) <= SAN_PU_MD) #define IS_VALID_NEW_STATE_SAN(state) \ - (state >= SAN_PU_MU && state < SAN_SENTINEL) + ((unsigned int)(state) < SAN_SENTINEL) /* * state machine matrix for SAN; @@ -201,6 +204,8 @@ FtsResolveStateSAN(FtsSegmentPairState *pairState) case (SAN_PU_MU): Assert(!"FTS is not responsible for bringing segments back to life"); + break; + default: Assert(!"Invalid transition in filerep state machine"); } @@ -555,6 +560,7 @@ mountMaintenanceForMpid(int mpid) { char *gphome_env=NULL; char cmd[1024]; + char args[8][256]; int cmd_status; /* @@ -569,19 +575,26 @@ mountMaintenanceForMpid(int mpid) gphome_env = getenv("GPHOME"); if (gphome_env == NULL) - { - snprintf(cmd, sizeof(cmd), "gp_mount_agent --agent -t %c -a %c -p %s -d %s -m %s -q %s -e %s -n %s", - san_type, active_host, p_host, p_dev, p_mp, m_host, m_dev, m_mp); - } + snprintf(cmd, sizeof(cmd), "gp_mount_agent"); else - { - snprintf(cmd, sizeof(cmd), "%s/bin/gp_mount_agent --agent -t %c -a %c -p %s -d %s -m %s -q %s -e %s -n %s", - gphome_env, san_type, active_host, p_host, p_dev, p_mp, m_host, m_dev, m_mp); - } - - elog(LOG, "Mount agent command is [%s]", cmd); - - cmd_status = system(cmd); + snprintf(cmd, sizeof(cmd), "%s/bin/gp_mount_agent", gphome_env); + + snprintf(args[0], sizeof(args[0]), "--agent -t %c", san_type); + snprintf(args[1], sizeof(args[1]), "-a %c", active_host); + snprintf(args[2], sizeof(args[2]), "-p %s", p_host); + snprintf(args[3], sizeof(args[3]), "-d %s", p_dev); + snprintf(args[4], sizeof(args[4]), "-m %s", p_mp); + snprintf(args[5], sizeof(args[5]), "-q %s", m_host); + snprintf(args[6], sizeof(args[6]), "-e %s", m_dev); + snprintf(args[7], sizeof(args[7]), "-n %s", m_mp); + + elog(LOG, "Mount agent command is [%s %s %s %s %s %s %s %s %s]", + cmd, args[0], args[1], args[2], args[3], args[4], args[5], + args[6], args[7]); + + cmd_status = execlp(cmd, "gp_mount_agent", args[0], args[1], + args[2], args[3], args[4], args[5], args[6], + args[7], NULL); if (cmd_status == -1) { diff --git a/src/backend/postmaster/primary_mirror_mode.c b/src/backend/postmaster/primary_mirror_mode.c index a737d513ba7c3965d045dd373094df8ad6015c8b..da06387c733c81de39f961d28659f2af6b689409 100644 --- a/src/backend/postmaster/primary_mirror_mode.c +++ b/src/backend/postmaster/primary_mirror_mode.c @@ -373,7 +373,10 @@ getFaultTypeLabel(FaultType_e faultType) }; COMPILE_ASSERT(ARRAY_SIZE(labels) == FaultType__EnumerationCount); - return labels[faultType]; + if (faultType < ARRAY_SIZE(labels)) + return labels[faultType]; + else + return "UnrecognizedFaultType"; } /**