提交 1c9ac0a4 编写于 作者: J Jacob Champion

gpMgmt: remove unused SEGSTART error codes

Most of these codes were set only by GpSegStart.__convertSegments, which
has been unused since ce4d96b6. Remove that function as well.

The final client of SEGSTART_ERROR_MIRRORING_FAILURE, gpstart, has been
simplified; the concept of a "mirroring failure" has not been supported
since the removal of filerep.
上级 bc890702
......@@ -529,19 +529,12 @@ class GpGetSegmentStatusValues(Command):
SEGSTART_ERROR_UNKNOWN_ERROR = -1
SEGSTART_SUCCESS = 0
SEGSTART_ERROR_MIRRORING_FAILURE = 1
SEGSTART_ERROR_POSTMASTER_DIED = 2
SEGSTART_ERROR_INVALID_STATE_TRANSITION = 3
SEGSTART_ERROR_SERVER_IS_IN_SHUTDOWN = 4
SEGSTART_ERROR_STOP_RUNNING_SEGMENT_FAILED = 5
SEGSTART_ERROR_DATA_DIRECTORY_DOES_NOT_EXIST = 6
SEGSTART_ERROR_SERVER_DID_NOT_RESPOND = 7
SEGSTART_ERROR_PG_CTL_FAILED = 8
SEGSTART_ERROR_CHECKING_CONNECTION_AND_LOCALE_FAILED = 9
SEGSTART_ERROR_PING_FAILED = 10 # not actually done inside GpSegStartCmd, done instead by caller
SEGSTART_ERROR_PG_CONTROLDATA_FAILED = 11
SEGSTART_ERROR_CHECKSUM_MISMATCH = 12
SEGSTART_ERROR_OTHER = 1000
class GpSegStartArgs(CmdArgs):
......
......@@ -473,16 +473,13 @@ class GpStart:
####
def _verify_enough_segments(self, startResult, gparray):
successfulSegments = startResult.getSuccessfulSegments()
mirroringFailures = [f.getSegment() for f in startResult.getFailedSegmentObjs() \
if f.getReasonCode() == gp.SEGSTART_ERROR_MIRRORING_FAILURE]
allSegmentsByContent = GpArray.getSegmentsByContentId(gparray.getSegDbList())
successfulSegmentsByDbId = GpArray.getSegmentsGroupedByValue(successfulSegments, Segment.getSegmentDbId)
mirroringFailuresByDbId = GpArray.getSegmentsGroupedByValue(mirroringFailures, Segment.getSegmentDbId)
#
# look at each content, see if there is a segment available (or one which can be made
# available by the fault prober by switching to changetracking)
# look at each content, see if there is a segment available (or one
# which can be made available by failing over)
#
for primary in gparray.getSegDbList():
......@@ -499,19 +496,8 @@ class GpStart:
# good, we can continue!
continue
if primary.getSegmentDbId() in mirroringFailuresByDbId \
and not primary.isSegmentModeInChangeLogging():
#
# we have a mirroring failure so the fault prober can probably convert us to changetracking
#
# note that if the primary is already in changetracking then a mirroring failure is
# considered fatal here
#
continue
if mirror is not None \
and (
mirror.getSegmentDbId() in successfulSegmentsByDbId or mirror.getSegmentDbId() in mirroringFailuresByDbId) \
and mirror.getSegmentDbId() in successfulSegmentsByDbId \
and primary.isSegmentModeSynchronized():
#
# we could fail over to that mirror, so it's okay to start up like this
......@@ -575,17 +561,11 @@ class GpStart:
invalidSegments are those that we didn't even try to start because they are marked as down or should otherwise
not be started
"""
mirroringFailures = [f for f in segmentStartResult.getFailedSegmentObjs() \
if f.getReasonCode() == gp.SEGSTART_ERROR_MIRRORING_FAILURE]
nonMirroringFailures = [f for f in segmentStartResult.getFailedSegmentObjs() \
if f.getReasonCode() != gp.SEGSTART_ERROR_MIRRORING_FAILURE]
started = len(segmentStartResult.getSuccessfulSegments())
failedFromMirroring = len(mirroringFailures)
failedNotFromMirroring = len(nonMirroringFailures)
totalTriedToStart = started + failedFromMirroring + failedNotFromMirroring
failed = len(segmentStartResult.getFailedSegmentObjs())
totalTriedToStart = started + failed
if failedFromMirroring > 0 or failedNotFromMirroring > 0 or logging_is_verbose():
if failed or logging_is_verbose():
logger.info("----------------------------------------------------")
for failure in segmentStartResult.getFailedSegmentObjs():
segment = failure.getSegment()
......@@ -601,14 +581,7 @@ class GpStart:
tableLog.addSeparator()
tableLog.info(["Successful segment starts", "= %d" % started])
if self.gparray.hasMirrors and failedFromMirroring > 0:
tableLog.warn(["Failed segment starts, from mirroring connection between primary and mirror",
"= %d" % failedFromMirroring])
tableLog.infoOrWarn(failedNotFromMirroring > 0,
["Other failed segment starts", "= %d" % failedNotFromMirroring])
else:
assert failedFromMirroring == 0
tableLog.infoOrWarn(failedNotFromMirroring > 0, ["Failed segment starts", "= %d" % failedNotFromMirroring])
tableLog.infoOrWarn(failed, ["Failed segment starts", "= %d" % failed])
tableLog.infoOrWarn(len(invalidSegments) > 0,
["Skipped segment starts (segments are marked down in configuration)",
......@@ -625,10 +598,10 @@ class GpStart:
(started, totalTriedToStart, skippedMsg, attentionFlag))
logger.info("----------------------------------------------------")
if failedNotFromMirroring > 0 or failedFromMirroring > 0:
if failed:
logger.warning("Segment instance startup failures reported")
logger.warning("Failed start %d of %d segment instances %s" % \
(failedNotFromMirroring + failedFromMirroring, totalTriedToStart, attentionFlag))
(failed, totalTriedToStart, attentionFlag))
logger.warning("Review %s" % get_logfile())
if not willShutdownSegments:
logger.warning("For more details on segment startup failure(s)")
......
......@@ -283,117 +283,6 @@ class GpSegStart:
self.pool.empty_completed_items()
def __convertSegments(self):
"""
Inform segments of their role
"""
if self.mirroringMode != 'quiescent':
self.logger.info("Not transitioning segments, mirroringMode is %s..." % self.mirroringMode)
return
self.logger.info("Transitioning segments, mirroringMode is %s..." % self.mirroringMode)
transitionData = None
if self.pickledTransitionData is not None:
transitionData = pickle.loads(base64.urlsafe_b64decode(self.pickledTransitionData))
# send transition messages to the segments
#
for datadir, seg in self.overall_status.dirmap.items():
#
# This cmd will deliver a message to the postmaster using gp_primarymirror
# (look for the protocol message type PRIMARY_MIRROR_TRANSITION_REQUEST_CODE )
#
port = seg.getSegmentPort()
cmd = gp.SendFilerepTransitionMessage.buildTransitionMessageCommand(transitionData, datadir, port)
self.pool.addCommand(cmd)
self.pool.join()
# examine the results from the segments
#
segments = self.overall_status.dirmap.values()
dataDirToSeg = gparray.GpArray.getSegmentsGroupedByValue(segments, gparray.Segment.getSegmentDataDirectory)
toStop = []
cmds = self.pool.getCompletedItems()
for cmd in cmds:
res = cmd.get_results()
if res.rc == 0:
continue
# some form of failure
#
stdoutFromFailure = res.stdout.replace("\n", " ").strip()
stderrFromFailure = res.stderr.replace("\n", " ").strip()
shouldStop = False
if res.rc == gp.SendFilerepTransitionMessage.TRANSITION_ERRCODE_ERROR_SERVER_DID_NOT_RETURN_DATA:
msg = "Segment did not respond to startup request; check segment logfile"
reasoncode = gp.SEGSTART_ERROR_SERVER_DID_NOT_RESPOND
# server crashed when sending response, should ensure it's stopped completely!
shouldStop = True
elif stderrFromFailure.endswith("failure: Error: MirroringFailure"):
msg = "Failure in segment mirroring; check segment logfile"
reasoncode = gp.SEGSTART_ERROR_MIRRORING_FAILURE
elif stderrFromFailure.endswith("failure: Error: PostmasterDied"):
msg = "Segment postmaster has exited; check segment logfile"
reasoncode = gp.SEGSTART_ERROR_POSTMASTER_DIED
elif stderrFromFailure.endswith("failure: Error: InvalidStateTransition"):
msg = "Not a valid operation at this time; check segment logfile"
reasoncode = gp.SEGSTART_ERROR_INVALID_STATE_TRANSITION
# This should never happen, but if it does then we will ensure process is gone
shouldStop = True
elif stderrFromFailure.endswith("failure: Error: ServerIsInShutdown"):
msg = "System is shutting down"
reasoncode = gp.SEGSTART_ERROR_SERVER_IS_IN_SHUTDOWN
else:
if res.rc == gp.SendFilerepTransitionMessage.TRANSITION_ERRCODE_ERROR_SOCKET:
# Couldn't connect to server to do transition or got another problem
# communicating, must make sure it's halted!
shouldStop = True
msg = "Start failed; check segment logfile. \"%s%s\"" % (stdoutFromFailure, stderrFromFailure)
reasoncode = gp.SEGSTART_ERROR_OTHER
self.overall_status.mark_failed(cmd.dataDir, msg, reasoncode)
if shouldStop:
assert len(dataDirToSeg[cmd.dataDir]) == 1, "Multiple segments with dir %s" % cmd.dataDir
toStop.append( dataDirToSeg[cmd.dataDir][0] )
# ensure segments in a bad state are stopped
#
for seg in toStop:
datadir, port = (seg.getSegmentDataDirectory(), seg.getSegmentPort())
msg = "Stopping segment %s, %s because of failure sending transition" % (datadir, port)
self.logger.info(msg)
cmd = gp.SegmentStop('stop segment', datadir, mode="immediate")
cmd.run(validateAfter=False)
res = cmd.get_results()
if res.rc == 0:
self.logger.info("Stop of segment succeeded")
else:
stdoutFromFailure = res.stdout.replace("\n", " ").strip()
stderrFromFailure = res.stderr.replace("\n", " ").strip()
self.logger.info("Stop of segment failed: rc: %s\nstdout:%s\nstderr:%s" % \
(res.rc, stdoutFromFailure, stderrFromFailure))
def run(self):
"""
Logic to start the segments.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册