Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
None
Description
The background threads used in FileStore are implemented by wrapping Runnable instances in SafeRunnable, and by handing the SafeRunnable instances over to a ScheduledExecutorService.
The documentation of ScheduledExecutorService#scheduleAtFixedRate states that "if any execution of the task encounters an exception, subsequent executions are suppressed". But a SafeRunnable always re-throws any Throwable that it catches, effectively preventing itself from executing again in the future.
There is more than one solution to this problem. One of these is to never re-throw any exception. Even if it doesn't always make sense, e.g. in case of an OutOfMemoryError, never re-throwing an exception would better fulfil the assumption that background threads should always be up and running even in case of error.