def __call__(self, pnode): if pnode.type != "CMSSW": return for dataset in pnode._OutputDatasets: primary = DBSWriterObjects.createPrimaryDataset(dataset, self.apiRef) mergeAlgo = DBSWriterObjects.createMergeAlgorithm(dataset, self.apiRef) DBSWriterObjects.createProcessedDataset(primary, mergeAlgo, dataset, self.apiRef) inputDataset = dataset.get("ParentDataset", None) if inputDataset == None: continue processedDataset = dataset["ProcessedDataset"] self.apiRef.insertMergedDataset(inputDataset, processedDataset, mergeAlgo) # algorithm used when process jobs produce merged files directly # doesnt contain pset content - taken from processing (same hash) mergeDirectAlgo = DBSWriterObjects.createAlgorithm(dataset, None, self.apiRef) self.apiRef.insertAlgoInPD(makeDSName2(dataset), mergeDirectAlgo) logging.debug("ProcessedDataset: %s" % processedDataset) logging.debug("inputDataset: %s" % inputDataset) logging.debug("mergeAlgo: %s" % mergeAlgo) return
def __call__(self, pnode): if pnode.type != "CMSSW": return for dataset in pnode._OutputDatasets: primary = DBSWriterObjects.createPrimaryDataset( dataset, self.apiRef) mergeAlgo = DBSWriterObjects.createMergeAlgorithm( dataset, self.apiRef) DBSWriterObjects.createProcessedDataset(primary, mergeAlgo, dataset, self.apiRef) inputDataset = dataset.get('ParentDataset', None) if inputDataset == None: continue processedDataset = dataset["ProcessedDataset"] self.apiRef.insertMergedDataset(inputDataset, processedDataset, mergeAlgo) # algorithm used when process jobs produce merged files directly # doesnt contain pset content - taken from processing (same hash) mergeDirectAlgo = DBSWriterObjects.createAlgorithm( dataset, None, self.apiRef) self.apiRef.insertAlgoInPD(makeDSName2(dataset), mergeDirectAlgo) logging.debug("ProcessedDataset: %s" % processedDataset) logging.debug("inputDataset: %s" % inputDataset) logging.debug("mergeAlgo: %s" % mergeAlgo) return
def __call__(self, pnode): if pnode.type != "CMSSW": return datasets = self.getOutputDatasetsWithPSet(pnode) cfgMeta = None try: cfgInt = pnode.cfgInterface cfgMeta = cfgInt.configMetadata cfgMeta['Type'] = self.workflow.parameters["RequestCategory"] except Exception as ex: msg = "Unable to Extract cfg data from workflow" msg += str(ex) logging.error(msg) return for dataset in datasets: primary = DBSWriterObjects.createPrimaryDataset( dataset, self.apiRef) algo = DBSWriterObjects.createAlgorithm( dataset, cfgMeta, self.apiRef) processed = DBSWriterObjects.createProcessedDataset( primary, algo, dataset, self.apiRef) return
def __call__(self, pnode): if pnode.type != "CMSSW": return datasets = self.getOutputDatasetsWithPSet(pnode) cfgMeta = None try: cfgInt = pnode.cfgInterface cfgMeta = cfgInt.configMetadata cfgMeta['Type'] = self.workflow.parameters["RequestCategory"] except Exception as ex: msg = "Unable to Extract cfg data from workflow" msg += str(ex) logging.error(msg) return for dataset in datasets: primary = DBSWriterObjects.createPrimaryDataset( dataset, self.apiRef) algo = DBSWriterObjects.createAlgorithm(dataset, cfgMeta, self.apiRef) processed = DBSWriterObjects.createProcessedDataset( primary, algo, dataset, self.apiRef) return
def insertFiles(self, fwkJobRep, insertDetectorData=False): """ _insertFiles_ Process the files in the FwkJobReport instance and insert them into the associated datasets A list of affected fileblock names is returned both for merged and unmerged fileblocks. Only merged blocks will have to be managed. #for merged file #blocks to facilitate management of those blocks. #This list is not populated for processing jobs since we dont really #care about the processing job blocks. """ insertLists = {} orderedHashes = [] affectedBlocks = set() if len(fwkJobRep.files) <= 0: msg = "Error in DBSWriter.insertFiles\n" msg += "No files found in FrameWorkJobReport for:\n" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for outFile in fwkJobRep.sortFiles(): # // # // Convert each file into a DBS File object # // seName = None if outFile.has_key("SEName"): if outFile["SEName"]: seName = outFile["SEName"] logging.debug("SEname associated to file is: %s" % seName) ## remove the fallback to site se-name if no SE is associated to File ## because it's likely that there is some stage out problem if there ## is no SEName associated to the file. # if not seName: # if fwkJobRep.siteDetails.has_key("se-name"): # seName = fwkJobRep.siteDetails['se-name'] # seName = str(seName) # logging.debug("site SEname: %s"%seName) if not seName: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to files in FrameWorkJobReport for " # msg += "No SEname found in FrameWorkJobReport for " msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) try: if insertDetectorData: dbsFiles = DBSWriterObjects.createDBSFiles(outFile, fwkJobRep.jobType, self.dbs) else: dbsFiles = DBSWriterObjects.createDBSFiles(outFile, fwkJobRep.jobType) except DbsException, ex: msg = "Error in DBSWriter.insertFiles:\n" msg += "Error creating DbsFile instances for file:\n" msg += "%s\n" % outFile["LFN"] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(dbsFiles) <= 0: msg = "No DbsFile instances created. Not enough info in the FrameWorkJobReport for" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for f in dbsFiles: datasetName = makeDBSDSName(f) hashName = "%s-%s" % (seName, datasetName) if not insertLists.has_key(hashName): insertLists[hashName] = _InsertFileList(seName, datasetName) insertLists[hashName].append(f) if not orderedHashes.count(hashName): orderedHashes.append(hashName)
def insertFilesForDBSBuffer( self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False, maxFiles=100, maxSize=99999999, timeOut=None, fileCommitLength=5, ): """ _insertFiles_ list of files inserted in DBS """ # TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns = [] seName = None # Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos] # print ialgos for outFile in files: # // # // Convert each file into a DBS File object # // lumiList = [] # Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) # Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append(lrun) # save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( # Checksum = str(outFile['cksum']), NumberOfEvents=outFile["events"], LogicalFileName=outFile["lfn"], FileSize=int(outFile["size"]), Status="VALID", ValidationStatus="VALID", FileType="EDM", Dataset=procDataset, TierList=DBSWriterObjects.makeTierList(procDataset["Path"].split("/")[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), # BranchHash = outFile['BranchHash'], ) # Set checksums by hand # dbsfile['Checksum'] = 0 #Set a default? for entry in outFile["checksums"].keys(): # This should be a dictionary with a cktype key and cksum value if entry.lower() == "cksum": dbsfile["Checksum"] = str(outFile["checksums"][entry]) elif entry.lower() == "adler32": dbsfile["Adler32"] = str(outFile["checksums"][entry]) elif entry.lower() == "md5": dbsfile["Md5"] = str(outFile["checksums"][entry]) # This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" # print "FAKING seName for now" # seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate # // fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] # First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock(self.dbs, procDataset, seName) fileBlock["files"] = [] # if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException, ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset["Path"] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg)
# First see if the block is full if self.manageFileBlock( fileBlock=fileBlock, maxFiles=maxFiles, maxSize=maxSize, timeOut=timeOut, algos=ialgos, filesToCommit=filesToCommit, procDataset=procDataset, ): fileBlock["OpenForWriting"] = 0 if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) # Then we need a new block try: fileBlock = DBSWriterObjects.getDBSFileBlock(self.dbs, procDataset, seName) fileBlock["files"] = [] except DbsException, ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset["Path"] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) fileBlock["files"].append(file["LogicalFileName"]) filesToCommit.append(file) if len(filesToCommit) >= fileCommitLength: # Only commit the files if there are more of them then the maximum length try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = []
def manageFileBlock(self, fileBlock, maxFiles=100, maxSize=None, timeOut=None, algos=[], filesToCommit=[], procDataset=None): """ _manageFileBlock_ Check to see wether the fileblock with the provided name is closeable based on number of files or total size. If the block equals or exceeds wither the maxFiles or maxSize parameters, close the block and return True, else do nothing and return False """ # // # // Check that the block exists, and is open before we close it #// fileblockName = fileBlock['Name'] blockInstance = self.dbs.listBlocks(block_name=fileblockName) if len(blockInstance) > 1: msg = "Multiple Blocks matching name: %s\n" % fileblockName msg += "Unable to manage file block..." raise DBSWriterError(msg) if len(blockInstance) == 0: msg = "Block name %s not found\n" % fileblockName msg += "Cant manage a non-existent fileblock" raise DBSWriterError(msg) blockInstance = blockInstance[0] isClosed = blockInstance.get('OpenForWriting', '1') if isClosed != '1': msg = "Block %s already closed" % fileblockName logging.warning(msg) # Now we need to commit files if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" raise DBSWriterError(msg) # Attempting to migrate to global if self.globalDBSUrl: self.dbs.dbsMigrateBlock( srcURL=self.args['url'], dstURL=self.globalDBSUrl, block_name=fileblockName, srcVersion=self.version, dstVersion=self.globalVersion, ) #for algo in algos: # self.globalDBS.insertAlgoInPD(dataset = get_path(fileblockName.split('#')[0]), # algorithm = algo) logging.info( "Migrated block %s to global due to pre-closed status" % (fileblockName)) else: logging.error( "Should've migrated block %s because it was already closed, but didn't" % (fileblockName)) return True # // # // We have an open block, sum number of files and file sizes #// #fileCount = int(blockInstance.get('NumberOfFiles', 0)) fileCount = len(fileBlock['files']) totalSize = float(blockInstance.get('BlockSize', 0)) msg = "Fileblock: %s\n ==> Size: %s Files: %s\n" % ( fileblockName, totalSize, fileCount) logging.warning(msg) # // # // Test close block conditions #// closeBlock = False if timeOut: if int(time.time()) - int(blockInstance['CreationDate']) > timeOut: closeBlock = True msg = "Closing Block based on timeOut: %s" % fileblockName logging.debug(msg) if fileCount >= maxFiles: closeBlock = True msg = "Closing Block Based on files: %s" % fileblockName logging.debug(msg) if maxSize != None: if totalSize >= maxSize: closeBlock = True msg = "Closing Block Based on size: %s" % fileblockName logging.debug(msg) if closeBlock: # Now we need to commit files if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] #logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" #msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) # // # // Close the block #// self.dbs.closeBlock( DBSWriterObjects.createDBSFileBlock(fileblockName)) if self.globalDBSUrl: self.dbs.dbsMigrateBlock(srcURL=self.args['url'], dstURL=self.globalDBSUrl, block_name=fileblockName, srcVersion=self.version, dstVersion=self.globalVersion) for algo in algos: pass #self.globalDBS.insertAlgoInPD(dataset = get_path(fileblockName.split('#')[0]), # algorithm = algo) logging.info("Migrated block %s to global" % (fileblockName)) else: logging.error("Should've migrated block %s, but didn't" % (fileblockName)) return closeBlock
def insertFiles(self, fwkJobRep, insertDetectorData=False): """ _insertFiles_ Process the files in the FwkJobReport instance and insert them into the associated datasets A list of affected fileblock names is returned both for merged and unmerged fileblocks. Only merged blocks will have to be managed. #for merged file #blocks to facilitate management of those blocks. #This list is not populated for processing jobs since we dont really #care about the processing job blocks. """ insertLists = {} orderedHashes = [] affectedBlocks = set() if len(fwkJobRep.files) <= 0: msg = "Error in DBSWriter.insertFiles\n" msg += "No files found in FrameWorkJobReport for:\n" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for outFile in fwkJobRep.sortFiles(): # // # // Convert each file into a DBS File object #// seName = None if "SEName" in outFile: if outFile['SEName']: seName = outFile['SEName'] logging.debug("SEname associated to file is: %s" % seName) ## remove the fallback to site se-name if no SE is associated to File ## because it's likely that there is some stage out problem if there ## is no SEName associated to the file. # if not seName: # if fwkJobRep.siteDetails.has_key("se-name"): # seName = fwkJobRep.siteDetails['se-name'] # seName = str(seName) # logging.debug("site SEname: %s"%seName) if not seName: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to files in FrameWorkJobReport for " # msg += "No SEname found in FrameWorkJobReport for " msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) try: if (insertDetectorData): dbsFiles = DBSWriterObjects.createDBSFiles( outFile, fwkJobRep.jobType, self.dbs) else: dbsFiles = DBSWriterObjects.createDBSFiles( outFile, fwkJobRep.jobType) except DbsException as ex: msg = "Error in DBSWriter.insertFiles:\n" msg += "Error creating DbsFile instances for file:\n" msg += "%s\n" % outFile['LFN'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(dbsFiles) <= 0: msg = "No DbsFile instances created. Not enough info in the FrameWorkJobReport for" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for f in dbsFiles: datasetName = makeDBSDSName(f) hashName = "%s-%s" % (seName, datasetName) if hashName not in insertLists: insertLists[hashName] = _InsertFileList( seName, datasetName) insertLists[hashName].append(f) if not orderedHashes.count(hashName): orderedHashes.append(hashName) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks for hash in orderedHashes: fileList = insertLists[hash] procDataset = fileList[0]['Dataset'] try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, fileList.seName) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset msg += "In Storage Element:\n %s\n" % fileList.seName msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if fwkJobRep.jobType == "Merge": # // # // Merge files #// for mergedFile in fileList: mergedFile['Block'] = fileBlock affectedBlocks.add(fileBlock['Name']) msg = "calling: self.dbs.insertMergedFile(%s, %s)" % (str( mergedFile['ParentList']), str(mergedFile)) logging.debug(msg) try: self.dbs.insertMergedFile(mergedFile['ParentList'], mergedFile) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert merged file:\n" msg += " %s\n" % mergedFile['LogicalFileName'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) logging.debug( "Inserted merged file: %s to FileBlock: %s" % (mergedFile['LogicalFileName'], fileBlock['Name'])) else: # // # // Processing files #// affectedBlocks.add(fileBlock['Name']) msg = "calling: self.dbs.insertFiles(%s, %s, %s)" % ( str(procDataset), str(list(fileList)), str(fileBlock)) logging.debug(msg) try: self.dbs.insertFiles(procDataset, list(fileList), fileBlock) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ([x['LogicalFileName'] for x in fileList], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) logging.debug("Inserted files: %s to FileBlock: %s" % (([x['LogicalFileName'] for x in fileList]), fileBlock['Name'])) return list(affectedBlocks)
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False, maxFiles=100, maxSize=99999999, timeOut=None, fileCommitLength=5): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns = [] seName = None #Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [ DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] #print ialgos for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append( lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( #Checksum = str(outFile['cksum']), NumberOfEvents=outFile['events'], LogicalFileName=outFile['lfn'], FileSize=int(outFile['size']), Status="VALID", ValidationStatus='VALID', FileType='EDM', Dataset=procDataset, TierList=DBSWriterObjects.makeTierList( procDataset['Path'].split('/')[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #Set checksums by hand #dbsfile['Checksum'] = 0 #Set a default? for entry in outFile['checksums'].keys(): #This should be a dictionary with a cktype key and cksum value if entry.lower() == 'cksum': dbsfile['Checksum'] = str(outFile['checksums'][entry]) elif entry.lower() == 'adler32': dbsfile['Adler32'] = str(outFile['checksums'][entry]) elif entry.lower() == 'md5': dbsfile['Md5'] = str(outFile['checksums'][entry]) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] #First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] #if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) filesToCommit = [] for file in insertFiles: # First see if the block is full if self.manageFileBlock(fileBlock=fileBlock, maxFiles=maxFiles, maxSize=maxSize, timeOut=timeOut, algos=ialgos, filesToCommit=filesToCommit, procDataset=procDataset): fileBlock['OpenForWriting'] = 0 if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) # Then we need a new block try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) fileBlock['files'].append(file['LogicalFileName']) filesToCommit.append(file) if len(filesToCommit) >= fileCommitLength: # Only commit the files if there are more of them then the maximum length try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ( [x['LogicalFileName'] for x in insertFiles], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ([x['LogicalFileName'] for x in insertFiles], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) ## Do bulk inserts now for DBS #filesToCommit = [] #count = 0 #count2 = 0 #for file in insertFiles: # count += 1 # #Try and close the box # logging.error("Should have a file") # logging.error(len(filesToCommit)) # count2 += len(filesToCommit) # if self.manageFileBlock(fileBlock = fileBlock, maxFiles = maxFiles, # maxSize = maxSize, timeOut = timeOut, algos = ialgos, # filesToCommit = filesToCommit, procDataset = procDataset): # fileBlock['OpenForWriting'] = '0' # if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) # # # # # Then we need a new block # try: # fileBlock = DBSWriterObjects.getDBSFileBlock( # self.dbs, # procDataset, # seName) # fileBlock['files'] = [] # except DbsException, ex: # msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" # msg += "Cannot retrieve FileBlock for dataset:\n" # msg += " %s\n" % procDataset['Path'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # #At this point, we should commit the block as is # fileBlock['files'].append(file['LogicalFileName']) # if jobType == "MergeSpecial": # for file in fileList: # file['Block'] = fileBlock # msg="calling: self.dbs.insertMergedFile(%s, %s)" % (str(file['ParentList']),str(file)) # logging.debug(msg) # try: # # # # # # NOTE To Anzar From Anzar (File cloning as in DBS API can be done here and then I can use Bulk insert on Merged files as well) # self.dbs.insertMergedFile(file['ParentList'], # file) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert merged file:\n" # msg += " %s\n" % file['LogicalFileName'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # logging.debug("Inserted merged file: %s to FileBlock: %s"%(file['LogicalFileName'],fileBlock['Name'])) # else: # filesToCommit.append(file) # if len(filesToCommit) >= fileCommitLength: # # Only commit the files if there are more of them then the maximum length # try: # logging.error("About to commit %i files" %(len(filesToCommit))) # count2 += len(filesToCommit) # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # # # # ## If we still have files to commit, commit them #logging.error("Got to the end of the loop") #logging.error(len(filesToCommit)) #logging.error(count2) #if len(filesToCommit) > 0: # try: # logging.error("About to insert some files") # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) return list(affectedBlocks)
def insertFiles(self, fwkJobRep, insertDetectorData=False): """ _insertFiles_ Process the files in the FwkJobReport instance and insert them into the associated datasets A list of affected fileblock names is returned both for merged and unmerged fileblocks. Only merged blocks will have to be managed. #for merged file #blocks to facilitate management of those blocks. #This list is not populated for processing jobs since we dont really #care about the processing job blocks. """ insertLists = {} orderedHashes = [] affectedBlocks = set() if len(fwkJobRep.files) <= 0: msg = "Error in DBSWriter.insertFiles\n" msg += "No files found in FrameWorkJobReport for:\n" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for outFile in fwkJobRep.sortFiles(): # // # // Convert each file into a DBS File object #// seName = None if outFile.has_key("SEName"): if outFile['SEName']: seName = outFile['SEName'] logging.debug("SEname associated to file is: %s" % seName) ## remove the fallback to site se-name if no SE is associated to File ## because it's likely that there is some stage out problem if there ## is no SEName associated to the file. # if not seName: # if fwkJobRep.siteDetails.has_key("se-name"): # seName = fwkJobRep.siteDetails['se-name'] # seName = str(seName) # logging.debug("site SEname: %s"%seName) if not seName: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to files in FrameWorkJobReport for " # msg += "No SEname found in FrameWorkJobReport for " msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) try: if (insertDetectorData): dbsFiles = DBSWriterObjects.createDBSFiles( outFile, fwkJobRep.jobType, self.dbs) else: dbsFiles = DBSWriterObjects.createDBSFiles( outFile, fwkJobRep.jobType) except DbsException, ex: msg = "Error in DBSWriter.insertFiles:\n" msg += "Error creating DbsFile instances for file:\n" msg += "%s\n" % outFile['LFN'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(dbsFiles) <= 0: msg = "No DbsFile instances created. Not enough info in the FrameWorkJobReport for" msg += "==> JobSpecId: %s" % fwkJobRep.jobSpecId msg += " Workflow: %s" % fwkJobRep.workflowSpecId raise DBSWriterError(msg) for f in dbsFiles: datasetName = makeDBSDSName(f) hashName = "%s-%s" % (seName, datasetName) if not insertLists.has_key(hashName): insertLists[hashName] = _InsertFileList( seName, datasetName) insertLists[hashName].append(f) if not orderedHashes.count(hashName): orderedHashes.append(hashName)
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False, maxFiles=100, maxSize=99999999, timeOut=None, fileCommitLength=5): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns = [] seName = None #Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [ DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] #print ialgos for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append( lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( #Checksum = str(outFile['cksum']), NumberOfEvents=outFile['events'], LogicalFileName=outFile['lfn'], FileSize=int(outFile['size']), Status="VALID", ValidationStatus='VALID', FileType='EDM', Dataset=procDataset, TierList=DBSWriterObjects.makeTierList( procDataset['Path'].split('/')[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #Set checksums by hand #dbsfile['Checksum'] = 0 #Set a default? for entry in outFile['checksums'].keys(): #This should be a dictionary with a cktype key and cksum value if entry.lower() == 'cksum': dbsfile['Checksum'] = str(outFile['checksums'][entry]) elif entry.lower() == 'adler32': dbsfile['Adler32'] = str(outFile['checksums'][entry]) elif entry.lower() == 'md5': dbsfile['Md5'] = str(outFile['checksums'][entry]) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] #First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] #if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException, ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg)
filesToCommit = [] for file in insertFiles: # First see if the block is full if self.manageFileBlock(fileBlock=fileBlock, maxFiles=maxFiles, maxSize=maxSize, timeOut=timeOut, algos=ialgos, filesToCommit=filesToCommit, procDataset=procDataset): fileBlock['OpenForWriting'] = 0 if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) # Then we need a new block try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] except DbsException, ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) fileBlock['files'].append(file['LogicalFileName']) filesToCommit.append(file) if len(filesToCommit) >= fileCommitLength: # Only commit the files if there are more of them then the maximum length try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = []
def manageFileBlock(self, fileBlock, maxFiles = 100, maxSize = None, timeOut = None, algos = [], filesToCommit = [], procDataset = None): """ _manageFileBlock_ Check to see wether the fileblock with the provided name is closeable based on number of files or total size. If the block equals or exceeds wither the maxFiles or maxSize parameters, close the block and return True, else do nothing and return False """ # // # // Check that the block exists, and is open before we close it #// fileblockName = fileBlock['Name'] blockInstance = self.dbs.listBlocks(block_name=fileblockName) if len(blockInstance) > 1: msg = "Multiple Blocks matching name: %s\n" % fileblockName msg += "Unable to manage file block..." raise DBSWriterError(msg) if len(blockInstance) == 0: msg = "Block name %s not found\n" % fileblockName msg += "Cant manage a non-existent fileblock" raise DBSWriterError(msg) blockInstance = blockInstance[0] isClosed = blockInstance.get('OpenForWriting', '1') if isClosed != '1': msg = "Block %s already closed" % fileblockName logging.warning(msg) # Now we need to commit files if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" raise DBSWriterError(msg) # Attempting to migrate to global if self.globalDBSUrl: self.dbs.dbsMigrateBlock(srcURL = self.args['url'], dstURL = self.globalDBSUrl, block_name = fileblockName, srcVersion = self.version, dstVersion = self.globalVersion, ) #for algo in algos: # self.globalDBS.insertAlgoInPD(dataset = get_path(fileblockName.split('#')[0]), # algorithm = algo) logging.info("Migrated block %s to global due to pre-closed status" %(fileblockName)) else: logging.error("Should've migrated block %s because it was already closed, but didn't" % (fileblockName)) return True # // # // We have an open block, sum number of files and file sizes #// #fileCount = int(blockInstance.get('NumberOfFiles', 0)) fileCount = len(fileBlock['files']) totalSize = float(blockInstance.get('BlockSize', 0)) msg = "Fileblock: %s\n ==> Size: %s Files: %s\n" % ( fileblockName, totalSize, fileCount) logging.warning(msg) # // # // Test close block conditions #// closeBlock = False if timeOut: if int(time.time()) - int(blockInstance['CreationDate']) > timeOut: closeBlock = True msg = "Closing Block based on timeOut: %s" % fileblockName logging.debug(msg) if fileCount >= maxFiles: closeBlock = True msg = "Closing Block Based on files: %s" % fileblockName logging.debug(msg) if maxSize != None: if totalSize >= maxSize: closeBlock = True msg = "Closing Block Based on size: %s" % fileblockName logging.debug(msg) if closeBlock: # Now we need to commit files if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] #logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" #msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) # // # // Close the block #// self.dbs.closeBlock( DBSWriterObjects.createDBSFileBlock(fileblockName) ) if self.globalDBSUrl: self.dbs.dbsMigrateBlock(srcURL = self.args['url'], dstURL = self.globalDBSUrl, block_name = fileblockName, srcVersion = self.version, dstVersion = self.globalVersion ) for algo in algos: pass #self.globalDBS.insertAlgoInPD(dataset = get_path(fileblockName.split('#')[0]), # algorithm = algo) logging.info("Migrated block %s to global" %(fileblockName)) else: logging.error("Should've migrated block %s, but didn't" % (fileblockName)) return closeBlock
def insertFiles(self, fwkJobRep, insertDetectorData = False): """ _insertFiles_ Process the files in the FwkJobReport instance and insert them into the associated datasets A list of affected fileblock names is returned both for merged and unmerged fileblocks. Only merged blocks will have to be managed. #for merged file #blocks to facilitate management of those blocks. #This list is not populated for processing jobs since we dont really #care about the processing job blocks. """ insertLists = {} orderedHashes = [] affectedBlocks = set() if len(fwkJobRep.files)<=0: msg = "Error in DBSWriter.insertFiles\n" msg += "No files found in FrameWorkJobReport for:\n" msg += "==> JobSpecId: %s"%fwkJobRep.jobSpecId msg += " Workflow: %s"%fwkJobRep.workflowSpecId raise DBSWriterError(msg) for outFile in fwkJobRep.sortFiles(): # // # // Convert each file into a DBS File object #// pnn = None if "PNN" in outFile: if outFile['PNN'] : pnn = outFile['PNN'] logging.debug("PNN associated to file is: %s"%pnn) ## remove the fallback to site se-name if no SE is associated to File ## because it's likely that there is some stage out problem if there ## is no SEName associated to the file. # if not seName: # if fwkJobRep.siteDetails.has_key("se-name"): # seName = fwkJobRep.siteDetails['se-name'] # seName = str(seName) # logging.debug("site SEname: %s"%seName) if not pnn: msg = "Error in DBSWriter.insertFiles\n" msg += "No PNN associated to files in FrameWorkJobReport for " # msg += "No SEname found in FrameWorkJobReport for " msg += "==> JobSpecId: %s"%fwkJobRep.jobSpecId msg += " Workflow: %s"%fwkJobRep.workflowSpecId raise DBSWriterError(msg) try: if ( insertDetectorData ): dbsFiles = DBSWriterObjects.createDBSFiles(outFile, fwkJobRep.jobType, self.dbs) else: dbsFiles = DBSWriterObjects.createDBSFiles(outFile, fwkJobRep.jobType) except DbsException as ex: msg = "Error in DBSWriter.insertFiles:\n" msg += "Error creating DbsFile instances for file:\n" msg += "%s\n" % outFile['LFN'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(dbsFiles)<=0: msg="No DbsFile instances created. Not enough info in the FrameWorkJobReport for" msg += "==> JobSpecId: %s"%fwkJobRep.jobSpecId msg += " Workflow: %s"%fwkJobRep.workflowSpecId raise DBSWriterError(msg) for f in dbsFiles: datasetName = makeDBSDSName(f) hashName = "%s-%s" % (pnn, datasetName) if hashName not in insertLists: insertLists[hashName] = _InsertFileList(pnn, datasetName) insertLists[hashName].append(f) if not orderedHashes.count(hashName): orderedHashes.append(hashName) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks for hash in orderedHashes: fileList = insertLists[hash] procDataset = fileList[0]['Dataset'] try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, fileList.pnn) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset # msg += "In Storage Element:\n %s\n" % fileList.seName msg += "In PNN:\n %s\n" % fileList.pnn msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if fwkJobRep.jobType == "Merge": # // # // Merge files #// for mergedFile in fileList: mergedFile['Block'] = fileBlock affectedBlocks.add(fileBlock['Name']) msg="calling: self.dbs.insertMergedFile(%s, %s)" % (str(mergedFile['ParentList']),str(mergedFile)) logging.debug(msg) try: self.dbs.insertMergedFile(mergedFile['ParentList'], mergedFile) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert merged file:\n" msg += " %s\n" % mergedFile['LogicalFileName'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) logging.debug("Inserted merged file: %s to FileBlock: %s"%(mergedFile['LogicalFileName'],fileBlock['Name'])) else: # // # // Processing files #// affectedBlocks.add(fileBlock['Name']) msg="calling: self.dbs.insertFiles(%s, %s, %s)" % (str(procDataset),str(list(fileList)),str(fileBlock)) logging.debug(msg) try: self.dbs.insertFiles(procDataset, list(fileList), fileBlock) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ( [ x['LogicalFileName'] for x in fileList ], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) logging.debug("Inserted files: %s to FileBlock: %s"%( ([ x['LogicalFileName'] for x in fileList ]),fileBlock['Name'])) return list(affectedBlocks)
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType = "NotMerge", insertDetectorData = False, maxFiles = 100, maxSize = 99999999, timeOut = None, fileCommitLength = 5): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns=[] pnn = None #Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] #print ialgos for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun=long(runlumiinfo.run) run = DbsRun( RunNumber = lrun, NumberOfEvents = 0, NumberOfLumiSections = 0, TotalLuminosity = 0, StoreNumber = 0, StartOfRun = 0, EndOfRun = 0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append(lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber = long(alsn), StartEventNumber = 0, EndEventNumber = 0, LumiStartTime = 0, LumiEndTime = 0, RunNumber = lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( #Checksum = str(outFile['cksum']), NumberOfEvents = outFile['events'], LogicalFileName = outFile['lfn'], FileSize = int(outFile['size']), Status = "VALID", ValidationStatus = 'VALID', FileType = 'EDM', Dataset = procDataset, TierList = DBSWriterObjects.makeTierList(procDataset['Path'].split('/')[3]), AlgoList = ialgos, LumiList = lumiList, ParentList = outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #Set checksums by hand #dbsfile['Checksum'] = 0 #Set a default? for entry in outFile['checksums'].keys(): #This should be a dictionary with a cktype key and cksum value if entry.lower() == 'cksum': dbsfile['Checksum'] = str(outFile['checksums'][entry]) elif entry.lower() == 'adler32': dbsfile['Adler32'] = str(outFile['checksums'][entry]) elif entry.lower() == 'md5': dbsfile['Md5'] = str(outFile['checksums'][entry]) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: pnn = list(outFile["locations"])[0] logging.debug("PNN associated to file is: %s"%pnn) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No PNN associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] #First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, pnn) fileBlock['files'] = [] #if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) filesToCommit = [] for file in insertFiles: # First see if the block is full if self.manageFileBlock(fileBlock = fileBlock, maxFiles = maxFiles, maxSize = maxSize, timeOut = timeOut, algos = ialgos, filesToCommit = filesToCommit, procDataset = procDataset): fileBlock['OpenForWriting'] = 0 if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) # Then we need a new block try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, pnn) fileBlock['files'] = [] except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) fileBlock['files'].append(file['LogicalFileName']) filesToCommit.append(file) if len(filesToCommit) >= fileCommitLength: # Only commit the files if there are more of them then the maximum length try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) ## Do bulk inserts now for DBS #filesToCommit = [] #count = 0 #count2 = 0 #for file in insertFiles: # count += 1 # #Try and close the box # logging.error("Should have a file") # logging.error(len(filesToCommit)) # count2 += len(filesToCommit) # if self.manageFileBlock(fileBlock = fileBlock, maxFiles = maxFiles, # maxSize = maxSize, timeOut = timeOut, algos = ialgos, # filesToCommit = filesToCommit, procDataset = procDataset): # fileBlock['OpenForWriting'] = '0' # if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) # # # # # Then we need a new block # try: # fileBlock = DBSWriterObjects.getDBSFileBlock( # self.dbs, # procDataset, # seName) # fileBlock['files'] = [] # except DbsException, ex: # msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" # msg += "Cannot retrieve FileBlock for dataset:\n" # msg += " %s\n" % procDataset['Path'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # #At this point, we should commit the block as is # fileBlock['files'].append(file['LogicalFileName']) # if jobType == "MergeSpecial": # for file in fileList: # file['Block'] = fileBlock # msg="calling: self.dbs.insertMergedFile(%s, %s)" % (str(file['ParentList']),str(file)) # logging.debug(msg) # try: # # # # # # NOTE To Anzar From Anzar (File cloning as in DBS API can be done here and then I can use Bulk insert on Merged files as well) # self.dbs.insertMergedFile(file['ParentList'], # file) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert merged file:\n" # msg += " %s\n" % file['LogicalFileName'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # logging.debug("Inserted merged file: %s to FileBlock: %s"%(file['LogicalFileName'],fileBlock['Name'])) # else: # filesToCommit.append(file) # if len(filesToCommit) >= fileCommitLength: # # Only commit the files if there are more of them then the maximum length # try: # logging.error("About to commit %i files" %(len(filesToCommit))) # count2 += len(filesToCommit) # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # # # # ## If we still have files to commit, commit them #logging.error("Got to the end of the loop") #logging.error(len(filesToCommit)) #logging.error(count2) #if len(filesToCommit) > 0: # try: # logging.error("About to insert some files") # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) return list(affectedBlocks)