/** * Register a new fragment for a specific query * * @param queryIdentifier * @param appIdString * @param dagName * @param dagIdentifier * @param vertexName * @param fragmentNumber * @param attemptNumber * @param user * @throws IOException */ QueryFragmentInfo registerFragment( QueryIdentifier queryIdentifier, String appIdString, String dagName, int dagIdentifier, String vertexName, int fragmentNumber, int attemptNumber, String user, FragmentSpecProto fragmentSpec) throws IOException { ReadWriteLock dagLock = getDagLock(queryIdentifier); dagLock.readLock().lock(); try { if (!completedDagMap.contains(queryIdentifier)) { QueryInfo queryInfo = queryInfoMap.get(queryIdentifier); if (queryInfo == null) { queryInfo = new QueryInfo( queryIdentifier, appIdString, dagName, dagIdentifier, user, getSourceCompletionMap(queryIdentifier), localDirsBase, localFs); queryInfoMap.putIfAbsent(queryIdentifier, queryInfo); } return queryInfo.registerFragment(vertexName, fragmentNumber, attemptNumber, fragmentSpec); } else { // Cleanup the dag lock here, since it may have been created after the query completed dagSpecificLocks.remove(queryIdentifier); throw new RuntimeException( "Dag " + dagName + " already complete. Rejecting fragment [" + vertexName + ", " + fragmentNumber + ", " + attemptNumber + "]"); } } finally { dagLock.readLock().unlock(); } }