Avoid creating an in-memory copy of the log where possible.

This helps to avoid OOMs on low-memory devices.
This commit is contained in:
akwizgran
2020-07-20 16:46:31 +01:00
parent a83682d4b6
commit 9ea4463cbc
4 changed files with 35 additions and 37 deletions

View File

@@ -26,7 +26,9 @@ import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@@ -54,6 +56,8 @@ import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
public class BriarReportPrimer implements ReportPrimer {
private static final int MAX_PERSISTED_LOG_LINES = 1_000;
@Override
public void primeReport(@NonNull Context ctx,
@NonNull ReportBuilder builder) {
@@ -271,9 +275,16 @@ public class BriarReportPrimer implements ReportPrimer {
File logDir = ctx.getDir("log", MODE_PRIVATE);
StringBuilder sb = new StringBuilder();
try {
for (String line : logManager.getPersistedLog(logDir, old)) {
sb.append(line).append('\n');
Scanner scanner = logManager.getPersistedLog(logDir, old);
LinkedList<String> lines = new LinkedList<>();
int numLines = 0;
while (scanner.hasNextLine()) {
lines.add(scanner.nextLine());
if (numLines == MAX_PERSISTED_LOG_LINES) lines.pollFirst();
else numLines++;
}
scanner.close();
for (String line : lines) sb.append(line).append('\n');
} catch (IOException e) {
sb.append("Could not recover persisted log: ").append(e);
}

View File

@@ -19,7 +19,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
@@ -106,18 +106,19 @@ public class SettingsActivity extends BriarActivity {
ioExecutor.execute(() -> {
try {
File logDir = getApplication().getDir("log", MODE_PRIVATE);
List<String> lines = logManager.getPersistedLog(logDir, old);
if (lines.isEmpty()) {
Scanner scanner = logManager.getPersistedLog(logDir, old);
if (!scanner.hasNextLine()) {
scanner.close();
runOnUiThreadUnlessDestroyed(() ->
Toast.makeText(getApplication(), "Log is empty",
LENGTH_LONG).show());
return;
}
PrintWriter w = new PrintWriter(osp.getOutputStream());
for (String line : lines) {
w.println(line);
}
while (scanner.hasNextLine()) w.println(scanner.nextLine());
w.flush();
w.close();
scanner.close();
runOnUiThreadUnlessDestroyed(() ->
Toast.makeText(getApplication(), "Log exported",
LENGTH_LONG).show());