New settings, reduce config saving spam

- max concurrent http requests (total and per host)
- config saving is delayed for some millis to reduce disk and log spam in case of fast repeated calls
This commit is contained in:
reusedname 2025-02-27 21:54:27 +05:00
parent d07a9ffaaa
commit db13cd09cc
4 changed files with 32 additions and 7 deletions

View File

@ -135,6 +135,9 @@ public class SettingsTab extends Tab implements TabSelectionListener {
private SimpleStringProperty filterWhitelist;
private SimpleBooleanProperty deleteOrphanedRecordingMetadata;
private SimpleIntegerProperty restrictBitrate;
private SimpleIntegerProperty configSavingDelayMs;
private SimpleIntegerProperty httpClientMaxRequests;
private SimpleIntegerProperty httpClientMaxRequestsPerHost;
public SettingsTab(List<Site> sites, Recorder recorder) {
this.sites = sites;
@ -219,6 +222,9 @@ public class SettingsTab extends Tab implements TabSelectionListener {
filterWhitelist = new SimpleStringProperty(null, "filterWhitelist", settings.filterWhitelist);
deleteOrphanedRecordingMetadata = new SimpleBooleanProperty(null, "deleteOrphanedRecordingMetadata", settings.deleteOrphanedRecordingMetadata);
restrictBitrate = new SimpleIntegerProperty(null, "restrictBitrate", settings.restrictBitrate);
configSavingDelayMs = new SimpleIntegerProperty(null, "configSavingDelayMs", settings.configSavingDelayMs);
httpClientMaxRequests = new SimpleIntegerProperty(null, "httpClientMaxRequests", settings.httpClientMaxRequests);
httpClientMaxRequestsPerHost = new SimpleIntegerProperty(null, "httpClientMaxRequestsPerHost", settings.httpClientMaxRequestsPerHost);
}
private void createGui() {
@ -332,7 +338,17 @@ public class SettingsTab extends Tab implements TabSelectionListener {
Setting.of("Password", proxyPassword).needsRestart())),
Category.of("Advanced / Devtools",
Group.of("Networking",
Setting.of("Playlist request timeout (ms)", playlistRequestTimeout, "Timeout in ms for playlist requests")),
Setting.of("Playlist request timeout (ms)", playlistRequestTimeout, "Timeout in ms for playlist requests"),
Setting.of("Max requests", httpClientMaxRequests,
"The maximum number of requests to execute concurrently. Above this requests queue in memory,\n" + //
"waiting for the running calls to complete.\n\n" + //
"If more than [maxRequests] requests are in flight when this is invoked, those requests will remain in flight."),
Setting.of("Max requests per host", httpClientMaxRequestsPerHost,
"The maximum number of requests for each host to execute concurrently. This limits requests by\n" + //
"the URL's host name. Note that concurrent requests to a single IP address may still exceed this\n" + //
"limit: multiple hostnames may share an IP address or be routed through the same HTTP proxy.\n\n" + //
"If more than [maxRequestsPerHost] requests are in flight when this is invoked, those requests will remain in flight.\n\n" + //
"WebSocket connections to hosts **do not** count against this limit.")),
Group.of("Logging",
Setting.of("Log FFmpeg output", logFFmpegOutput, "Log FFmpeg output to files in the system's temp directory"),
Setting.of("Log missed segments", logMissedSegments,
@ -341,7 +357,10 @@ public class SettingsTab extends Tab implements TabSelectionListener {
Setting.of("Use hlsdl (if possible)", useHlsdl,
"Use hlsdl to record the live streams. Some features might not work correctly."),
Setting.of("hlsdl executable", hlsdlExecutable, "Path to the hlsdl executable"),
Setting.of("Log hlsdl output", loghlsdlOutput, "Log hlsdl output to files in the system's temp directory"))));
Setting.of("Log hlsdl output", loghlsdlOutput, "Log hlsdl output to files in the system's temp directory")),
Group.of("Miscelaneous",
Setting.of("Config file saving delay (ms)", configSavingDelayMs,
"Wait specified number of milliseconds before actually writing config to disk"))));
Region preferencesView = prefs.getView();
prefs.onRestartRequired(this::showRestartRequired);
storage.setPreferences(prefs);

View File

@ -143,6 +143,8 @@ public class Settings {
@Deprecated
public String postProcessing = "";
public int playlistRequestTimeout = 2000;
public int httpClientMaxRequests = 64;
public int httpClientMaxRequestsPerHost = 16;
public int postProcessingThreads = 2;
public List<PostProcessorDto> postProcessors = new ArrayList<>();
public String proxyHost;
@ -228,4 +230,5 @@ public class Settings {
public String filterWhitelist = "";
public boolean checkResolutionByMinSide = false;
public int restrictBitrate = 0;
public int configSavingDelayMs = 400;
}

View File

@ -20,6 +20,7 @@ import java.io.File;
import java.io.IOException;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.SocketTimeoutException;
import java.nio.file.Files;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
@ -114,10 +115,10 @@ public abstract class HttpClient {
}
public Response execute(Request request, int timeoutInMillis) throws IOException {
return client.newBuilder() //
.connectTimeout(timeoutInMillis, TimeUnit.MILLISECONDS) //
.readTimeout(timeoutInMillis, TimeUnit.MILLISECONDS).build() //
.newCall(request).execute();
return client.newBuilder() //
.connectTimeout(timeoutInMillis, TimeUnit.MILLISECONDS) //
.readTimeout(timeoutInMillis, TimeUnit.MILLISECONDS).build() //
.newCall(request).execute();
}
public Response executeWithCache(Request req) throws IOException {
@ -171,6 +172,8 @@ public abstract class HttpClient {
}
client = builder.build();
client.dispatcher().setMaxRequests(config.getSettings().httpClientMaxRequests);
client.dispatcher().setMaxRequestsPerHost(config.getSettings().httpClientMaxRequestsPerHost);
}
/**

View File

@ -580,7 +580,7 @@ public class SimplifiedLocalRecorder implements Recorder {
}
}
};
saveConfigTimer.schedule(saveConfigTask, 400);
saveConfigTimer.schedule(saveConfigTask, config.getSettings().configSavingDelayMs);
}
@Override