[
https://issues.apache.org/jira/browse/ZOOKEEPER-2572?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16150402#comment-16150402
]
gaoshu edited comment on ZOOKEEPER-2572 at 9/1/17 11:54 AM:
------------------------------------------------------------
In addition, I think the {{itr.logFile.delete()}} can be replaced by
{{Files.delete(itr.logFile.toPath())}}. If failed, Files.delete can throw an
exception, which this is useful for error reporting and to diagnosed why a file
cannot be deleted. Then the function will return void if successful, or throw
an exception. Then we can log the detailed error and rethrow it. But the
Files.delete is available for jdk1.7 +
was (Author: gaoshu):
In addition, I think the {{itr.logFile.delete()}} can be replaced by
{{Files.delete(itr.logFile.toPath())}}. If failed, Files.delete can throw an
exception, which this is useful for error reporting and to diagnosed why a file
cannot be deleted. Then the function will return void if successful, or throw
an exception. Then we can log the detailed error and rethrow it.
> Potential resource leak in FileTxnLog.truncate
> ----------------------------------------------
>
> Key: ZOOKEEPER-2572
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2572
> Project: ZooKeeper
> Issue Type: Bug
> Components: server
> Affects Versions: 3.4.9, 3.5.2
> Reporter: Michael Han
> Fix For: 3.5.4, 3.6.0, 3.4.11
>
>
> In FileTxnLog.truncate, we have:
> {code}
> public boolean truncate(long zxid) throws IOException {
> FileTxnIterator itr = null;
> try {
> itr = new FileTxnIterator(this.logDir, zxid);
> PositionInputStream input = itr.inputStream;
> if(input == null) {
> throw new IOException("No log files found to truncate! This
> could " +
> "happen if you still have snapshots from an old setup
> or " +
> "log files were deleted accidentally or dataLogDir
> was changed in zoo.cfg.");
> }
> long pos = input.getPosition();
> // now, truncate at the current position
> RandomAccessFile raf=new RandomAccessFile(itr.logFile,"rw");
> raf.setLength(pos);
> raf.close();
> while(itr.goToNextLog()) {
> if (!itr.logFile.delete()) {
> LOG.warn("Unable to truncate {}", itr.logFile);
> }
> }
> } finally {
> close(itr);
> }
> return true;
> }
> {code}
> {{raf}} here can be potentially in a state of not closed after leaving the
> method, if there is an (IO) exception thrown from setLength.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)