def getRecoveryActionsFromConfigFile(self, gpArray): """ getRecoveryActionsFromConfigFile returns: a tuple (segments in change tracking disabled mode which are unable to recover, GpMirrorListToBuild object containing information of segments which are able to recover) """ # create fileData object from config file # filename = self.__options.recoveryConfigFile rows = [] with open(filename) as f: for lineno, line in line_reader(f): fixed, flexible = parse_gprecoverseg_line( filename, lineno, line) rows.append(ParsedConfigFileRow(fixed, flexible, line)) fileData = ParsedConfigFile(rows) allAddresses = [ row.getFixedValuesMap()["newAddress"] for row in fileData.getRows() if "newAddress" in row.getFixedValuesMap() ] allNoneArr = [None] * len(allAddresses) interfaceLookup = GpInterfaceToHostNameCache(self.__pool, allAddresses, allNoneArr) failedSegments = [] failoverSegments = [] for row in fileData.getRows(): fixedValues = row.getFixedValuesMap() flexibleValues = row.getFlexibleValuesMap() # find the failed segment failedAddress = fixedValues['failedAddress'] failedPort = fixedValues['failedPort'] failedDataDirectory = normalizeAndValidateInputPath( fixedValues['failedDataDirectory'], "config file", row.getLine()) failedSegment = None for segment in gpArray.getDbList(): if segment.getSegmentAddress() == failedAddress and \ str(segment.getSegmentPort()) == failedPort and \ segment.getSegmentDataDirectory() == failedDataDirectory: if failedSegment is not None: # # this could be an assertion -- configuration should not allow multiple entries! # raise Exception(( "A segment to recover was found twice in configuration. " "This segment is described by address:port:directory '%s:%s:%s' " "on the input line: %s") % (failedAddress, failedPort, failedDataDirectory, row.getLine())) failedSegment = segment if failedSegment is None: raise Exception("A segment to recover was not found in configuration. " \ "This segment is described by address:port:directory '%s:%s:%s' on the input line: %s" % (failedAddress, failedPort, failedDataDirectory, row.getLine())) failoverSegment = None if "newAddress" in fixedValues: """ When the second set was passed, the caller is going to tell us to where we need to failover, so build a failover segment """ # these two lines make it so that failoverSegment points to the object that is registered in gparray failoverSegment = failedSegment failedSegment = failoverSegment.copy() address = fixedValues["newAddress"] try: port = int(fixedValues["newPort"]) except ValueError: raise Exception( 'Config file format error, invalid number value in line: %s' % (row.getLine())) dataDirectory = normalizeAndValidateInputPath( fixedValues["newDataDirectory"], "config file", row.getLine()) hostName = interfaceLookup.getHostName(address) if hostName is None: raise Exception( 'Unable to find host name for address %s from line:%s' % (address, row.getLine())) # now update values in failover segment failoverSegment.setSegmentAddress(address) failoverSegment.setSegmentHostName(hostName) failoverSegment.setSegmentPort(port) failoverSegment.setSegmentDataDirectory(dataDirectory) # this must come AFTER the if check above because failedSegment can be adjusted to # point to a different object failedSegments.append(failedSegment) failoverSegments.append(failoverSegment) peersForFailedSegments = self.findAndValidatePeersForFailedSegments( gpArray, failedSegments) segs = [] segs_with_persistent_mirroring_disabled = [] for index, failedSegment in enumerate(failedSegments): peerForFailedSegment = peersForFailedSegments[index] peerForFailedSegmentDbId = peerForFailedSegment.getSegmentDbId() segs.append( GpMirrorToBuild(failedSegment, peerForFailedSegment, failoverSegments[index], self.__options.forceFullResynchronization)) self._output_segments_with_persistent_mirroring_disabled( segs_with_persistent_mirroring_disabled) return GpMirrorListToBuild(segs, self.__pool, self.__options.quiet, self.__options.parallelDegree)
def getRecoveryActionsFromConfigFile(self, gpArray): """ getRecoveryActionsFromConfigFile returns: a tuple (segments in change tracking disabled mode which are unable to recover, GpMirrorListToBuild object containing information of segments which are able to recover) """ # create fileData object from config file # filename = self.__options.recoveryConfigFile rows = [] with open(filename) as f: for lineno, line in line_reader(f): fixed, flexible = parse_gprecoverseg_line(filename, lineno, line) rows.append(ParsedConfigFileRow(fixed, flexible, line)) fileData = ParsedConfigFile([], rows) allAddresses = [row.getFixedValuesMap()["newAddress"] for row in fileData.getRows() if "newAddress" in row.getFixedValuesMap()] allNoneArr = [None] * len(allAddresses) interfaceLookup = GpInterfaceToHostNameCache(self.__pool, allAddresses, allNoneArr) failedSegments = [] failoverSegments = [] for row in fileData.getRows(): fixedValues = row.getFixedValuesMap() flexibleValues = row.getFlexibleValuesMap() # find the failed segment failedAddress = fixedValues['failedAddress'] failedPort = fixedValues['failedPort'] failedDataDirectory = normalizeAndValidateInputPath(fixedValues['failedDataDirectory'], "config file", row.getLine()) failedSegment = None for segment in gpArray.getDbList(): if segment.getSegmentAddress() == failedAddress and \ str(segment.getSegmentPort()) == failedPort and \ segment.getSegmentDataDirectory() == failedDataDirectory: if failedSegment is not None: # # this could be an assertion -- configuration should not allow multiple entries! # raise Exception(("A segment to recover was found twice in configuration. " "This segment is described by address:port:directory '%s:%s:%s' " "on the input line: %s") % (failedAddress, failedPort, failedDataDirectory, row.getLine())) failedSegment = segment if failedSegment is None: raise Exception("A segment to recover was not found in configuration. " \ "This segment is described by address:port:directory '%s:%s:%s' on the input line: %s" % (failedAddress, failedPort, failedDataDirectory, row.getLine())) failoverSegment = None if "newAddress" in fixedValues: """ When the second set was passed, the caller is going to tell us to where we need to failover, so build a failover segment """ # these two lines make it so that failoverSegment points to the object that is registered in gparray failoverSegment = failedSegment failedSegment = failoverSegment.copy() address = fixedValues["newAddress"] try: port = int(fixedValues["newPort"]) except ValueError: raise Exception('Config file format error, invalid number value in line: %s' % (row.getLine())) dataDirectory = normalizeAndValidateInputPath(fixedValues["newDataDirectory"], "config file", row.getLine()) hostName = interfaceLookup.getHostName(address) if hostName is None: raise Exception('Unable to find host name for address %s from line:%s' % (address, row.getLine())) # now update values in failover segment failoverSegment.setSegmentAddress(address) failoverSegment.setSegmentHostName(hostName) failoverSegment.setSegmentPort(port) failoverSegment.setSegmentDataDirectory(dataDirectory) # this must come AFTER the if check above because failedSegment can be adjusted to # point to a different object failedSegments.append(failedSegment) failoverSegments.append(failoverSegment) peersForFailedSegments = self.findAndValidatePeersForFailedSegments(gpArray, failedSegments) segs = [] segs_with_persistent_mirroring_disabled = [] for index, failedSegment in enumerate(failedSegments): peerForFailedSegment = peersForFailedSegments[index] peerForFailedSegmentDbId = peerForFailedSegment.getSegmentDbId() segs.append(GpMirrorToBuild(failedSegment, peerForFailedSegment, failoverSegments[index], self.__options.forceFullResynchronization)) self._output_segments_with_persistent_mirroring_disabled(segs_with_persistent_mirroring_disabled) return GpMirrorListToBuild(segs, self.__pool, self.__options.quiet, self.__options.parallelDegree, forceoverwrite=True)