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 {


Reply via email to