From d54d1eb3759bd3b96e2b14d341091ef8b67126ac Mon Sep 17 00:00:00 2001 From: Gerd Behrmann Date: Wed, 11 Dec 2013 09:58:10 +0100 Subject: [PATCH] spacemanager: Use imported PoolMonitor to select link group Space manager in some cases has to ask PoolManager to select a link group. This patch changes the code to use an imported copy of the PoolMonitor to achieve the same effect. This reduces load on PoolManager and reduces latency in SpaceManager. Target: trunk Require-notes: yes Require-book: no Acked-by: Albert Rossi Patch: http://rb.dcache.org/r/6351/ --- .../poolManager/PoolManagerV5.java | 80 ----------------- .../diskCacheV111/services/space/Manager.java | 65 ++++++++------ ...ManagerSelectLinkGroupForWriteMessage.java | 88 ------------------- .../services/space/spacemanager.xml | 15 ++++ 4 files changed, 52 insertions(+), 196 deletions(-) delete mode 100644 modules/dcache/src/main/java/org/dcache/vehicles/PoolManagerSelectLinkGroupForWriteMessage.java diff --git a/modules/dcache/src/main/java/diskCacheV111/poolManager/PoolManagerV5.java b/modules/dcache/src/main/java/diskCacheV111/poolManager/PoolManagerV5.java index 348dec6b88c..04a6d5efb86 100644 --- a/modules/dcache/src/main/java/diskCacheV111/poolManager/PoolManagerV5.java +++ b/modules/dcache/src/main/java/diskCacheV111/poolManager/PoolManagerV5.java @@ -45,7 +45,6 @@ import diskCacheV111.vehicles.QuotaMgrCheckQuotaMessage; import diskCacheV111.vehicles.StorageInfo; -import dmg.cells.nucleus.CDC; import dmg.cells.nucleus.CellAddressCore; import dmg.cells.nucleus.CellInfo; import dmg.cells.nucleus.CellMessage; @@ -65,7 +64,6 @@ import org.dcache.poolmanager.Utils; import org.dcache.util.Version; import org.dcache.vehicles.FileAttributes; -import org.dcache.vehicles.PoolManagerSelectLinkGroupForWriteMessage; import static com.google.common.collect.Iterables.transform; @@ -673,84 +671,6 @@ private boolean quotasExceeded(FileAttributes fileAttributes) { } - public DelayedReply messageArrived(PoolManagerSelectLinkGroupForWriteMessage message) - { - return new LinkGroupSelectionTask(message); - } - - /** - * Task for processing link group selection messages. - */ - public class LinkGroupSelectionTask - extends DelayedReply - implements Runnable - { - private final PoolManagerSelectLinkGroupForWriteMessage _message; - private final CDC _cdc; - - public LinkGroupSelectionTask(PoolManagerSelectLinkGroupForWriteMessage message) - { - _message = message; - _cdc = new CDC(); - new Thread(this, "LinkGroupSelectionTask").start(); - } - - @Override - public void run() - { - long started = System.currentTimeMillis(); - try (CDC ignored = _cdc.restore()) { - _log.info("Select link group handler started"); - - _message.setLinkGroups(selectLinkGroups()); - _message.setSucceeded(); - - _log.info("Select link group handler finished after {} ms", - (System.currentTimeMillis() - started)); - } catch (Exception e) { - _message.setFailed(CacheException.UNEXPECTED_SYSTEM_EXCEPTION, - e.getMessage()); - } finally { - reply(_message); - } - } - - protected List selectLinkGroups() - { - FileAttributes fileAttributes = _message.getFileAttributes(); - ProtocolInfo protocolInfo = _message.getProtocolInfo(); - String protocol = - protocolInfo.getProtocol() + "/" + protocolInfo.getMajorVersion(); - String hostName = - (protocolInfo instanceof IpProtocolInfo) - ? ((IpProtocolInfo) protocolInfo).getSocketAddress().getAddress().getHostAddress() - : null; - - Collection linkGroups = _message.getLinkGroups(); - if (linkGroups == null) { - linkGroups = - Utils.linkGroupInfos(_selectionUnit, _costModule).keySet(); - } - - List outputLinkGroups = - new ArrayList<>(linkGroups.size()); - - for (String linkGroup: linkGroups) { - PoolPreferenceLevel [] level = - _selectionUnit.match(DirectionType.WRITE, - hostName, - protocol, - fileAttributes.getStorageInfo(), - linkGroup); - if (level.length > 0) { - outputLinkGroups.add(linkGroup); - } - } - - return outputLinkGroups; - } - } - public PoolManagerGetPoolMonitor messageArrived(PoolManagerGetPoolMonitor msg) { diff --git a/modules/dcache/src/main/java/diskCacheV111/services/space/Manager.java b/modules/dcache/src/main/java/diskCacheV111/services/space/Manager.java index dc3a8077747..9bf2cb3d528 100644 --- a/modules/dcache/src/main/java/diskCacheV111/services/space/Manager.java +++ b/modules/dcache/src/main/java/diskCacheV111/services/space/Manager.java @@ -47,6 +47,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.EnumSet; @@ -58,6 +59,8 @@ import java.util.Objects; import java.util.Set; +import diskCacheV111.poolManager.PoolPreferenceLevel; +import diskCacheV111.poolManager.PoolSelectionUnit; import diskCacheV111.services.space.message.CancelUse; import diskCacheV111.services.space.message.ExtendLifetime; import diskCacheV111.services.space.message.GetFileSpaceTokensMessage; @@ -81,9 +84,9 @@ import diskCacheV111.util.PnfsId; import diskCacheV111.util.RetentionPolicy; import diskCacheV111.util.ThreadManager; -import diskCacheV111.util.TimeoutCacheException; import diskCacheV111.util.VOInfo; import diskCacheV111.vehicles.DoorTransferFinishedMessage; +import diskCacheV111.vehicles.IpProtocolInfo; import diskCacheV111.vehicles.Message; import diskCacheV111.vehicles.PnfsDeleteEntryNotificationMessage; import diskCacheV111.vehicles.PoolAcceptFileMessage; @@ -108,9 +111,10 @@ import org.dcache.auth.Subjects; import org.dcache.cells.CellStub; import org.dcache.namespace.FileAttribute; +import org.dcache.poolmanager.PoolMonitor; +import org.dcache.poolmanager.Utils; import org.dcache.util.JdbcConnectionPool; import org.dcache.vehicles.FileAttributes; -import org.dcache.vehicles.PoolManagerSelectLinkGroupForWriteMessage; /** *
 Space Manager dCache service provides ability
@@ -164,7 +168,7 @@ public final class Manager
         private static IoPackage fileIO = new FileIO();
         private static IoPackage spaceReservationIO = new SpaceReservationIO();
         private static IoPackage linkGroupIO = new LinkGroupIO();
-
+        private PoolMonitor poolMonitor;
 
         @Required
         public void setPoolManagerStub(CellStub poolManagerStub)
@@ -184,6 +188,11 @@ public void setPnfsHandler(PnfsHandler pnfs)
                 this.pnfs = pnfs;
         }
 
+        public void setPoolMonitor(PoolMonitor poolMonitor)
+        {
+                this.poolMonitor = poolMonitor;
+        }
+
         @Required
         public void setJdbcUrl(String jdbcUrl)
         {
@@ -4316,35 +4325,11 @@ private long reserveSpace(Subject subject,
                     protocolInfo != null &&
                     fileAttributes != null) {
                         try {
-                                PoolManagerSelectLinkGroupForWriteMessage msg=
-                                        new PoolManagerSelectLinkGroupForWriteMessage(pnfsId,
-                                                                                      fileAttributes,
-                                                                                      protocolInfo,
-                                                                                      sizeInBytes);
-                                msg.setLinkGroups(linkGroupNames);
-                                logger.trace("Sending PoolManagerSelectLinkGroupForWriteMessage");
-                                msg=poolManagerStub.sendAndWait(msg);
-                                linkGroupNames=msg.getLinkGroups();
-                                logger.trace("received PoolManagerSelectLink" +
-                                        "GroupForWriteMessage reply, number " +
-                                        "of LinkGroups={}", linkGroupNames.size());
+                                linkGroupNames = selectLinkGroupForWrite(protocolInfo, fileAttributes, linkGroupNames);
                                 if(linkGroupNames.isEmpty()) {
                                         throw new SpaceAuthorizationException("PoolManagerSelectLinkGroupForWriteMessage: Failed to find LinkGroup where user is authorized to reserve space.");
                                 }
                         }
-                        catch (TimeoutCacheException e) {
-                                throw new SpaceException(
-                                        "PoolManagerSelectLinkGroupForWriteMessage: request timed out ",
-                                        e);
-                        }
-                        catch (CacheException e) {
-                                throw new SpaceException("Internal error : PoolManagerSelectLinkGroupForWriteMessage  exception ",
-                                                         e);
-                        }
-                        catch (InterruptedException e) {
-                                throw new SpaceException("Request was interrupted",
-                                                       e);
-                        }
                         catch (SpaceAuthorizationException e)  {
                                 logger.warn("authorization problem: {}",
                                         e.getMessage());
@@ -4375,6 +4360,30 @@ private long reserveSpace(Subject subject,
                                                description);
         }
 
+        private List selectLinkGroupForWrite(ProtocolInfo protocolInfo, FileAttributes fileAttributes,
+                                                     Collection linkGroups)
+        {
+                String protocol = protocolInfo.getProtocol() + "/" + protocolInfo.getMajorVersion();
+                String hostName =
+                        (protocolInfo instanceof IpProtocolInfo)
+                                ? ((IpProtocolInfo) protocolInfo).getSocketAddress().getAddress().getHostAddress()
+                                : null;
+
+                List outputLinkGroups = new ArrayList<>(linkGroups.size());
+                for (String linkGroup: linkGroups) {
+                    PoolPreferenceLevel[] level =
+                            poolMonitor.getPoolSelectionUnit().match(PoolSelectionUnit.DirectionType.WRITE,
+                                    hostName,
+                                    protocol,
+                                    fileAttributes.getStorageInfo(),
+                                    linkGroup);
+                    if (level.length > 0) {
+                        outputLinkGroups.add(linkGroup);
+                    }
+                }
+                return outputLinkGroups;
+        }
+
         private long reserveSpaceInLinkGroup(long linkGroupId,
                                              String voGroup,
                                              String voRole,
diff --git a/modules/dcache/src/main/java/org/dcache/vehicles/PoolManagerSelectLinkGroupForWriteMessage.java b/modules/dcache/src/main/java/org/dcache/vehicles/PoolManagerSelectLinkGroupForWriteMessage.java
deleted file mode 100644
index 87d951fa66f..00000000000
--- a/modules/dcache/src/main/java/org/dcache/vehicles/PoolManagerSelectLinkGroupForWriteMessage.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.dcache.vehicles;
-
-import java.util.List;
-
-import diskCacheV111.util.PnfsId;
-import diskCacheV111.vehicles.Message;
-import diskCacheV111.vehicles.ProtocolInfo;
-
-import org.dcache.namespace.FileAttribute;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Message to project a set of link groups to the link groups capable
- * of accepting a given file.
- *
- * The message basically contains two pieces of information: A
- * description of a file that is about to be written (e.g. PnfsId,
- * StorageInfo and ProtocolInfo) and optionally a set of link groups.
- *
- * The reply to the message should hold the subset of the set of link
- * groups that would actually be able to select a write pool for the
- * given file.
- *
- * If no link groups where provided in the request message, i.e.
- * getLinkGroups returns null, then PoolManager must consider all link
- * groups.
- */
-public class PoolManagerSelectLinkGroupForWriteMessage extends Message
-{
-    private static final long serialVersionUID = -5329660627613167395L;
-    private PnfsId _pnfsId;
-    private FileAttributes _fileAttributes;
-    private ProtocolInfo _protocolInfo;
-    private long _fileSize;
-    private String _pnfsPath;
-    private List _linkGroups;
-
-    public PoolManagerSelectLinkGroupForWriteMessage(PnfsId pnfsId,
-                                                     FileAttributes fileAttributes,
-                                                     ProtocolInfo protocolInfo,
-                                                     long fileSize)
-    {
-        _pnfsId = checkNotNull(pnfsId);
-        _fileAttributes = checkNotNull(fileAttributes);
-        _protocolInfo = checkNotNull(protocolInfo);
-        checkArgument(fileAttributes.isDefined(FileAttribute.STORAGEINFO));
-        _fileSize = fileSize;
-    }
-
-    public PnfsId getPnfsId()
-    {
-        return _pnfsId;
-    }
-
-    public long getFileSize()
-    {
-        return _fileSize;
-    }
-
-    public FileAttributes getFileAttributes()
-    {
-        return _fileAttributes;
-    }
-
-    public ProtocolInfo getProtocolInfo()
-    {
-        return _protocolInfo;
-    }
-
-    public List getLinkGroups()
-    {
-        return _linkGroups;
-    }
-
-    public void setLinkGroups(List linkGroups)
-    {
-        _linkGroups = linkGroups;
-    }
-
-    @Override
-    public String getDiagnosticContext()
-    {
-        return super.getDiagnosticContext() + " " + getPnfsId();
-    }
-
-}
diff --git a/modules/dcache/src/main/resources/diskCacheV111/services/space/spacemanager.xml b/modules/dcache/src/main/resources/diskCacheV111/services/space/spacemanager.xml
index 2c9db374b2f..3613b1ed15a 100644
--- a/modules/dcache/src/main/resources/diskCacheV111/services/space/spacemanager.xml
+++ b/modules/dcache/src/main/resources/diskCacheV111/services/space/spacemanager.xml
@@ -14,6 +14,14 @@
     
   
 
+  
+    Task scheduler
+    
+  
+
   
     Pool manager communication stub
     
@@ -21,6 +29,12 @@
     
   
 
+  
+    Maintains runtime information about all pools
+    
+    
+  
+
   
     PNFS manager communication stub
     
@@ -74,6 +88,7 @@
     
     
     
+