You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by cw...@apache.org on 2013/07/19 17:33:36 UTC
svn commit: r1504920 - in
/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent:
NodeAgent.java launcher/ManagedProcess.java
processors/LinuxProcessMetricsProcessor.java
Author: cwiklik
Date: Fri Jul 19 15:33:36 2013
New Revision: 1504920
URL: http://svn.apache.org/r1504920
Log:
UIMA-3089 fixes file descriptor leak
Modified:
uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java
uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ManagedProcess.java
uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java?rev=1504920&r1=1504919&r2=1504920&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/NodeAgent.java Fri Jul 19 15:33:36 2013
@@ -928,6 +928,9 @@ public class NodeAgent extends AbstractD
|| duccEvent.getState().equals(ProcessState.Failed)
|| duccEvent.getState().equals(ProcessState.Killed)) {
super.getContext().stopRoute(duccEvent.getPid());
+ if ( deployedProcess.getMetricsProcessor() != null ) {
+ deployedProcess.getMetricsProcessor().close(); // close open fds (stat and statm files)
+ }
logger.info(methodName, null,
"----------- Agent Stopped ProcessMemoryUsagePollingRouter for Process:"
+ duccEvent.getPid());
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ManagedProcess.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ManagedProcess.java?rev=1504920&r1=1504919&r2=1504920&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ManagedProcess.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/ManagedProcess.java Fri Jul 19 15:33:36 2013
@@ -30,6 +30,7 @@ import java.util.concurrent.Future;
import org.apache.uima.ducc.agent.event.ProcessLifecycleObserver;
import org.apache.uima.ducc.agent.launcher.ManagedServiceInfo.ServiceState;
+import org.apache.uima.ducc.agent.processors.LinuxProcessMetricsProcessor;
import org.apache.uima.ducc.common.utils.DuccLogger;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.transport.cmdline.ICommandLine;
@@ -146,6 +147,9 @@ public class ManagedProcess implements P
private ProcessMemoryAssignment processMemoryAssignment;
+ private LinuxProcessMetricsProcessor metricsProcessor;
+
+
public ManagedProcess(IDuccProcess process, ICommandLine commandLine) {
this(process, commandLine, null, null, new ProcessMemoryAssignment());
}
@@ -162,6 +166,12 @@ public class ManagedProcess implements P
this.logger = logger;
this.processMemoryAssignment = processMemoryAssignment;
}
+ public void setMetricsProcessor(LinuxProcessMetricsProcessor processor) {
+ metricsProcessor = processor;
+ }
+ public LinuxProcessMetricsProcessor getMetricsProcessor() {
+ return metricsProcessor;
+ }
public ManagedProcess( java.lang.Process process, boolean agentProcess, String correlationId ) {
this.process = process;
this.agentProcess = agentProcess;
@@ -310,6 +320,9 @@ public class ManagedProcess implements P
while (!finished) {
try {
process.waitFor();
+ if ( getMetricsProcessor() != null ) {
+ getMetricsProcessor().close(); // close open fds (stat and statm files)
+ }
} catch (InterruptedException e) {
}
try {
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java?rev=1504920&r1=1504919&r2=1504920&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/processors/LinuxProcessMetricsProcessor.java Fri Jul 19 15:33:36 2013
@@ -70,6 +70,8 @@ public class LinuxProcessMetricsProcesso
private int fudgeFactor = 5; // default is 5%
+ private volatile boolean closed = true;
+
// private int logCounter=0;
public LinuxProcessMetricsProcessor(DuccLogger logger, IDuccProcess process, NodeAgent agent,
String statmFilePath, String nodeStatFilePath, String processStatFilePath,
@@ -84,6 +86,10 @@ public class LinuxProcessMetricsProcesso
this.process = process;
gcStatsCollector = new DuccGarbageStatsCollector(logger, process);
+ // keep a refernce to this so that we can call close() when the process terminates. We need to
+ // close fds to stat and statm files
+ managedProcess.setMetricsProcessor(this);
+
blockSize = agent.getOSPageSize();
if (System.getProperty("ducc.agent.share.size.fudge.factor") != null) {
@@ -93,20 +99,28 @@ public class LinuxProcessMetricsProcesso
e.printStackTrace();
}
}
-
+ closed = false;
}
public void close() {
+ closed = true;
try {
- if (statmFile != null) {
+ if (statmFile != null && statmFile.getFD().valid()) {
statmFile.close();
}
+ if ( processStatFile != null && processStatFile.getFD().valid()) {
+ processStatFile.close();
+ }
+
} catch (Exception e) {
e.printStackTrace();
}
}
public void process(Exchange e) {
+ if ( closed ) { // files closed
+ return;
+ }
if (process.getProcessState().equals(ProcessState.Initializing)
|| process.getProcessState().equals(ProcessState.Running))
try {