aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java10
-rw-r--r--library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java33
2 files changed, 38 insertions, 5 deletions
diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java
index aea8000b..aa3089a4 100644
--- a/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java
+++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapper.java
@@ -87,9 +87,13 @@ public class DiskLruCacheWrapper implements DiskCache {
DiskLruCache.Editor editor = getDiskCache().edit(safeKey);
// Editor will be null if there are two concurrent puts. In the worst case we will just silently fail.
if (editor != null) {
- File file = editor.getFile(0);
- if (writer.write(file)) {
- editor.commit();
+ try {
+ File file = editor.getFile(0);
+ if (writer.write(file)) {
+ editor.commit();
+ }
+ } finally {
+ editor.abortUnlessCommitted();
}
}
} catch (IOException e) {
diff --git a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java
index 15d7f0cb..f753cdbf 100644
--- a/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java
+++ b/library/src/test/java/com/bumptech/glide/load/engine/cache/DiskLruCacheWrapperTest.java
@@ -23,14 +23,13 @@ import static junit.framework.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
public class DiskLruCacheWrapperTest {
- private File dir;
private DiskLruCacheWrapper cache;
private byte[] data;
private StringKey key;
@Before
public void setUp() {
- dir = Robolectric.application.getCacheDir();
+ File dir = Robolectric.application.getCacheDir();
cache = new DiskLruCacheWrapper(dir, 10 * 1024 * 1024);
key = new StringKey("test");
data = new byte[] { 1, 2, 3, 4, 5, 6 };
@@ -84,6 +83,36 @@ public class DiskLruCacheWrapperTest {
assertNull(cache.get(key));
}
+ @Test
+ public void testEditIsAbortedIfWriterThrows() throws FileNotFoundException {
+ try {
+ cache.put(key, new DiskCache.Writer() {
+ @Override
+ public boolean write(File file) {
+ throw new RuntimeException("test");
+ }
+ });
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+
+ cache.put(key, new DiskCache.Writer() {
+ @Override
+ public boolean write(File file) {
+ try {
+ new FileOutputStream(file).write(data);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return true ;
+ }
+ });
+
+ byte[] received = isToBytes(new FileInputStream(cache.get(key)), data.length);
+
+ assertTrue(Arrays.equals(data, received));
+ }
+
private static byte[] isToBytes(InputStream is, int length) {
byte[] result = new byte[length];
try {