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 {
|
} 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());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue