mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-30 20:31:34 +02:00
Use configured compression method in swap job
This commit is contained in:
@@ -34,6 +34,7 @@ public class SwapJobImpl implements SwapJob {
|
||||
private final RepoStore repoStore;
|
||||
private final DBStore dbStore;
|
||||
private final SwapStore swapStore;
|
||||
private final CompressionMethod compressionMethod;
|
||||
|
||||
private final Timer timer;
|
||||
|
||||
@@ -51,6 +52,7 @@ public class SwapJobImpl implements SwapJob {
|
||||
GiB * cfg.getLowGiB(),
|
||||
GiB * cfg.getHighGiB(),
|
||||
Duration.ofMillis(cfg.getIntervalMillis()),
|
||||
cfg.getCompressionMethod(),
|
||||
lock,
|
||||
repoStore,
|
||||
dbStore,
|
||||
@@ -63,6 +65,7 @@ public class SwapJobImpl implements SwapJob {
|
||||
long lowWatermarkBytes,
|
||||
long highWatermarkBytes,
|
||||
Duration interval,
|
||||
CompressionMethod method,
|
||||
ProjectLock lock,
|
||||
RepoStore repoStore,
|
||||
DBStore dbStore,
|
||||
@@ -72,6 +75,7 @@ public class SwapJobImpl implements SwapJob {
|
||||
this.lowWatermarkBytes = lowWatermarkBytes;
|
||||
this.highWatermarkBytes = highWatermarkBytes;
|
||||
this.interval = interval;
|
||||
this.compressionMethod = method;
|
||||
this.lock = lock;
|
||||
this.repoStore = repoStore;
|
||||
this.dbStore = dbStore;
|
||||
@@ -196,15 +200,29 @@ public class SwapJobImpl implements SwapJob {
|
||||
Log.error("[{}] Exception while running gc on project: {}", projName, e);
|
||||
}
|
||||
long[] sizePtr = new long[1];
|
||||
try (InputStream blob = repoStore.bzip2Project(projName, sizePtr)) {
|
||||
try (InputStream blob = getBlobStream(projName, sizePtr)) {
|
||||
swapStore.upload(projName, blob, sizePtr[0]);
|
||||
dbStore.setLastAccessedTime(projName, null);
|
||||
String compression = SwapJob.compressionMethodAsString(compressionMethod);
|
||||
if (compression == null) {
|
||||
throw new RuntimeException("invalid compression method, should not happen");
|
||||
}
|
||||
dbStore.swap(projName, compression);
|
||||
repoStore.remove(projName);
|
||||
}
|
||||
}
|
||||
Log.info("Evicted project: {}", projName);
|
||||
}
|
||||
|
||||
private InputStream getBlobStream(String projName, long[] sizePtr) throws IOException {
|
||||
if (compressionMethod == CompressionMethod.Gzip) {
|
||||
return repoStore.gzipProject(projName, sizePtr);
|
||||
} else if (compressionMethod == CompressionMethod.Bzip2) {
|
||||
return repoStore.bzip2Project(projName, sizePtr);
|
||||
} else {
|
||||
throw new RuntimeException("invalid compression method, should not happen");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SwapJob#restore(String) for high-level description.
|
||||
*
|
||||
@@ -220,15 +238,23 @@ public class SwapJobImpl implements SwapJob {
|
||||
public void restore(String projName) throws IOException {
|
||||
try (LockGuard __ = lock.lockGuard(projName)) {
|
||||
try (InputStream zipped = swapStore.openDownloadStream(projName)) {
|
||||
repoStore.unbzip2Project(
|
||||
projName,
|
||||
zipped
|
||||
);
|
||||
String compression = dbStore.getSwapCompression(projName);
|
||||
if (compression == null) {
|
||||
throw new RuntimeException("Missing compression method during restore, should not happen");
|
||||
}
|
||||
if ("gzip".equals(compression)) {
|
||||
repoStore.ungzipProject(
|
||||
projName,
|
||||
zipped
|
||||
);
|
||||
} else if ("bzip2".equals(compression)) {
|
||||
repoStore.unbzip2Project(
|
||||
projName,
|
||||
zipped
|
||||
);
|
||||
}
|
||||
swapStore.remove(projName);
|
||||
dbStore.setLastAccessedTime(
|
||||
projName,
|
||||
Timestamp.valueOf(LocalDateTime.now())
|
||||
);
|
||||
dbStore.restore(projName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user