Skip to content

Commit a81c69f

Browse files
[BugFix] Fix the bug causing incomplete image files due to server forced shutdown. (backport #60398) (#60405)
Signed-off-by: gengjun-git <[email protected]> Co-authored-by: gengjun-git <[email protected]>
1 parent 1b6b734 commit a81c69f

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

fe/fe-core/src/main/java/com/starrocks/leader/MetaHelper.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.io.OutputStream;
5555
import java.net.HttpURLConnection;
5656
import java.net.URL;
57+
import java.nio.charset.StandardCharsets;
5758
import java.nio.file.FileStore;
5859
import java.nio.file.Files;
5960
import java.nio.file.Path;
@@ -95,7 +96,7 @@ public static void downloadImageFile(String urlStr, int timeout, String version,
9596
String destFilename = Storage.IMAGE + "." + version;
9697
File partFile = new File(destDir, destFilename + MetaHelper.PART_SUFFIX);
9798
// 1. download to a tmp file image.xxx.part
98-
try (OutputStream out = new FileOutputStream(partFile)) {
99+
try (FileOutputStream out = new FileOutputStream(partFile)) {
99100
URL url = new URL(urlStr);
100101
conn = (HttpURLConnection) url.openConnection();
101102
conn.setConnectTimeout(timeout);
@@ -111,11 +112,13 @@ public static void downloadImageFile(String urlStr, int timeout, String version,
111112
BufferedInputStream bin = new BufferedInputStream(conn.getInputStream());
112113

113114
// Do not limit speed in client side.
114-
long bytes = IOUtils.copyBytes(bin, out, BUFFER_BYTES, CHECKPOINT_LIMIT_BYTES, true);
115-
115+
long bytes = IOUtils.copyBytes(bin, out, BUFFER_BYTES, CHECKPOINT_LIMIT_BYTES, false);
116116
if ((imageSize > 0) && (bytes != imageSize)) {
117117
throw new IOException("Unexpected image size, expected: " + imageSize + ", actual: " + bytes);
118118
}
119+
120+
out.getChannel().force(true);
121+
119122
checksum = conn.getHeaderField(X_IMAGE_CHECKSUM);
120123
} finally {
121124
if (conn != null) {
@@ -125,7 +128,11 @@ public static void downloadImageFile(String urlStr, int timeout, String version,
125128

126129
// 2. write checksum if exists
127130
if (!Strings.isNullOrEmpty(checksum)) {
128-
Files.writeString(Path.of(destDir.getAbsolutePath(), Storage.CHECKSUM + "." + version), checksum);
131+
File checksumFile = Path.of(destDir.getAbsolutePath(), Storage.CHECKSUM + "." + version).toFile();
132+
try (FileOutputStream fos = new FileOutputStream(checksumFile)) {
133+
fos.write(checksum.getBytes(StandardCharsets.UTF_8));
134+
fos.getChannel().force(true);
135+
}
129136
}
130137

131138
// 3. rename to image.xxx

fe/fe-core/src/main/java/com/starrocks/persist/ImageWriter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
import com.starrocks.persist.metablock.SRMetaBlockWriterV2;
2323

2424
import java.io.DataOutputStream;
25+
import java.io.File;
26+
import java.io.FileOutputStream;
2527
import java.io.IOException;
2628
import java.io.OutputStream;
2729
import java.io.OutputStreamWriter;
2830
import java.nio.charset.StandardCharsets;
29-
import java.nio.file.Files;
3031
import java.nio.file.Path;
3132
import java.util.zip.CRC32;
3233
import java.util.zip.CheckedOutputStream;
@@ -68,9 +69,12 @@ public DataOutputStream getDataOutputStream() {
6869

6970
public void saveChecksum() throws IOException {
7071
if (imageFormatVersion == ImageFormatVersion.v2) {
71-
Path path = Path.of(imageDir, Storage.CHECKSUM + "." + imageJournalId);
72+
File checksumFile = Path.of(imageDir, Storage.CHECKSUM + "." + imageJournalId).toFile();
7273
String checksum = String.valueOf(checkedOutputStream.getChecksum().getValue());
73-
Files.writeString(path, checksum);
74+
try (FileOutputStream fos = new FileOutputStream(checksumFile)) {
75+
fos.write(checksum.getBytes(StandardCharsets.UTF_8));
76+
fos.getChannel().force(true);
77+
}
7478
}
7579
}
7680
}

fe/fe-core/src/main/java/com/starrocks/server/GlobalStateMgr.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@
243243
import java.io.DataOutputStream;
244244
import java.io.EOFException;
245245
import java.io.File;
246+
import java.io.FileOutputStream;
246247
import java.io.IOException;
247248
import java.io.InputStream;
248-
import java.io.OutputStream;
249249
import java.nio.file.Files;
250250
import java.util.ArrayList;
251251
import java.util.HashSet;
@@ -1717,7 +1717,7 @@ public void saveImage(ImageWriter imageWriter, File curFile) throws IOException
17171717
LOG.info("start save image to {}. is ckpt: {}", curFile.getAbsolutePath(), GlobalStateMgr.isCheckpointThread());
17181718

17191719
long saveImageStartTime = System.currentTimeMillis();
1720-
try (OutputStream outputStream = Files.newOutputStream(curFile.toPath())) {
1720+
try (FileOutputStream outputStream = new FileOutputStream(curFile)) {
17211721
imageWriter.setOutputStream(outputStream);
17221722
try {
17231723
saveHeader(imageWriter.getDataOutputStream());
@@ -1758,6 +1758,9 @@ public void saveImage(ImageWriter imageWriter, File curFile) throws IOException
17581758
throw new IOException("Save meta block failed ", e);
17591759
}
17601760

1761+
imageWriter.getDataOutputStream().flush();
1762+
outputStream.getChannel().force(true);
1763+
17611764
imageWriter.saveChecksum();
17621765

17631766
long saveImageEndTime = System.currentTimeMillis();

fe/fe-core/src/main/java/com/starrocks/staros/StarMgrServer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,11 @@ public boolean replayAndGenerateImage(String imageDir, long checkPointVersion) t
236236
LOG.warn("middle star mgr image {} already existed.", ckpt.getAbsolutePath());
237237
}
238238
}
239-
try (DataOutputStream out = new DataOutputStream(new FileOutputStream(ckpt))) {
240-
getStarMgr().dumpMeta(out);
239+
try (FileOutputStream fos = new FileOutputStream(ckpt);
240+
DataOutputStream dos = new DataOutputStream(fos)) {
241+
getStarMgr().dumpMeta(dos);
242+
dos.flush();
243+
fos.getChannel().force(true);
241244
}
242245
// Move image.ckpt to image.dataVersion
243246
LOG.info("move star mgr " + ckpt.getAbsolutePath() + " to " + imageFile.getAbsolutePath());

0 commit comments

Comments
 (0)