Skip to content

Commit

Permalink
fix: partial filestore thread safety fix
Browse files Browse the repository at this point in the history
acquire a lock when writing/deleting files directly from the filestore
  • Loading branch information
fractalwrench committed Apr 23, 2018
1 parent a5ecb8a commit 28f8e12
Showing 1 changed file with 30 additions and 12 deletions.
42 changes: 30 additions & 12 deletions sdk/src/main/java/com/bugsnag/android/FileStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

abstract class FileStore<T extends JsonStream.Streamable> {

Expand All @@ -23,6 +26,8 @@ abstract class FileStore<T extends JsonStream.Streamable> {
private final int maxStoreCount;
private final Comparator<File> comparator;

final Lock lock = new ReentrantLock();

FileStore(@NonNull Configuration config, @NonNull Context appContext, String folder,
int maxStoreCount, Comparator<File> comparator) {
this.config = config;
Expand Down Expand Up @@ -69,6 +74,7 @@ String write(@NonNull T streamable) {

Writer out = null;
try {
lock.lock();
out = new FileWriter(filename);

JsonStream stream = new JsonStream(out);
Expand All @@ -82,34 +88,46 @@ String write(@NonNull T streamable) {
filename), exception);
} finally {
IOUtils.closeQuietly(out);
lock.unlock();
}
return null;
}

@NonNull abstract String getFilename(T streamable);
@NonNull
abstract String getFilename(T streamable);

List<File> findStoredFiles() {
List<File> files = new ArrayList<>();
lock.lock();
try {
List<File> files = new ArrayList<>();

if (storeDirectory != null) {
File dir = new File(storeDirectory);
if (storeDirectory != null) {
File dir = new File(storeDirectory);

if (dir.exists() && dir.isDirectory()) {
File[] values = dir.listFiles();
if (dir.exists() && dir.isDirectory()) {
File[] values = dir.listFiles();

if (values != null) {
files.addAll(Arrays.asList(values));
if (values != null) {
files.addAll(Arrays.asList(values));
}
}
}
return files;
} finally {
lock.unlock();
}
return files;
}

void deleteStoredFiles(Collection<File> storedFiles) {
for (File storedFile : storedFiles) {
if (!storedFile.delete()) {
storedFile.deleteOnExit();
lock.lock();
try {
for (File storedFile : storedFiles) {
if (!storedFile.delete()) {
storedFile.deleteOnExit();
}
}
} finally {
lock.unlock();
}
}

Expand Down

0 comments on commit 28f8e12

Please sign in to comment.