Skip to content

Commit 19117bc

Browse files
committed
ensure, that on any RuntimeException during event consumption the filesystem stays valid
1 parent ea091f0 commit 19117bc

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

src/main/java/org/cryptomator/cryptofs/CryptoFileSystemModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ public Optional<FileStore> provideNativeFileStore(@PathToVault Path pathToVault)
4141
@Provides
4242
@CryptoFileSystemScoped
4343
public Consumer<FilesystemEvent> provideFilesystemEventConsumer(CryptoFileSystemProperties fsProps) {
44-
return (Consumer<FilesystemEvent>) fsProps.get(CryptoFileSystemProperties.PROPERTY_NOTIFY_METHOD);
44+
var eventConsumer = fsProps.fsEventConsumner();
45+
return event -> {
46+
try {
47+
eventConsumer.accept(event);
48+
} catch (RuntimeException e) {
49+
LOG.warn("Filesystem event consumer failed with exception when processing event {}", event, e);
50+
}
51+
};
4552
}
4653
}

src/main/java/org/cryptomator/cryptofs/CryptoFileSystemProperties.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ int shorteningThreshold() {
164164
return (int) get(PROPERTY_SHORTENING_THRESHOLD);
165165
}
166166

167+
Consumer<FilesystemEvent> fsEventConsumner() {
168+
return (Consumer<FilesystemEvent>) get(PROPERTY_NOTIFY_METHOD);
169+
}
170+
167171
@Override
168172
public Set<Entry<String, Object>> entrySet() {
169173
return entries;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.cryptomator.cryptofs;
2+
3+
import org.cryptomator.cryptofs.event.ConflictResolutionFailedEvent;
4+
import org.cryptomator.cryptofs.event.FilesystemEvent;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.Mockito;
8+
9+
import java.nio.file.Path;
10+
import java.util.function.Consumer;
11+
12+
import static org.mockito.Mockito.doThrow;
13+
import static org.mockito.Mockito.mock;
14+
import static org.mockito.Mockito.verify;
15+
import static org.mockito.Mockito.when;
16+
17+
public class CryptoFileSystemModuleTest {
18+
19+
CryptoFileSystemModule inTest = new CryptoFileSystemModule();
20+
21+
@Test
22+
void testEventConsumerIsDecorated() {
23+
var p = Mockito.mock(Path.class);
24+
var event = new ConflictResolutionFailedEvent(p, p, new RuntimeException());
25+
var eventConsumer = (Consumer<FilesystemEvent>) mock(Consumer.class);
26+
doThrow(new RuntimeException("fail")).when(eventConsumer).accept(event);
27+
var props = mock(CryptoFileSystemProperties.class);
28+
when(props.fsEventConsumner()).thenReturn(eventConsumer);
29+
30+
var decoratedConsumer = inTest.provideFilesystemEventConsumer(props);
31+
Assertions.assertDoesNotThrow(() -> decoratedConsumer.accept(event));
32+
verify(eventConsumer).accept(event);
33+
}
34+
35+
}

0 commit comments

Comments
 (0)