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 {