HBASE-7515 Store.loadStoreFiles should close opened files if there's an exception (Ted Yu)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1431045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
485cf1a3ce
commit
a7fa6e348a
|
@ -19,6 +19,7 @@
|
|||
package org.apache.hadoop.hbase.regionserver;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
@ -429,26 +430,38 @@ public class HStore implements Store, StoreConfiguration {
|
|||
totalValidStoreFile++;
|
||||
}
|
||||
|
||||
IOException ioe = null;
|
||||
try {
|
||||
for (int i = 0; i < totalValidStoreFile; i++) {
|
||||
Future<StoreFile> future = completionService.take();
|
||||
StoreFile storeFile = future.get();
|
||||
long length = storeFile.getReader().length();
|
||||
this.storeSize += length;
|
||||
this.totalUncompressedBytes +=
|
||||
storeFile.getReader().getTotalUncompressedBytes();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("loaded " + storeFile.toStringDetailed());
|
||||
}
|
||||
results.add(storeFile);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
throw new IOException(e);
|
||||
} catch (ExecutionException e) {
|
||||
throw new IOException(e.getCause());
|
||||
try {
|
||||
Future<StoreFile> future = completionService.take();
|
||||
StoreFile storeFile = future.get();
|
||||
long length = storeFile.getReader().length();
|
||||
this.storeSize += length;
|
||||
this.totalUncompressedBytes +=
|
||||
storeFile.getReader().getTotalUncompressedBytes();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("loaded " + storeFile.toStringDetailed());
|
||||
}
|
||||
results.add(storeFile);
|
||||
} catch (InterruptedException e) {
|
||||
if (ioe == null) ioe = new InterruptedIOException(e.getMessage());
|
||||
} catch (ExecutionException e) {
|
||||
if (ioe == null) ioe = new IOException(e.getCause());
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
storeFileOpenerThreadPool.shutdownNow();
|
||||
}
|
||||
if (ioe != null) {
|
||||
// close StoreFile readers
|
||||
try {
|
||||
for (StoreFile file : results) {
|
||||
if (file != null) file.closeReader(true);
|
||||
}
|
||||
} catch (IOException e) { }
|
||||
throw ioe;
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
@ -645,18 +658,25 @@ public class HStore implements Store, StoreConfiguration {
|
|||
});
|
||||
}
|
||||
|
||||
IOException ioe = null;
|
||||
try {
|
||||
for (int i = 0; i < result.size(); i++) {
|
||||
Future<Void> future = completionService.take();
|
||||
future.get();
|
||||
try {
|
||||
Future<Void> future = completionService.take();
|
||||
future.get();
|
||||
} catch (InterruptedException e) {
|
||||
if (ioe == null) {
|
||||
ioe = new InterruptedIOException();
|
||||
ioe.initCause(e);
|
||||
}
|
||||
} catch (ExecutionException e) {
|
||||
if (ioe == null) ioe = new IOException(e.getCause());
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
throw new IOException(e);
|
||||
} catch (ExecutionException e) {
|
||||
throw new IOException(e.getCause());
|
||||
} finally {
|
||||
storeFileCloserThreadPool.shutdownNow();
|
||||
}
|
||||
if (ioe != null) throw ioe;
|
||||
}
|
||||
LOG.info("Closed " + this);
|
||||
return result;
|
||||
|
|
|
@ -624,7 +624,16 @@ public class StoreFile {
|
|||
*/
|
||||
public Reader createReader() throws IOException {
|
||||
if (this.reader == null) {
|
||||
this.reader = open();
|
||||
try {
|
||||
this.reader = open();
|
||||
} catch (IOException e) {
|
||||
try {
|
||||
this.closeReader(true);
|
||||
} catch (IOException ee) {
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
}
|
||||
return this.reader;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue