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:
parent
f044d67075
commit
e9e1efe07e
@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -47,4 +47,11 @@ public class StorletLogger {
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
Flush();
|
||||
try {
|
||||
stream.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user