[ 
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)

Reply via email to