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 {
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<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
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());
}