diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis_snapshot/OmRatisSnapshotProvider.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis_snapshot/OmRatisSnapshotProvider.java index 7031ca0f3d84..6e60f14da302 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis_snapshot/OmRatisSnapshotProvider.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis_snapshot/OmRatisSnapshotProvider.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.FileOutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; @@ -143,8 +144,8 @@ public void downloadSnapshot(String leaderNodeID, File targetFile) OMNodeDetails leader = peerNodesMap.get(leaderNodeID); URL omCheckpointUrl = leader.getOMDBCheckpointEndpointUrl( httpPolicy.isHttpEnabled(), true); - LOG.info("Downloading latest checkpoint from Leader OM {}. Checkpoint " + - "URL: {}", leaderNodeID, omCheckpointUrl); + LOG.info("Downloading latest checkpoint from Leader OM {}. Checkpoint: {} URL: {}", + leaderNodeID, targetFile.getName(), omCheckpointUrl); SecurityUtil.doAsCurrentUser(() -> { HttpURLConnection connection = (HttpURLConnection) connectionFactory.openConnection(omCheckpointUrl, spnegoEnabled); @@ -166,7 +167,7 @@ public void downloadSnapshot(String leaderNodeID, File targetFile) } try (InputStream inputStream = connection.getInputStream()) { - FileUtils.copyInputStreamToFile(inputStream, targetFile); + downloadFileWithProgress(inputStream, targetFile); } catch (IOException ex) { boolean deleted = FileUtils.deleteQuietly(targetFile); if (!deleted) { @@ -181,6 +182,34 @@ public void downloadSnapshot(String leaderNodeID, File targetFile) }); } + /** + * Writes data from the given InputStream to the target file while logging download progress every 30 seconds. + */ + public static void downloadFileWithProgress(InputStream inputStream, File targetFile) + throws IOException { + try (FileOutputStream outputStream = new FileOutputStream(targetFile)) { + byte[] buffer = new byte[8 * 1024]; + long totalBytesRead = 0; + int bytesRead; + long lastLoggedTime = System.currentTimeMillis(); + + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + totalBytesRead += bytesRead; + + // Log progress every 30 seconds + if (System.currentTimeMillis() - lastLoggedTime >= 30000) { + LOG.info("Downloading '{}': {} KB downloaded so far...", + targetFile.getName(), totalBytesRead / (1024)); + lastLoggedTime = System.currentTimeMillis(); + } + } + + LOG.info("Download completed for '{}'. Total size: {} KB", + targetFile.getName(), totalBytesRead / (1024)); + } + } + /** * Writes form data to output stream as any HTTP client would for a * multipart/form-data request.