Improve group handling for priority change and suspend/resume
This commit is contained in:
parent
dedb97166b
commit
164907b691
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue