[
https://issues.apache.org/jira/browse/ACCUMULO-3509?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15081675#comment-15081675
]
ASF GitHub Bot commented on ACCUMULO-3509:
------------------------------------------
Github user joshelser commented on a diff in the pull request:
https://github.com/apache/accumulo/pull/62#discussion_r48773083
--- Diff:
server/tserver/src/main/java/org/apache/accumulo/tserver/Tablet.java ---
@@ -1761,33 +1763,41 @@ Scanner createScanner(Range range, int num,
Set<Column> columns, Authorizations
private ScanDataSource isolatedDataSource;
private boolean sawException = false;
private boolean scanClosed = false;
+ private Semaphore scannerSemaphore;
Scanner(Range range, ScanOptions options) {
this.range = range;
this.options = options;
+ scannerSemaphore = new Semaphore(1, true);
}
- synchronized ScanBatch read() throws IOException,
TabletClosedException {
+ ScanBatch read() throws IOException, TabletClosedException {
- if (sawException)
- throw new IllegalStateException("Tried to use scanner after
exception occurred.");
-
- if (scanClosed)
- throw new IllegalStateException("Tried to use scanner after it was
closed.");
+ ScanDataSource dataSource = null;
Batch results = null;
- ScanDataSource dataSource;
+ try {
- if (options.isolated) {
- if (isolatedDataSource == null)
- isolatedDataSource = new ScanDataSource(options);
- dataSource = isolatedDataSource;
- } else {
- dataSource = new ScanDataSource(options);
- }
+ try {
+ scannerSemaphore.acquire();
+ } catch (InterruptedException e) {
+ sawException = true;
+ }
- try {
+ if (sawException)
+ throw new IllegalStateException("Tried to use scanner after
exception occurred.");
--- End diff --
Isn't this exception message a little misleading now if we catch the
InterruptedException above? Would it be better to throw an ISE from the catch
block above with a better message? Or, do we not care what exception we saw?
> Scanner lock cause Tablet lock, hence preventing idle scans from being swept,
> hence blocking SimpleTimer thread
> ----------------------------------------------------------------------------------------------------------------
>
> Key: ACCUMULO-3509
> URL: https://issues.apache.org/jira/browse/ACCUMULO-3509
> Project: Accumulo
> Issue Type: Bug
> Components: tserver
> Affects Versions: 1.6.0
> Reporter: marco polo
> Assignee: marco polo
> Fix For: 1.6.5, 1.7.1, 1.8.0
>
>
> Synchronization with Tablet$Scanner via a read() will block close() being
> called via the sweep method in TabletServer. As a result, the SimpleTimer
> thread does not continue, and idle threads grow until the scan completes.
> My patch, which is forthcoming, converts synchronized methods to use a fair
> lock. If the lock is held by a read call, the close call will attempt to
> obtain it, time out, and return indicating a close was not successful. The
> sweep will continue, and the SimpleTimer thread will respawn later,
> attempting closure on those Tablets at a later time.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)