[
https://issues.apache.org/jira/browse/ASTERIXDB-1690?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Xikui Wang closed ASTERIXDB-1690.
---------------------------------
Resolution: Fixed
> FileSystemWatcher.close() is blocked by FileSystemWatcher.take() when
> monitoring directory.
> -------------------------------------------------------------------------------------------
>
> Key: ASTERIXDB-1690
> URL: https://issues.apache.org/jira/browse/ASTERIXDB-1690
> Project: Apache AsterixDB
> Issue Type: Bug
> Components: Feeds
> Reporter: Xikui Wang
> Assignee: Xikui Wang
>
> When create feed for directory monitoring, disconnect feed can be blocked by
> the FileSystemWatcher. When FileSystemWatcher is waiting for new files, the
> whole object is locked by current thread. So when another thread trying to
> close the watcher, it will be blocked. Here is the take() method from
> FileSystemWatcher:
> {noformat}
> public synchronized File take() throws IOException {
> File next = poll();
> if (next != null) {
> return next;
> }
> if (done || !isFeed) {
> return null;
> }
> // No file was found, wait for the filesystem to push events
> WatchKey key = null;
> lock.lock();
> try {
> while (!it.hasNext()) {
> try {
> key = watcher.take();
> } catch (InterruptedException x) {
> if (LOGGER.isEnabledFor(Level.WARN)) {
> LOGGER.warn("Feed Closed");
> }
> if (watcher == null) {
> return null;
> }
> continue;
> } catch (ClosedWatchServiceException e) {
> if (LOGGER.isEnabledFor(Level.WARN)) {
> LOGGER.warn("The watcher has exited");
> }
> if (watcher == null) {
> return null;
> }
> continue;
> }
> handleEvents(key);
> if (endOfEvents(key)) {
> return null;
> }
> }
> } finally {
> lock.unlock();
> }
> // files were found, re-create the iterator and move it one step
> return it.next();
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)