Github user trkurc commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/123#discussion_r44872444
  
    --- Diff: 
nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-persistent-provenance-repository/src/main/java/org/apache/nifi/provenance/lucene/DocsReader.java
 ---
    @@ -100,101 +96,61 @@ private ProvenanceEventRecord getRecord(final 
Document d, final RecordReader rea
                 }
             }
     
    -        if ( record == null ) {
    -            throw new IOException("Failed to find Provenance Event " + d);
    -        } else {
    -            return record;
    +        if (record == null) {
    +            logger.warn("Failed to read Provenance Event for '" + d + "'. 
The event file may be missing or corrupted");
             }
    -    }
     
    +        return record;
    +    }
     
         public Set<ProvenanceEventRecord> read(final List<Document> docs, 
final Collection<Path> allProvenanceLogFiles,
    -        final AtomicInteger retrievalCount, final int maxResults, final 
int maxAttributeChars) throws IOException {
    -        if (retrievalCount.get() >= maxResults) {
    -            return Collections.emptySet();
    -        }
    -
    -        LuceneUtil.sortDocsForRetrieval(docs);
    -
    -        RecordReader reader = null;
    -        String lastStorageFilename = null;
    -        final Set<ProvenanceEventRecord> matchingRecords = new 
LinkedHashSet<>();
    +            final AtomicInteger retrievalCount, final int maxResults, 
final int maxAttributeChars) throws IOException {
     
             final long start = System.nanoTime();
    -        int logFileCount = 0;
    -
    -        final Set<String> storageFilesToSkip = new HashSet<>();
    -        int eventsReadThisFile = 0;
     
    -        try {
    -            for (final Document d : docs) {
    -                final String storageFilename = 
d.getField(FieldNames.STORAGE_FILENAME).stringValue();
    -                if ( storageFilesToSkip.contains(storageFilename) ) {
    -                    continue;
    -                }
    -
    -                try {
    -                    if (reader != null && 
storageFilename.equals(lastStorageFilename)) {
    -                        matchingRecords.add(getRecord(d, reader));
    -                        eventsReadThisFile++;
    -
    -                        if ( retrievalCount.incrementAndGet() >= 
maxResults ) {
    -                            break;
    -                        }
    -                    } else {
    -                        logger.debug("Opening log file {}", 
storageFilename);
    -
    -                        logFileCount++;
    -                        if (reader != null) {
    -                            reader.close();
    -                        }
    +        Set<ProvenanceEventRecord> matchingRecords = new LinkedHashSet<>();
    +        if (retrievalCount.get() >= maxResults) {
    +            return matchingRecords;
    +        }
     
    -                        final List<File> potentialFiles = 
LuceneUtil.getProvenanceLogFiles(storageFilename, allProvenanceLogFiles);
    -                        if (potentialFiles.isEmpty()) {
    -                            logger.warn("Could not find Provenance Log 
File with basename {} in the "
    -                                    + "Provenance Repository; assuming 
file has expired and continuing without it", storageFilename);
    -                            storageFilesToSkip.add(storageFilename);
    -                            continue;
    -                        }
    +        Map<String, List<Document>> byStorageNameDocGroups = 
LuceneUtil.groupDocsByStorageFileName(docs);
     
    -                        if (potentialFiles.size() > 1) {
    -                            throw new FileNotFoundException("Found 
multiple Provenance Log Files with basename " +
    -                                    storageFilename + " in the Provenance 
Repository");
    -                        }
    +        int eventsReadThisFile = 0;
    +        int logFileCount = 0;
     
    -                        for (final File file : potentialFiles) {
    -                            try {
    -                                if (reader != null) {
    -                                    logger.debug("Read {} records from 
previous file", eventsReadThisFile);
    -                                }
    -
    -                                reader = 
RecordReaders.newRecordReader(file, allProvenanceLogFiles, maxAttributeChars);
    -                                matchingRecords.add(getRecord(d, reader));
    -                                eventsReadThisFile = 1;
    -
    -                                if ( retrievalCount.incrementAndGet() >= 
maxResults ) {
    -                                    break;
    -                                }
    -                            } catch (final IOException e) {
    -                                throw new IOException("Failed to retrieve 
record " + d + " from Provenance File " + file + " due to " + e, e);
    +        for (String storageFileName : byStorageNameDocGroups.keySet()) {
    +            File provenanceEventFile = 
LuceneUtil.getProvenanceLogFile(storageFileName, allProvenanceLogFiles);
    +            if (provenanceEventFile != null) {
    +                try (RecordReader reader = 
RecordReaders.newRecordReader(provenanceEventFile, allProvenanceLogFiles,
    +                        maxAttributeChars)) {
    +                    for (Document document : 
byStorageNameDocGroups.get(storageFileName)) {
    +                        ProvenanceEventRecord eRec = 
this.getRecord(document, reader);
    +                        if (eRec != null) {
    +                            matchingRecords.add(eRec);
    +                            eventsReadThisFile++;
    +
    +                            if (retrievalCount.incrementAndGet() >= 
maxResults) {
    +                                break;
                                 }
                             }
                         }
    -                } finally {
    -                    lastStorageFilename = storageFilename;
    +                } catch (Exception e) {
    --- End diff --
    
    Did you consider breaking out the different types exceptions here, which 
could help with diagnosis? Also, although unlikely (and possibly not 
plausible), the reader could throw an exception on close. Did you consider a 
closeQuietly instead of a try-with-resources?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to