dlmarion commented on code in PR #3955:
URL: https://github.com/apache/accumulo/pull/3955#discussion_r1402690283


##########
server/manager/src/main/java/org/apache/accumulo/manager/compaction/coordinator/CompactionCoordinator.java:
##########
@@ -1068,8 +1088,73 @@ void 
compactionFailed(Map<ExternalCompactionId,KeyExtent> compactions) {
                     .findFirst().map(Map.Entry::getKey).orElse(null);
             LOG.debug("Unable to remove failed compaction {} {}", extent, 
ecid);
           }
+        } else {
+          // compactionFailed is called from the Compactor when either a 
compaction fails or
+          // is cancelled and it's called from the DeadCompactionDetector. 
This block is
+          // entered when the conditional mutator above successfully deletes 
an ecid from
+          // the tablet metadata. Remove compaction tmp files from the tablet 
directory
+          // that have a corresponding ecid in the name.
+
+          ecidsForTablet.clear();
+          compactions.entrySet().stream().filter(e -> 
e.getValue().compareTo(extent) == 0)
+              .map(Entry::getKey).forEach(ecidsForTablet::add);
+
+          if (!ecidsForTablet.isEmpty()) {
+            final TabletMetadata tm = ctx.getAmple().readTablet(extent, 
ColumnType.DIR);
+            if (tm != null) {
+              final Collection<Volume> vols = 
ctx.getVolumeManager().getVolumes();
+              for (Volume vol : vols) {
+                try {
+                  final String volPath =
+                      vol.getBasePath() + Constants.HDFS_TABLES_DIR + 
Path.SEPARATOR
+                          + extent.tableId().canonical() + Path.SEPARATOR + 
tm.getDirName();
+                  final FileSystem fs = vol.getFileSystem();
+                  for (ExternalCompactionId ecid : ecidsForTablet) {
+                    final String fileSuffix = "_tmp_" + ecid.canonical();
+                    FileStatus[] files = fs.listStatus(new Path(volPath), 
(path) -> {
+                      return path.getName().endsWith(fileSuffix);
+                    });
+                    if (files.length > 0) {
+                      for (FileStatus file : files) {
+                        if (!fs.delete(file.getPath(), false)) {
+                          LOG.warn("Unable to delete ecid tmp file: {}: ", 
file.getPath());
+                        } else {
+                          LOG.debug("Deleted ecid tmp file: {}", 
file.getPath());
+                        }
+                      }
+                    }
+                  }
+                } catch (IOException e) {
+                  LOG.error("Exception deleting compaction tmp files for 
tablet: {}", extent, e);
+                }
+              }
+            } else {
+              // TabletMetadata does not exist for the extent. This could be 
due to a merge or
+              // split operation. Use the utility to find tmp files at the 
table level
+              missingExtentTables.add(extent.tableId());
+            }
+          }
         }
       });
+
+      if (!missingExtentTables.isEmpty()) {
+        for (TableId tid : missingExtentTables) {
+          try {
+            final Set<Path> matches = 
FindCompactionTmpFiles.findTempFiles(ctx, tid.canonical());

Review Comment:
   > Could make missingExtentTables a set at the compaction coordinator level
   
   Could make this Set a class variable in the DeadCompactionDetector, then 
call FindCompactionTmpFiles from `detectDeadCompactions`. This is already being 
done in another thread on a configurable time interval.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to