--- diskCacheV111/namespace/PnfsManagerV3.java	2007-02-06 15:11:59.000000000 -0600
+++ PnfsManagerUnlV3.java	2007-04-15 19:09:42.000000000 -0500
@@ -1,4 +1,4 @@
-// $Id: PnfsManagerV3.java,v 1.28 2006/12/04 14:34:33 tigran Exp $ 
+// $Id: PnfsManagerV3.java,v 1.28 2006/12/04 14:34:33 tigran Exp $
 
 package diskCacheV111.namespace;
 
@@ -17,46 +17,39 @@
     private String      _cellName  = null ;
     private Args        _args      = null ;
     private CellNucleus _nucleus   = null ;
-    private Random       _random   = new Random(System.currentTimeMillis());
-    private int          _threads  = 1 ;
-    private SyncFifo2 [] _fifos    = null ;
-    
-    private CellPath     _cacheModificationRelay = null ;
-    private boolean      _simulateLargeFiles     = false ;
-    private boolean      _storeFilesize          = false ;
-    
-    private NameSpaceProvider     _nameSpaceProvider = null;
-    private CacheLocationProvider _cacheLocationProvider = null;
-    private StorageInfoProvider   _storageInfoProvider = null;
+    protected Random       _random   = new Random(System.currentTimeMillis());
+    protected int          _threads  = 1 ;
+    protected SyncFifo2 [] _fifos    = null ;
+    
+    protected CellPath     _cacheModificationRelay = null ;
+    private boolean       _simulateLargeFiles     = false ;
+    private boolean       _storeFilesize          = false ;
+    
+    protected NameSpaceProvider     _nameSpaceProvider = null;
+    protected CacheLocationProvider _cacheLocationProvider = null;
+    protected StorageInfoProvider   _storageInfoProvider = null;
+    
     private static final String defaultNameSpaceProvider      = "diskCacheV111.namespace.provider.BasicNameSpaceProviderFactory";
     private static final String defaultCacheLocationProvider  = "diskCacheV111.namespace.provider.BasicNameSpaceProviderFactory";
     private static final String defaultStorageInfoProvider    = "diskCacheV111.namespace.provider.BasicNameSpaceProviderFactory";    
     
-    private class StatItem {
-        String _name = null ;
-        int    _requests = 0 ;
-        int    _failed   = 0 ;
-        private  StatItem( String name ){ _name = name ; }
-        private  void request(){ _requests ++ ; }
-        private  void failed(){ _failed ++ ; }
-        public String toString(){
-            return _name+" "+_requests+" "+_failed ;
-        }
-    }
-    private StatItem _xaddCacheLocation      = new StatItem("addClacheLocation");
-    private StatItem _xclearCacheLocation    = new StatItem("clearClacheLocation");
-    private StatItem _xgetCacheLocations     = new StatItem("getClacheLocations");
-    private StatItem _xcreateDirectory       = new StatItem("createDirectory");
-    private StatItem _xcreateEntry           = new StatItem("createEntry");
-    private StatItem _xdeleteEntry           = new StatItem("deleteEntry");
-    private StatItem _xgetStorageInfo        = new StatItem("getStorageInfo");
-    private StatItem _xsetStorageInfo        = new StatItem("setStorageInfo");
-    private StatItem _xsetLength             = new StatItem("setLength");
-    private StatItem _xgetCacheStatistics    = new StatItem("getCacheStatistics");
-    private StatItem _xupdateCacheStatistics = new StatItem("updateCacheStatistics");
-    private StatItem _xrename                = new StatItem("rename");
+    protected TraceStatItem _xaddCacheLocation      = new TraceStatItem("addCacheLocation");
+    protected TraceStatItem _xclearCacheLocation    = new TraceStatItem("clearCacheLocation");
+    protected TraceStatItem _xgetCacheLocations     = new TraceStatItem("getCacheLocations");
+    protected TraceStatItem _xcreateDirectory       = new TraceStatItem("createDirectory");
+    protected TraceStatItem _xcreateEntry           = new TraceStatItem("createEntry");
+    protected TraceStatItem _xdeleteEntry           = new TraceStatItem("deleteEntry");
+    protected TraceStatItem _xgetStorageInfo        = new TraceStatItem("getStorageInfo");
+    protected TraceStatItem _xsetStorageInfo        = new TraceStatItem("setStorageInfo");
+    protected TraceStatItem _xgetFileMetaData       = new TraceStatItem("getFileMetaData");
+    protected TraceStatItem _xsetFileMetaData       = new TraceStatItem("setFileMetaData");
+    protected TraceStatItem _xsetLength             = new TraceStatItem("setLength");
+    protected TraceStatItem _xgetCacheStatistics    = new TraceStatItem("getCacheStatistics");
+    protected TraceStatItem _xupdateCacheStatistics = new TraceStatItem("updateCacheStatistics");
+    protected TraceStatItem _xrename                = new TraceStatItem("rename");
+    protected TraceStatItem _xmapPath               = new TraceStatItem("mapPath");
     
-    private StatItem [] _requestSet = {
+    protected TraceStatItem [] _requestSet = {
             _xaddCacheLocation ,
             _xclearCacheLocation ,
             _xgetCacheLocations ,
@@ -65,15 +58,21 @@
             _xdeleteEntry ,
             _xgetStorageInfo ,
             _xsetStorageInfo ,
+            _xgetFileMetaData ,
+            _xsetFileMetaData ,
             _xsetLength ,
             _xgetCacheStatistics ,
             _xupdateCacheStatistics ,
-            _xrename
-    } ;
+            _xrename ,
+            _xmapPath
+    };
+    
     public PnfsManagerV3( String cellName , String args ) throws Exception {
         
         super( cellName , PnfsManagerV3.class.getName(),  args , false ) ;
         
+        say("Creating a trace-enabled PnfsManagerV3 from UNL.");
+        
         _cellName = cellName ;
         _args     = getArgs() ;
         _nucleus  = getNucleus() ;
@@ -156,15 +155,25 @@
                 _fifos[i] = new SyncFifo2() ;
                 _nucleus.newThread( new ProcessThread(_fifos[i]), "proc-"+i ).start();           
             }
+            
+            // Start the log collector.
+            String logfile = _args.getOpt("statslogfile");
+            if (logfile != null) {
+                say("Starting log collector: " + logfile);
+            	_nucleus.newThread( new StatProcessThread( logfile ) ).start();
+            } else {
+            	esay("Log collector not started!");
+            }
+            
         } catch (Exception e){
-            esay ("Exception occurred: "+e);
+            esay("Exception occurred: "+e);
             start();
             kill();
             throw e;
         }
         //Make the cell name well-known
         getNucleus().export();
-        start() ;
+        start();
     }
     
     public CellVersion getCellVersion(){ return new CellVersion(diskCacheV111.util.Version.getVersion(),"$Revision: 1.28 $" ); }
@@ -207,11 +216,14 @@
     public String ac_pnfsidof_$_1( Args args )throws Exception {
         PnfsId pnfsId = null;
         StringBuffer sb = new StringBuffer();
+    	StatEntry se = _xaddCacheLocation.startRequest("Fake stat entry in pnfsidof");
         try {
            pnfsId = _nameSpaceProvider.pathToPnfsid(args.argv(0), false);
            sb.append(pnfsId.toString());
+           _xaddCacheLocation.finishRequest(se, "Fake stat entry success.");
         }catch(Exception e){
             sb.append("pnfsidof failed:" +e.getMessage());
+            _xaddCacheLocation.failRequest(se, "Fake stat entry failed.");
         }
                 
         return sb.toString();
@@ -222,12 +234,10 @@
         PnfsId    pnfsId   = null ;       
         StringBuffer sb = new StringBuffer();
         try {
+        	
             try{
-                
                 pnfsId   = new PnfsId( args.argv(0) ) ;
-                
             }catch(Exception ee ){
-                
                 pnfsId = _nameSpaceProvider.pathToPnfsid( args.argv(0), true );
             } 
             
@@ -256,7 +266,6 @@
     public String ac_rename_$_1_2( Args args ){
         
         PnfsId    pnfsId   = null ;
-        PnfsFile  pnfsFile = null ;
         boolean isUnique = false;
         String newName = null;
         try{
@@ -289,7 +298,6 @@
     public String hh_set_meta = "<pnfsid>|<globalPath> <uid> <gid> <perm> <level1> ..." ;
     public String ac_set_meta_$_5_20( Args args )throws Exception {
         PnfsId    pnfsId   = null ;
-        PnfsFile  pnfsFile = null ;
         String reply = null;
         try {
             try{
@@ -437,7 +445,7 @@
         + "        dumthreadqueus prints the context of\n"
         + "        thread[s] queue[s] into the error log file";
 
-    public String hh_dumpthreadqueues = "[<threadId>]\n";
+    public String hh_dumpthreadqueues = "[<threadId>]";
     
     public String ac_dumpthreadqueues_$_0_1(Args args) throws Exception {
         if (args.argc() > 0) {
@@ -470,13 +478,13 @@
         esay( sb.toString() ); 
     } 
     
-    private void updateFlag(PnfsFlagMessage pnfsMessage){
+    protected void updateFlag(PnfsFlagMessage pnfsMessage){
         
         PnfsId pnfsId    = pnfsMessage.getPnfsId();
         String operation = pnfsMessage.getOperation() ;
         String flagName  = pnfsMessage.getFlagName() ;
         String value     = pnfsMessage.getValue() ;
-        say("update flag "+operation+" flag="+flagName+" value="+
+        say("Update flag "+operation+" flag="+flagName+" value="+
                 value+" for "+pnfsId);
         
         try{
@@ -489,7 +497,7 @@
             
         }catch( Exception e ){
             esay("Exception in updateFlag "+e);
-            esay(e) ;
+            esay(e);
             pnfsMessage.setFailed( 77 , e.getMessage() ) ;
         }
     }
@@ -519,35 +527,45 @@
         return null ;
         
     }
+
+    // Message responses:
     
-    private void addCacheLocation(PnfsAddCacheLocationMessage pnfsMessage){
-        say("addCacheLocation : "+pnfsMessage.getPoolName()+" for "+pnfsMessage.getPnfsId());
+    protected void addCacheLocation(PnfsAddCacheLocationMessage pnfsMessage){
+    	String poolName = pnfsMessage.getPoolName();
+    	PnfsId pnfsId = pnfsMessage.getPnfsId();
+        say("addCacheLocation : "+poolName+" for "+pnfsId);
+        StatEntry se = _xaddCacheLocation.startRequest(pnfsId);
         try {
-            _cacheLocationProvider.addCacheLocation(pnfsMessage.getPnfsId(), pnfsMessage.getPoolName());
+            _cacheLocationProvider.addCacheLocation(pnfsId, poolName);
+            _xaddCacheLocation.finishRequest(se, poolName);
         } catch (Exception e){
             esay("Exception in addCacheLocation "+e);
             esay(e) ;
             pnfsMessage.setFailed(4,"Exception in addCacheLocation");
-            _xaddCacheLocation.failed() ;
+            _xaddCacheLocation.failRequest(se);
             //no reply to this message
         }
     }
     
-    private void clearCacheLocation(PnfsClearCacheLocationMessage pnfsMessage){
+    protected void clearCacheLocation(PnfsClearCacheLocationMessage pnfsMessage){
         PnfsId pnfsId = pnfsMessage.getPnfsId();
-        say("clearCacheLocation : "+pnfsMessage.getPoolName()+" for "+pnfsId);
+   		StatEntry se = _xclearCacheLocation.startRequest( pnfsId );
+   		String poolName = pnfsMessage.getPoolName();
+        say("clearCacheLocation : "+poolName+" for "+pnfsId);
         try {
-            _cacheLocationProvider.clearCacheLocation( pnfsId , pnfsMessage.getPoolName(), pnfsMessage.removeIfLast() );            
+            _cacheLocationProvider.clearCacheLocation( pnfsId , poolName, pnfsMessage.removeIfLast() );            
+            _xclearCacheLocation.finishRequest( se );
         } catch (Exception e){
-            _xclearCacheLocation.failed() ;
             esay("Exception in clearCacheLocation for : "+pnfsId+" -> "+e);
             esay(e) ;
             //no reply to this message
+            _xclearCacheLocation.failRequest( se );
         }
     }
     
-    private void getCacheLocations(PnfsGetCacheLocationsMessage pnfsMessage){
+    protected void getCacheLocations(PnfsGetCacheLocationsMessage pnfsMessage){
         PnfsId pnfsId = pnfsMessage.getPnfsId();
+        StatEntry se = _xgetCacheLocations.startRequest(pnfsId);
         try {
             if( pnfsId == null ){
                 //
@@ -567,27 +585,32 @@
             }
             
             say("get cache locations for "+pnfsId);
-            
-            pnfsMessage.setCacheLocations( new Vector(_cacheLocationProvider.getCacheLocation(pnfsId) ));
+            Vector cacheLocations = new Vector(_cacheLocationProvider.getCacheLocation(pnfsId) );
+            pnfsMessage.setCacheLocations( cacheLocations );
             pnfsMessage.setSucceeded();
+            _xgetCacheLocations.finishRequest(se, cacheLocations);
+            return;
         } catch (FileNotFoundCacheException fnf ) {
         	pnfsMessage.setFailed(fnf.getRc(), fnf.getMessage() );
         } catch (Exception exc){
-            _xgetCacheLocations.failed() ;
             esay("Exception in getCacheLocations "+exc);
             esay(exc) ;
             pnfsMessage.setFailed(4,"Pnfs lookup failed");
         }
+        _xgetCacheLocations.failRequest( se );
     }
     
-    private void createDirectory(PnfsCreateDirectoryMessage pnfsMessage){
+    protected void createDirectory(PnfsCreateDirectoryMessage pnfsMessage){
         PnfsId pnfsId = null;
-        say("create directory "+pnfsMessage.getPath());
+        String myPath = pnfsMessage.getPath();
+        StatEntry se = _xcreateEntry.startRequest(myPath);
+        say("create directory " + myPath);
+        
         try {
-            pnfsId = _nameSpaceProvider.createEntry( pnfsMessage.getPath(), true );
+            pnfsId = _nameSpaceProvider.createEntry( myPath, true );
         }catch ( Exception ia ) {
-            _xcreateEntry.failed() ;
             pnfsMessage.setFailed(2, ia.getMessage());
+            _xcreateEntry.failRequest( se );
             return;
         }        
         
@@ -617,22 +640,25 @@
         }catch(Exception eeee){
             esay( "Can't determine storageInfo : "+eeee ) ;
         }
+        _xcreateEntry.finishRequest(se);
         return;
     }
     
-    private void createEntry(PnfsCreateEntryMessage pnfsMessage){
+    protected void createEntry(PnfsCreateEntryMessage pnfsMessage){
         
         PnfsId pnfsId = null;
-        say("create entry "+pnfsMessage.getPath());
+        String myPath = pnfsMessage.getPath();
+        StatEntry se = _xcreateEntry.startRequest(myPath);
+        say("create entry "+myPath);
         try {
             pnfsId = _nameSpaceProvider.createEntry( pnfsMessage.getPath(), false );
         }catch (CacheException ce) {
-            _xcreateEntry.failed() ;
             pnfsMessage.setFailed(ce.getRc(), ce.getMessage());
+            _xcreateEntry.failRequest(se);
             return;            
         }catch ( Exception ia ) {
-            _xcreateEntry.failed() ;
             pnfsMessage.setFailed(2, ia.getMessage());
+            _xcreateEntry.failRequest(se);
             return;
         }        
         
@@ -662,11 +688,13 @@
         }catch(Exception eeee){
             esay( "Can't determine storageInfo : "+eeee ) ;
         }
+        _xcreateEntry.finishRequest(se);
         return;
     }
     
-    private void setStorageInfo( PnfsSetStorageInfoMessage pnfsMessage ){
+    protected void setStorageInfo( PnfsSetStorageInfoMessage pnfsMessage ){
         PnfsId pnfsId   = pnfsMessage.getPnfsId() ;
+        StatEntry se = _xsetStorageInfo.startRequest(pnfsId);
         try{
             if( pnfsId == null ){
                 //
@@ -686,31 +714,38 @@
             say( "setStorageInfo : "+pnfsId ) ;
             
             _storageInfoProvider.setStorageInfo( pnfsId , pnfsMessage.getStorageInfo() , pnfsMessage.getAccessMode() ) ;
-            
+            _xsetStorageInfo.finishRequest(se, pnfsMessage.getStorageInfo());
         }catch(CacheException ee ){
-            _xsetStorageInfo.failed() ;
             esay( "Failed : "+ee ) ;
             esay(ee);
             pnfsMessage.setFailed( ee.getRc() , ee.getMessage() ) ;
+            _xsetStorageInfo.failRequest( se );
         }catch(Exception iee ){
-            _xsetStorageInfo.failed() ;
             esay( "Failed : "+iee ) ;
             esay(iee);
             pnfsMessage.setFailed( 7 , iee.getMessage() ) ;
+            _xsetStorageInfo.failRequest(se);
         }
         return ;
         
     }
     
-    private void getStorageInfo( PnfsGetStorageInfoMessage pnfsMessage ){
+    protected void getStorageInfo( PnfsGetStorageInfoMessage pnfsMessage ){
         PnfsId pnfsId   = pnfsMessage.getPnfsId() ;
+        String pnfsPath = null;
+        StatEntry se = null;
+        if (pnfsId == null) {
+        	pnfsPath = pnfsMessage.getPnfsPath();
+        	se = _xgetStorageInfo.startRequest(pnfsPath); 
+        } else {
+        	se = _xgetStorageInfo.startRequest(pnfsId);
+        }
         try{
             if( pnfsId == null ){
                 //
                 // if the pnfsid is not defined they want 'StorageInfo by path'
                 // let's get the pnfsId
                 //
-                String  pnfsPath    = pnfsMessage.getPnfsPath() ;
                 say("getStorageInfo (by path) global : "+pnfsPath  ) ;
                 PnfsId     id       = _nameSpaceProvider.pathToPnfsid( pnfsPath, true);
                 
@@ -729,9 +764,9 @@
             pnfsMessage.setSucceeded() ;
             say( "Storage info "+info ) ;
             pnfsMessage.setMetaData( _nameSpaceProvider.getFileMetaData( pnfsId ) ) ;
-            
+            _xgetStorageInfo.finishRequest(se, info);
+            return;
         }catch(CacheException ee ){
-            _xgetStorageInfo.failed() ;
             //
             // won't use esay here because this is not really an error. Some
             // services are using this trick just to findout if the file exists,
@@ -741,16 +776,23 @@
             //esay(ee);
             pnfsMessage.setFailed( ee.getRc() , ee.getMessage() ) ;
         }catch(Exception iee ){
-            _xgetStorageInfo.failed() ;
             esay( "Failed : "+iee ) ;
             esay(iee);
             pnfsMessage.setFailed( 7 , iee.getMessage() ) ;
         }
-        return ;
-        
+        _xgetStorageInfo.failRequest(se);
     }
-    private void getFileMetaData( PnfsGetFileMetaDataMessage pnfsMessage ){
+
+    protected void getFileMetaData( PnfsGetFileMetaDataMessage pnfsMessage ){
         PnfsId pnfsId   = pnfsMessage.getPnfsId() ;
+        String pnfsPath = null;
+        StatEntry se = null;
+        if (pnfsId == null) {
+        	pnfsPath = pnfsMessage.getPnfsPath();
+        	se = _xgetFileMetaData.startRequest(pnfsPath + "(plus PNFS ID lookup)");
+        } else {
+        	se = _xgetFileMetaData.startRequest(pnfsId);
+        }
         boolean resolve = pnfsMessage.resolve() ;
         try{
             if( pnfsId == null ){
@@ -758,8 +800,8 @@
                 // if the pnfsid is not defined they want 'StorageInfo by path'
                 // let's get the pnfsId
                 //
-                say("getFileMetaData (by path) : "+  pnfsMessage.getPnfsPath() ) ;
-                PnfsId   id         = _nameSpaceProvider.pathToPnfsid(pnfsMessage.getPnfsPath(), resolve );
+                say("getFileMetaData (by path) : "+  pnfsPath ) ;
+                PnfsId   id         = _nameSpaceProvider.pathToPnfsid(pnfsPath, resolve );
                 if( id == null ) {
                     throw new 
                     CacheException( "can't get pnfsId (not a pnfsfile)" ) ;
@@ -771,70 +813,79 @@
             
             pnfsMessage.setPnfsId( pnfsId ) ;
             pnfsMessage.setSucceeded() ;
-            pnfsMessage.setMetaData( _nameSpaceProvider.getFileMetaData( pnfsId ) ) ;
-            
+            FileMetaData metaData = _nameSpaceProvider.getFileMetaData(pnfsId);
+            pnfsMessage.setMetaData( metaData );
+            _xgetFileMetaData.finishRequest(se, metaData);
+            return;
         }catch(FileNotFoundCacheException fnf ) {
         	pnfsMessage.setFailed( fnf.getRc() , fnf.getMessage() ) ;
         }catch(CacheException ee ){
-            _xgetStorageInfo.failed() ;
             esay( "Failed : "+ee ) ;
             esay(ee);
             pnfsMessage.setFailed( ee.getRc() , ee.getMessage() ) ;
         }catch(Exception iee ){
-            _xgetStorageInfo.failed() ;
             esay( "Failed : "+iee ) ;
             esay(iee);
             pnfsMessage.setFailed( 7 , iee.getMessage() ) ;
         }
+        _xgetFileMetaData.failRequest(se);
         return ;
         
     }
     
-    private void setFileMetaData( PnfsSetFileMetaDataMessage pnfsMessage ) {
-        PnfsId pnfsId   = pnfsMessage.getPnfsId() ;	          
+    protected void setFileMetaData( PnfsSetFileMetaDataMessage pnfsMessage ) {
+        PnfsId pnfsId   = pnfsMessage.getPnfsId() ;
+        StatEntry se = _xsetFileMetaData.startRequest(pnfsId);
         FileMetaData meta = pnfsMessage.getMetaData() ;
         say( "setFileMetaData="+meta+" for "+pnfsId ) ;
         
         try {
             _nameSpaceProvider.setFileMetaData(pnfsId, meta);
+            _xsetFileMetaData.finishRequest(se, meta);
         }catch ( Exception e) {
             esay(e);
+            _xsetFileMetaData.failRequest(se);
         }
         
         return ;
         
     }
     
-    private void deleteEntry(PnfsDeleteEntryMessage pnfsMessage){
+    protected void deleteEntry(PnfsDeleteEntryMessage pnfsMessage){
         String path = pnfsMessage.getPath();
-        if( path != null ) {
+        PnfsId pnfsId = null;
+        StatEntry se = null;
+        if (path == null) {
+        	pnfsId = pnfsMessage.getPnfsId();
+        	se = _xdeleteEntry.startRequest(pnfsId);
+        	say("delete PNFS entry for "+ pnfsId );
+        } else {
             say("delete PNFS entry for "+ path );
+            se = _xdeleteEntry.startRequest(path);
         }
-        else {
-            say("delete PNFS entry for "+ pnfsMessage.getPnfsId() );
-        }
-        
+         
         try {
-            PnfsId pnfsId = pnfsMessage.getPnfsId();
             if( pnfsId == null ) {
                 pnfsId = _nameSpaceProvider.pathToPnfsid( path, false);
             }
             _nameSpaceProvider.deleteEntry( pnfsId );
             pnfsMessage.setSucceeded();
-            
+            _xdeleteEntry.finishRequest(se);
+            return;
         }catch(FileNotFoundCacheException fnf) {
             pnfsMessage.setFailed( fnf.getRc() , fnf.getMessage() ) ;
         } catch (Exception e) {
             esay("delete failed "+e);
             esay(e) ;
-            _xdeleteEntry.failed() ;
             pnfsMessage.setFailed(5, e);
         }
+        _xdeleteEntry.failRequest(se);
     }
     
-    private void setLength(PnfsSetLengthMessage pnfsMessage){
+    protected void setLength(PnfsSetLengthMessage pnfsMessage){
         
         PnfsId pnfsId = pnfsMessage.getPnfsId();
+        StatEntry se = _xsetLength.startRequest(pnfsId);
         long   length = pnfsMessage.getLength();
         
         say("Set length of "+pnfsId+" to "+length+" (Simulate Large = "+_simulateLargeFiles+"; store size = "+_storeFilesize+")");
@@ -848,30 +899,34 @@
                 metadata.setSize( length );
             }                            
             _nameSpaceProvider.setFileMetaData(pnfsId,metadata );
+            _xsetLength.finishRequest(se, length);
+            return;
         }catch(FileNotFoundCacheException fnf) {
         	// file is gone.....
         	pnfsMessage.setFailed( fnf.getRc() , fnf.getMessage() ) ;
         }catch(Exception exc){
             esay("Exception in setLength"+exc);
             esay(exc);
-            _xsetLength.failed() ;
             pnfsMessage.setFailed(4,"Pnfs lookup failed");
         }
+        _xsetLength.failRequest(se);
     }
     
     
-    private void rename(PnfsRenameMessage pnfsMessage) {
+    protected void rename(PnfsRenameMessage pnfsMessage) {
         
         PnfsId pnfsId = pnfsMessage.getPnfsId();
+        StatEntry se = _xrename.startRequest(pnfsId);
         String newName = pnfsMessage.newName();
         say(" rename "+pnfsId+" to new name : "+newName);
         try {
             this.rename(pnfsId, newName , pnfsMessage.isUnique() );
+            _xrename.finishRequest(se, newName);
         }catch( Exception exc){
             esay("Exception in rename "+exc);
             esay(exc);
-            _xrename.failed() ;
             pnfsMessage.setFailed(4,"Pnfs rename failed");            
+            _xrename.failRequest( se );
         }
         
     }
@@ -886,12 +941,12 @@
             newName = uniqueName.toString();
         }        
         
-        say("renameing " + pnfsId + " to " + newName );
+        say("renaming " + pnfsId + " to " + newName );
         _nameSpaceProvider.renameEntry(pnfsId, newName);        
     }
     
     
-    private void removeByPnfsId( PnfsId pnfsId ) throws Exception {
+	private void removeByPnfsId( PnfsId pnfsId ) throws Exception {
         
         say("removeByPnfsId : "+pnfsId );
         
@@ -900,16 +955,20 @@
         return ;
     }
     
-    private String pathfinder( PnfsId pnfsId ) throws Exception {        
+    protected String pathfinder( PnfsId pnfsId ) throws Exception {        
         return _nameSpaceProvider.pnfsidToPath(pnfsId);
     }
     
-    private void mapPath( PnfsMapPathMessage pnfsMessage ){
+    protected void mapPath( PnfsMapPathMessage pnfsMessage ){
         PnfsId pnfsId     = pnfsMessage.getPnfsId() ;
         String globalPath = pnfsMessage.getGlobalPath() ;
-
+        StatEntry se = null;
+        if (pnfsId == null) { se = _xmapPath.startRequest(globalPath); }
+        else if (globalPath == null) { se = _xmapPath.startRequest(pnfsId); }
         if( ( pnfsId == null ) && ( globalPath == null ) ){
+        	se = _xmapPath.startRequest(pnfsId);
             pnfsMessage.setFailed( 5 , "Illegal Arguments : need path or pnfsid" ) ;
+            se.failRequest("Illegal Arguments : need path or pnfsid");
             return ;
         }
         
@@ -921,27 +980,96 @@
                 say("map:  path2id for " + globalPath);
                 pnfsMessage.setPnfsId(_nameSpaceProvider.pathToPnfsid( globalPath, false));
             }
+            _xmapPath.finishRequest(se);
+            return;
         } catch(FileNotFoundCacheException fnf){
         	pnfsMessage.setFailed( fnf.getRc() , fnf.getMessage() ) ;
         } catch (Exception eee) {
             esay("Exception in mapPath (pathfinder) " + eee);
             esay(eee);
             pnfsMessage.setFailed(6, eee);
-        }         
+        }
+        _xmapPath.failRequest(se);
     }
     
-    private void getCacheStatistics(PnfsGetCacheStatisticsMessage pnfsMessage){
+    protected void getCacheStatistics(PnfsGetCacheStatisticsMessage pnfsMessage){
         PnfsId pnfsId = pnfsMessage.getPnfsId();
         say("get cache statistics for "+pnfsId);
         pnfsMessage.setFailed( 5 , "Not supported" ) ;
     }
     
-    private void updateCacheStatistics(PnfsUpdateCacheStatisticsMessage pnfsMessage){
+    protected void updateCacheStatistics(PnfsUpdateCacheStatisticsMessage pnfsMessage){
         PnfsId pnfsId = pnfsMessage.getPnfsId();
         say("update cache statistics for "+pnfsId);
         pnfsMessage.setFailed( 5 , "Not supported" ) ;
     }
     
+    private class StatProcessThread implements Runnable {
+    	
+    		boolean _stop = false;
+    	
+    		BufferedWriter _log_file = null;
+    		
+    		private StatProcessThread( String filename ) throws IOException {
+    			super();
+    			try {
+    				_log_file = new BufferedWriter( new FileWriter(filename, true) );
+    			} catch (Exception e) {
+    				esay("Cannot open up file for log: " + filename.toString());
+    				esay(e);
+    			}
+    		}
+    		
+    		private void setStop() { _stop = true; }
+    	
+    		public void run(){
+    			int length = _requestSet.length;
+    			LinkedList<StatEntry> ll = new LinkedList<StatEntry>();
+    			int count = 0;
+    			for (int i = 0; i < length; i++) {
+    				_requestSet[i].setStatistics(true);
+    			}
+    			say("Starting the stats collector; " + length + " different messages monitored.");
+    			while( _stop != true ) {
+    				for (int i = 0; i < length; i++) {
+    					try{
+    						TraceStatItem tsi = _requestSet[i];
+    						tsi.drainTo(ll);
+    						Iterator it = ll.iterator();
+    						String name = tsi.getName();
+    						while (it.hasNext()) {
+    							count ++;
+	    						StatEntry se = (StatEntry)it.next();
+	        					try {
+	        						_log_file.write(name);
+	        						_log_file.write(": ");
+	        						_log_file.write(se.toString());
+	        						_log_file.write('\n');
+	        					} catch (IOException ie) {
+	        						esay("Caught exception while printing stats: " + ie);
+	        					}
+	        				}
+    						ll.clear();
+    					} catch (Exception e) {
+    						esay("Caught exception in logging thread:" + e.toString());
+    					}
+    				}
+    				try {
+    					_log_file.flush();
+    				} catch (IOException ie) {
+    					esay("Caught exception while flushing log file: " + ie);
+    				}
+    				try {
+    					if (count < 500) 
+    						Thread.sleep(500-count);
+    					if (count > 0)
+    						say(count + " statistics entries collected.");
+    				} catch (Exception e) {esay("Exception thrown " + e.toString());}
+    				count = 0;
+    			}
+    			say("Finishing up the stats collector process.");
+    		}
+    }
     
     private class ProcessThread implements Runnable {
         private SyncFifo2 _fifo = null ;
@@ -952,11 +1080,17 @@
             while( ( message = (CellMessage)_fifo.pop() ) != null ){
                 PnfsMessage pnfsMessage = (PnfsMessage)message.getMessageObject() ;
                 try{
-                    processPnfsMessage( message , pnfsMessage );
+                    pnfsMessageProcessor( message , pnfsMessage );
                 }catch(Throwable processException ){
-                    esay( "processPnfsMessage : "+
+                    esay( "pnfsMessageProcessor : "+
                             Thread.currentThread().getName()+" : "+
                             processException );
+                    esay( "pnfsMessageProcessor recieved message was : " + 
+                    		pnfsMessage + ", type : " + pnfsMessage.getClass().getName());
+                    StringWriter st = new StringWriter();
+                    PrintWriter s = new PrintWriter(st);
+                    processException.printStackTrace(s); s.flush();
+                    esay( "pnfsMessageProcessor stack trace : " + st.toString() );
                 }
             }
             say("Thread <"+Thread.currentThread().getName()+"> finished");
@@ -1003,60 +1137,69 @@
             esay("Problem "+ee.getMessage()+" relaying to "+_cacheModificationRelay+" : "+message ) ;
         }
     }
-    public void processPnfsMessage( CellMessage message , PnfsMessage pnfsMessage ){
+    
+    public void pnfsMessageProcessor( CellMessage message, PnfsMessage pnfsMessage ){
+    	long ctime = System.currentTimeMillis();
+    	
+    	if (!processPnfsMessage( message, pnfsMessage )) {
+            esay("Unexpected message class "+pnfsMessage.getClass());
+            esay("source = "+message.getSourceAddress());
+            return;
+    	}
+    	        
+        say (pnfsMessage.getClass() +" processed in " + (System.currentTimeMillis() - ctime) + " millis");
         
-        long ctime = System.currentTimeMillis();
+        if (! ((Message)pnfsMessage).getReplyRequired() ) return;
+
+        try {
+            message.revertDirection();
+            sendMessage(message);
+        } catch (Exception e){
+            esay("Exception sending message "+e);
+            esay(e);
+        }
+    	
+    }
+    
+    public boolean processPnfsMessage( CellMessage message , PnfsMessage pnfsMessage ){
         
         if (pnfsMessage instanceof PnfsAddCacheLocationMessage){
-            _xaddCacheLocation.request() ;
             addCacheLocation((PnfsAddCacheLocationMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsClearCacheLocationMessage){
-            _xclearCacheLocation.request() ;
             clearCacheLocation((PnfsClearCacheLocationMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsGetCacheLocationsMessage){
-            _xgetCacheLocations.request() ;
             getCacheLocations((PnfsGetCacheLocationsMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsCreateDirectoryMessage){
-            _xcreateDirectory.request() ;
             createDirectory((PnfsCreateDirectoryMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsCreateEntryMessage){
-            _xcreateEntry.request() ;
             createEntry((PnfsCreateEntryMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsDeleteEntryMessage){
-            _xdeleteEntry.request() ;
             deleteEntry((PnfsDeleteEntryMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsGetStorageInfoMessage){
-            _xgetStorageInfo.request() ;
             getStorageInfo((PnfsGetStorageInfoMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsSetStorageInfoMessage){
-            _xsetStorageInfo.request() ;
             setStorageInfo((PnfsSetStorageInfoMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsGetFileMetaDataMessage){
-            _xgetStorageInfo.request() ;
             getFileMetaData((PnfsGetFileMetaDataMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsSetFileMetaDataMessage){
-            _xsetStorageInfo.request() ;
             setFileMetaData((PnfsSetFileMetaDataMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsSetLengthMessage){
-            _xsetLength.request() ;
             setLength((PnfsSetLengthMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsGetCacheStatisticsMessage){
-            _xgetCacheStatistics.request() ;
             getCacheStatistics((PnfsGetCacheStatisticsMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsUpdateCacheStatisticsMessage){
-            _xupdateCacheStatistics.request() ;
             updateCacheStatistics((PnfsUpdateCacheStatisticsMessage)pnfsMessage);
         }
         else if (pnfsMessage instanceof PnfsMapPathMessage){
@@ -1069,23 +1212,11 @@
             updateFlag((PnfsFlagMessage)pnfsMessage);
         }
         else {
-            say("Unexpected message class "+pnfsMessage.getClass());
-            say("source = "+message.getSourceAddress());
-            return;
+        	return false;
         }
         
-        say (pnfsMessage.getClass() +" processed in " + (System.currentTimeMillis() - ctime) + " milis");
-        
-        if (! ((Message)pnfsMessage).getReplyRequired() ){
-            return;
-        }
-        try {
-            message.revertDirection();
-            sendMessage(message);
-        } catch (Exception e){
-            esay("Exception sending message "+e);
-            esay(e);
-        }
+        return true;
+
     }
     
     
