Fix the fd leak in SDaemon

This patch prevent SDaemon from leaking the following two file
descriptors.
 * fd for log file
 * fd for task id pipe

This patch also adds some "close"s to make sure output streams
get closed in SDaemon.

Change-Id: I59119243c785526f7b97ac379b0e541cabd44750
Closes-Bug: #1537982
This commit is contained in:
Takashi Kajinami 2016-01-26 13:47:11 +09:00
parent f044d67075
commit e9e1efe07e
6 changed files with 64 additions and 3 deletions

View File

@ -20,7 +20,9 @@
package com.ibm.storlet.common;
import java.io.FileDescriptor;
import java.io.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.HashMap;
public class StorletInputStream {
@ -39,4 +41,11 @@ public class StorletInputStream {
public InputStream getStream() {
return stream;
}
public void close() {
try {
stream.close();
} catch (IOException e) {
}
}
}

View File

@ -47,4 +47,11 @@ public class StorletLogger {
}
}
public void close() {
Flush();
try {
stream.close();
} catch (IOException e) {
}
}
}

View File

@ -47,6 +47,13 @@ public class StorletObjectOutputStream extends StorletOutputStream {
return MetadataStream_;
}
public void closeMD(){
try{
MetadataStream_.close();
} catch (IOException e) {
}
}
@SuppressWarnings("unchecked")
public void setMetadata(Map<String, String> md) throws StorletException {
JSONObject jobj = new JSONObject();
@ -59,9 +66,10 @@ public class StorletObjectOutputStream extends StorletOutputStream {
}
try {
MetadataStream_.write(jobj.toString().getBytes());
MetadataStream_.close();
} catch (IOException e) {
throw new StorletException("Failed to set metadata " + e.toString());
} finally {
closeMD();
}
}
}

View File

@ -21,6 +21,7 @@ package com.ibm.storlet.common;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
@ -36,4 +37,11 @@ public class StorletOutputStream {
public HashMap<String, String> getMetadata() {
return metadata;
}
public void close(){
try{
stream.close();
} catch (IOException e) {
}
}
}

View File

@ -234,6 +234,11 @@ public class SDaemon {
logger_.trace(strStorletName_ + ": problem returning taskId "
+ taskId + ": " + e.toString());
bStatus = false;
} finally {
try{
taskIdOut.close();
} catch (IOException e) {
}
}
} else if (sTask instanceof SDescriptorTask) {
logger_.trace(strStorletName_ + ": Got Descriptor command");

View File

@ -26,6 +26,7 @@ import com.ibm.storlet.common.*;
import java.util.HashMap;
import java.util.ArrayList;
import java.io.IOException;
import java.io.OutputStream;
import java.util.concurrent.Future;
@ -94,6 +95,26 @@ public class SExecutionTask extends SAbstractTask implements Runnable {
taskIdToTask_ = taskIdToTask;
}
/*------------------------------------------------------------------------
* close streams
* */
private void closeStorletInputStreams(){
for(StorletInputStream stream : inStreams_){
stream.close();
}
}
private void closeStorletOutputStreams(){
for(StorletOutputStream stream: outStreams_){
stream.close();
}
}
private void closeStorletStreams(){
closeStorletInputStreams();
closeStorletOutputStreams();
}
/*------------------------------------------------------------------------
* run
*
@ -112,7 +133,10 @@ public class SExecutionTask extends SAbstractTask implements Runnable {
} catch (StorletException e) {
storletLogger_.emitLog(e.getMessage());
} finally {
storletLogger_.Flush();
storletLogger_.close();
// We make sure all streams are closed
closeStorletStreams();
}
}
}