Improve group handling for priority change and suspend/resume

This commit is contained in:
reusedname 2025-02-25 23:30:24 +05:00
parent dedb97166b
commit 164907b691
1 changed files with 69 additions and 33 deletions

View File

@ -335,11 +335,11 @@ public class SimplifiedLocalRecorder implements Recorder {
} finally { } finally {
recorderLock.unlock(); recorderLock.unlock();
} }
startRecordingProcess(model); startRecordingProcessAsync(model);
} else { } else {
Model existing = result.get(); Model existing = result.get();
copyModelProperties(model, existing); copyModelProperties(model, existing);
startRecordingProcess(existing); startRecordingProcessAsync(existing);
} }
} }
@ -539,11 +539,14 @@ public class SimplifiedLocalRecorder implements Recorder {
public void suspendRecording(Model model) { public void suspendRecording(Model model) {
recorderLock.lock(); recorderLock.lock();
try { try {
if (models.contains(model)) { int index = models.indexOf(model);
int index = models.indexOf(model); if (index != -1) {
models.get(index).setSuspended(true); var ourModel = models.get(index);
ourModel.setSuspended(true);
model.setSuspended(true); model.setSuspended(true);
saveConfig(); saveConfig();
startGroupRecordingOfModel(ourModel);
} else { } else {
log.warn("Couldn't suspend model {}. Not found in list", model.getName()); log.warn("Couldn't suspend model {}. Not found in list", model.getName());
return; return;
@ -574,7 +577,7 @@ public class SimplifiedLocalRecorder implements Recorder {
model.setSuspended(false); model.setSuspended(false);
model.setMarkedForLaterRecording(false); model.setMarkedForLaterRecording(false);
saveConfig(); saveConfig();
startRecordingProcess(m); startRecordingProcessAsync(m);
} else { } else {
log.warn("Couldn't resume model {}. Not found in list", model.getName()); 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.setForcePriority(true);
model.setMarkedForLaterRecording(false); model.setMarkedForLaterRecording(false);
saveConfig(); saveConfig();
startRecordingProcess(m); startRecordingProcessAsync(m);
} else { } else {
log.warn("Couldn't force ignore priority for model {}. Not found in list", model.getName()); 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 { try {
recorderLock.lock(); recorderLock.lock();
startRecordingProcess(model); startRecordingProcessAsync(model);
} finally { } finally {
recorderLock.unlock(); 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("Model online event: {} - suspended:{} - already recording:{}", model, model.isSuspended(), isRecordingRunningForModel(model));
log.trace("Recording processes: {}", recordingProcesses.size()); log.trace("Recording processes: {}", recordingProcesses.size());
if (!isSuspended(model) && !isRecordingRunningForModel(model)) { if (!isSuspended(model) && !isRecordingRunningForModel(model)) {
startRecordingProcess(model); startRecordingProcessAsync(model);
} }
} }
} catch (Exception e1) { } 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(() -> { recordingLoopPool.submit(() -> {
recorderLock.lock(); startRecordingProcessSync(model);
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();
}
}); });
} }
@ -837,15 +844,44 @@ public class SimplifiedLocalRecorder implements Recorder {
} }
log.error("Recording {} not found. Can't rerun post-processing", recording); 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<Model> 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 @Override
public void priorityChanged(Model model) { public void priorityChanged(Model model) {
recorderLock.lock(); recorderLock.lock();
try { try {
if (models.contains(model)) { int index = models.indexOf(model);
int index = models.indexOf(model); if (index != -1) {
models.get(index).setPriority(model.getPriority()); var ourModel = models.get(index);
ourModel.setPriority(model.getPriority()); // TODO: is this needed?
saveConfig(); saveConfig();
startGroupRecordingOfModel(ourModel);
} else { } else {
log.warn("Couldn't change priority for model {}. Not found in list", model.getName()); log.warn("Couldn't change priority for model {}. Not found in list", model.getName());
} }