From 164907b691cd787bd8b7273e9245a0ce502255b1 Mon Sep 17 00:00:00 2001 From: reusedname <155286845+reusedname@users.noreply.github.com> Date: Tue, 25 Feb 2025 23:30:24 +0500 Subject: [PATCH] Improve group handling for priority change and suspend/resume --- .../recorder/SimplifiedLocalRecorder.java | 102 ++++++++++++------ 1 file changed, 69 insertions(+), 33 deletions(-) diff --git a/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java b/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java index 4161fd67..1b1ee567 100644 --- a/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java @@ -335,11 +335,11 @@ public class SimplifiedLocalRecorder implements Recorder { } finally { recorderLock.unlock(); } - startRecordingProcess(model); + startRecordingProcessAsync(model); } else { Model existing = result.get(); copyModelProperties(model, existing); - startRecordingProcess(existing); + startRecordingProcessAsync(existing); } } @@ -539,11 +539,14 @@ public class SimplifiedLocalRecorder implements Recorder { public void suspendRecording(Model model) { recorderLock.lock(); try { - if (models.contains(model)) { - int index = models.indexOf(model); - models.get(index).setSuspended(true); + int index = models.indexOf(model); + if (index != -1) { + var ourModel = models.get(index); + ourModel.setSuspended(true); model.setSuspended(true); saveConfig(); + + startGroupRecordingOfModel(ourModel); } else { log.warn("Couldn't suspend model {}. Not found in list", model.getName()); return; @@ -574,7 +577,7 @@ public class SimplifiedLocalRecorder implements Recorder { model.setSuspended(false); model.setMarkedForLaterRecording(false); saveConfig(); - startRecordingProcess(m); + startRecordingProcessAsync(m); } else { log.warn("Couldn't resume model {}. Not found in list", model.getName()); } @@ -595,7 +598,7 @@ public class SimplifiedLocalRecorder implements Recorder { model.setForcePriority(true); model.setMarkedForLaterRecording(false); saveConfig(); - startRecordingProcess(m); + startRecordingProcessAsync(m); } else { log.warn("Couldn't force ignore priority for model {}. Not found in list", model.getName()); } @@ -747,7 +750,7 @@ public class SimplifiedLocalRecorder implements Recorder { try { recorderLock.lock(); - startRecordingProcess(model); + startRecordingProcessAsync(model); } finally { recorderLock.unlock(); } @@ -774,7 +777,7 @@ public class SimplifiedLocalRecorder implements Recorder { log.trace("Model online event: {} - suspended:{} - already recording:{}", model, model.isSuspended(), isRecordingRunningForModel(model)); log.trace("Recording processes: {}", recordingProcesses.size()); if (!isSuspended(model) && !isRecordingRunningForModel(model)) { - startRecordingProcess(model); + startRecordingProcessAsync(model); } } } catch (Exception e1) { @@ -786,28 +789,32 @@ public class SimplifiedLocalRecorder implements Recorder { }); } - private void startRecordingProcess(Model model) { + private void startRecordingProcessSync(Model model) { + recorderLock.lock(); + try { + preconditions.check(model); + log.info("Starting recording for model {}", model.getName()); + RecordingProcess download = createDownload(model); + Recording rec = createRecording(download); + setRecordingStatus(rec, State.RECORDING); + rec.getModel().setLastRecorded(rec.getStartDate()); + recordingManager.saveRecording(rec); + recordingLoopPool.submit(() -> {singleRecordingLoop(rec);}); + } catch (RecordUntilExpiredException e) { + log.info("Precondition not met to record {}: {}", model, e.getLocalizedMessage()); + executeRecordUntilSubsequentAction(model); + } catch (PreconditionNotMetException e) { + log.info("Precondition not met to record {}: {}", model, e.getLocalizedMessage()); + } catch (Exception e) { + log.error("Couldn't start recording process for {}", model, e); + } finally { + recorderLock.unlock(); + } + } + + private void startRecordingProcessAsync(Model model) { recordingLoopPool.submit(() -> { - recorderLock.lock(); - try { - preconditions.check(model); - log.info("Starting recording for model {}", model.getName()); - RecordingProcess download = createDownload(model); - Recording rec = createRecording(download); - setRecordingStatus(rec, State.RECORDING); - rec.getModel().setLastRecorded(rec.getStartDate()); - recordingManager.saveRecording(rec); - recordingLoopPool.submit(() -> {singleRecordingLoop(rec);}); - } catch (RecordUntilExpiredException e) { - log.info("Precondition not met to record {}: {}", model, e.getLocalizedMessage()); - executeRecordUntilSubsequentAction(model); - } catch (PreconditionNotMetException e) { - log.info("Precondition not met to record {}: {}", model, e.getLocalizedMessage()); - } catch (Exception e) { - log.error("Couldn't start recording process for {}", model, e); - } finally { - recorderLock.unlock(); - } + startRecordingProcessSync(model); }); } @@ -837,15 +844,44 @@ public class SimplifiedLocalRecorder implements Recorder { } log.error("Recording {} not found. Can't rerun post-processing", recording); } + + private void startGroupRecordingOfModel(Model model) { + var opt = getModelGroup(model); + if (!opt.isPresent()) return; + + var group = opt.get(); + List groupModels = group.getModelUrls().stream() + .map(url -> { + // FIXME: replace loop with hashmap lookup + for (var m : models) { + if (m.getUrl().equals(url)) + return Optional.of(m); + } + return Optional.empty(); + }) + .filter(Optional::isPresent) + .map(x -> (Model)x.get()) + .sorted((l, r) -> Integer.compare(r.getPriority(), l.getPriority())) + .toList(); + + recordingLoopPool.submit(() -> { + for (var groupModel : groupModels) { + startRecordingProcessSync(groupModel); + } + }); + } @Override public void priorityChanged(Model model) { recorderLock.lock(); try { - if (models.contains(model)) { - int index = models.indexOf(model); - models.get(index).setPriority(model.getPriority()); + int index = models.indexOf(model); + if (index != -1) { + var ourModel = models.get(index); + ourModel.setPriority(model.getPriority()); // TODO: is this needed? saveConfig(); + + startGroupRecordingOfModel(ourModel); } else { log.warn("Couldn't change priority for model {}. Not found in list", model.getName()); }