summaryrefslogtreecommitdiffstats
path: root/jdisc_http_service/src
diff options
context:
space:
mode:
authorValerij Fredriksen <valerij92@gmail.com>2021-02-11 15:45:29 +0100
committerValerij Fredriksen <valerij92@gmail.com>2021-02-11 15:45:29 +0100
commit71d1f1cacabdf56036849e7b4e63d1ee1dda01b5 (patch)
tree22d25d86b5d7164933b56a79453f19c1cc8de09e /jdisc_http_service/src
parentcc328616254d131072156a8a632e9cf1215527b2 (diff)
Atomic rotation in LogFileHandler
Diffstat (limited to 'jdisc_http_service/src')
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java32
1 files changed, 28 insertions, 4 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java b/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java
index b2d7dd80b7f..6ee78b94401 100644
--- a/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java
+++ b/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java
@@ -18,6 +18,7 @@ import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Optional;
import java.util.concurrent.BlockingQueue;
@@ -400,9 +401,8 @@ class LogFileHandler <LOGTYPE> {
private static void runCompressionZstd(NativeIO nativeIO, Path oldFile) {
try {
Path compressedFile = Paths.get(oldFile.toString() + ".zst");
- Files.createFile(compressedFile);
int bufferSize = 0x400000; // 4M
- try (FileOutputStream fileOut = new FileOutputStream(compressedFile.toFile());
+ try (FileOutputStream fileOut = AtomicFileOutputStream.create(compressedFile);
ZstdOuputStream out = new ZstdOuputStream(fileOut, bufferSize);
FileInputStream in = new FileInputStream(oldFile.toFile())) {
pageFriendlyTransfer(nativeIO, out, fileOut.getFD(), in, bufferSize);
@@ -420,7 +420,7 @@ class LogFileHandler <LOGTYPE> {
private static void runCompressionGzip(NativeIO nativeIO, Path oldFile) {
try {
Path gzippedFile = Paths.get(oldFile.toString() + ".gz");
- try (FileOutputStream fileOut = new FileOutputStream(gzippedFile.toFile());
+ try (FileOutputStream fileOut = AtomicFileOutputStream.create(gzippedFile);
GZIPOutputStream compressor = new GZIPOutputStream(fileOut, 0x100000);
FileInputStream inputStream = new FileInputStream(oldFile.toFile())) {
pageFriendlyTransfer(nativeIO, compressor, fileOut.getFD(), inputStream, 0x400000);
@@ -527,5 +527,29 @@ class LogFileHandler <LOGTYPE> {
}
}
}
-}
+ private static class AtomicFileOutputStream extends FileOutputStream {
+ private final Path path;
+ private final Path tmpPath;
+ private volatile boolean closed = false;
+
+ private AtomicFileOutputStream(Path path, Path tmpPath) throws FileNotFoundException {
+ super(tmpPath.toFile());
+ this.path = path;
+ this.tmpPath = tmpPath;
+ }
+
+ @Override
+ public synchronized void close() throws IOException {
+ super.close();
+ if (!closed) {
+ Files.move(tmpPath, path, StandardCopyOption.ATOMIC_MOVE);
+ closed = true;
+ }
+ }
+
+ private static AtomicFileOutputStream create(Path path) throws FileNotFoundException {
+ return new AtomicFileOutputStream(path, path.resolveSibling("." + path.getFileName() + ".tmp"));
+ }
+ }
+}