diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java index 03ff12349749..018cf3363e01 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java @@ -122,37 +122,51 @@ public Pair process(OMUpdateEventBatch events) { final Collection taskTables = getTaskTables(); while (eventIterator.hasNext()) { - OMDBUpdateEvent omdbUpdateEvent = eventIterator.next(); + OMDBUpdateEvent omdbUpdateEvent = eventIterator.next(); // Filter event inside process method to avoid duping if (!taskTables.contains(omdbUpdateEvent.getTable())) { continue; } String updatedKey = omdbUpdateEvent.getKey(); - OmKeyInfo omKeyInfo = omdbUpdateEvent.getValue(); + Object value = omdbUpdateEvent.getValue(); + Object oldValue = omdbUpdateEvent.getOldValue(); - try { - switch (omdbUpdateEvent.getAction()) { - case PUT: - handlePutKeyEvent(omKeyInfo, fileSizeCountMap); - break; + if (value instanceof OmKeyInfo) { + OmKeyInfo omKeyInfo = (OmKeyInfo) value; + OmKeyInfo omKeyInfoOld = (OmKeyInfo) oldValue; - case DELETE: - handleDeleteKeyEvent(updatedKey, omKeyInfo, fileSizeCountMap); - break; + try { + switch (omdbUpdateEvent.getAction()) { + case PUT: + handlePutKeyEvent(omKeyInfo, fileSizeCountMap); + break; - case UPDATE: - handleDeleteKeyEvent(updatedKey, omdbUpdateEvent.getOldValue(), - fileSizeCountMap); - handlePutKeyEvent(omKeyInfo, fileSizeCountMap); - break; + case DELETE: + handleDeleteKeyEvent(updatedKey, omKeyInfo, fileSizeCountMap); + break; - default: LOG.trace("Skipping DB update event : {}", - omdbUpdateEvent.getAction()); + case UPDATE: + if (omKeyInfoOld != null) { + handleDeleteKeyEvent(updatedKey, omKeyInfoOld, fileSizeCountMap); + handlePutKeyEvent(omKeyInfo, fileSizeCountMap); + } else { + LOG.warn("Update event does not have the old keyInfo for {}.", + updatedKey); + } + break; + + default: + LOG.trace("Skipping DB update event : {}", + omdbUpdateEvent.getAction()); + } + } catch (Exception e) { + LOG.error("Unexpected exception while processing key {}.", + updatedKey, e); + return new ImmutablePair<>(getTaskName(), false); } - } catch (Exception e) { - LOG.error("Unexpected exception while processing key {}.", - updatedKey, e); - return new ImmutablePair<>(getTaskName(), false); + } else { + LOG.warn("Unexpected value type {} for key {}. Skipping processing.", + value.getClass().getName(), updatedKey); } } writeCountsToDB(false, fileSizeCountMap); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/NSSummaryTaskWithLegacy.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/NSSummaryTaskWithLegacy.java index a2a9598261e5..6607f19dba51 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/NSSummaryTaskWithLegacy.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/NSSummaryTaskWithLegacy.java @@ -87,10 +87,16 @@ public boolean processWithLegacy(OMUpdateEventBatch events) { String updatedKey = omdbUpdateEvent.getKey(); try { - OMDBUpdateEvent keyTableUpdateEvent = - (OMDBUpdateEvent) omdbUpdateEvent; - OmKeyInfo updatedKeyInfo = keyTableUpdateEvent.getValue(); - OmKeyInfo oldKeyInfo = keyTableUpdateEvent.getOldValue(); + OMDBUpdateEvent keyTableUpdateEvent = omdbUpdateEvent; + Object value = keyTableUpdateEvent.getValue(); + Object oldValue = keyTableUpdateEvent.getOldValue(); + if (!(value instanceof OmKeyInfo)) { + LOG.warn("Unexpected value type {} for key {}. Skipping processing.", + value.getClass().getName(), updatedKey); + continue; + } + OmKeyInfo updatedKeyInfo = (OmKeyInfo) value; + OmKeyInfo oldKeyInfo = (OmKeyInfo) oldValue; // KeyTable entries belong to both Legacy and OBS buckets. // Check bucket layout and if it's OBS