forked from j62/ctbrec
1
0
Fork 0

Fix possible ConcurrentModificationException

Access to the models list is now secured by a Lock
This commit is contained in:
0xboobface 2018-10-24 13:06:58 +02:00
parent 1032c9f94a
commit b87f828313
1 changed files with 65 additions and 33 deletions

View File

@ -18,6 +18,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -49,6 +50,7 @@ public class LocalRecorder implements Recorder {
private volatile boolean recording = true;
private List<File> deleteInProgress = Collections.synchronizedList(new ArrayList<>());
private RecorderHttpClient client = new RecorderHttpClient();
private ReentrantLock lock = new ReentrantLock();
public LocalRecorder(Config config) {
this.config = config;
@ -76,13 +78,20 @@ public class LocalRecorder implements Recorder {
public void startRecording(Model model) {
if (!models.contains(model)) {
LOG.info("Model {} added", model);
lock.lock();
try {
models.add(model);
config.getSettings().models.add(model);
} finally {
lock.unlock();
}
}
}
@Override
public void stopRecording(Model model) throws IOException {
lock.lock();
try {
if (models.contains(model)) {
models.remove(model);
config.getSettings().models.remove(model);
@ -93,6 +102,9 @@ public class LocalRecorder implements Recorder {
} else {
throw new NoSuchElementException("Model " + model.getName() + " ["+model.getUrl()+"] not found in list of recorded models");
}
} finally {
lock.unlock();
}
}
private void startRecordingProcess(Model model) throws IOException {
@ -102,10 +114,15 @@ public class LocalRecorder implements Recorder {
return;
}
lock.lock();
try {
if (!models.contains(model)) {
LOG.info("Model {} has been removed. Restarting of recording cancelled.", model);
return;
}
} finally {
lock.unlock();
}
Download download;
if (Config.getInstance().isServerMode()) {
@ -135,12 +152,17 @@ public class LocalRecorder implements Recorder {
@Override
public boolean isRecording(Model model) {
lock.lock();
try {
return models.contains(model);
} finally {
lock.unlock();
}
}
@Override
public List<Model> getModelsRecording() {
return Collections.unmodifiableList(models);
return Collections.unmodifiableList(new ArrayList<>(models));
}
@Override
@ -157,6 +179,8 @@ public class LocalRecorder implements Recorder {
}
private void stopRecordingProcesses() {
lock.lock();
try {
for (Model model : models) {
Download recordingProcess = recordingProcesses.get(model);
if (recordingProcess != null) {
@ -168,6 +192,9 @@ public class LocalRecorder implements Recorder {
}
}
}
} finally {
lock.unlock();
}
}
private void tryRestartRecording(Model model) {
@ -275,6 +302,8 @@ public class LocalRecorder implements Recorder {
public void run() {
running = true;
while (running) {
lock.lock();
try {
for (Model model : getModelsRecording()) {
try {
if (!recordingProcesses.containsKey(model)) {
@ -289,6 +318,9 @@ public class LocalRecorder implements Recorder {
LOG.error("Couldn't check if model {} is online", model.getName(), e);
}
}
} finally {
lock.unlock();
}
try {
if (running)