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 {