You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by ch...@apache.org on 2015/11/09 12:34:51 UTC

svn commit: r1713395 - in /uima/sandbox/uima-ducc/trunk: src/main/admin/ uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/ uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/ uima-ducc-common/src/main/java/o...

Author: challngr
Date: Mon Nov  9 11:34:50 2015
New Revision: 1713395

URL: http://svn.apache.org/viewvc?rev=1713395&view=rev
Log:
UIMA-4755 Make the RM node status availd to applications.

Added:
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmNodeState.java
Modified:
    uima/sandbox/uima-ducc/trunk/src/main/admin/ducc_util.py
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IDbProperty.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/IRmPersistence.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/NullRmStatePersistence.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/RmPersistenceFactory.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/services/IStateServices.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbAlive.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbCreate.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbManager.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Machine.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Share.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/history/IHistoryPersistenceManager.java

Modified: uima/sandbox/uima-ducc/trunk/src/main/admin/ducc_util.py
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/src/main/admin/ducc_util.py?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/src/main/admin/ducc_util.py (original)
+++ uima/sandbox/uima-ducc/trunk/src/main/admin/ducc_util.py Mon Nov  9 11:34:50 2015
@@ -162,6 +162,7 @@ class DuccUtil(DuccBase):
 
     def db_configure(self):
         dbhost = self.ducc_properties.get('ducc.database.host')
+        print '----- dbhost', dbhost
         if ( dbhost == self.db_disabled ):
             self.db_bypass = True
             return;
@@ -189,12 +190,12 @@ class DuccUtil(DuccBase):
         if ( self.system == 'Darwin'):
             ps = 'ps -eo user,pid,comm,args ' + pid
         else:
-            ps = 'ps -eo user:14,pid,comm,args ' + pkd
+            ps = 'ps -eo user:14,pid,comm,args ' + pid
         lines = self.popen(ps)
         
         for line in lines:
             line = line.strip()
-            if (pid in line):
+            if (pid in line and 'cassandra' in line):
                 return True
         return False
 
@@ -242,7 +243,7 @@ class DuccUtil(DuccBase):
                     line = lines.readline().strip()
                 except:
                     break
-                # print '[]', line
+                #print '[]', line
                 
                 if ( not line ):
                     break

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IDbProperty.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IDbProperty.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IDbProperty.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IDbProperty.java Mon Nov  9 11:34:50 2015
@@ -39,8 +39,9 @@ public interface IDbProperty
                                      //     than does SQL, we define a translation from the "properties" key to
                                      //     legal SQL syntactic names.  DB does not translate, user must provide
                                      //     a suitable translation.
+    boolean isIndex();            // If true, create a secondary index.
 
-    // If we update this we may have to update db methods that use it
+    // If we update this we may have to update db methods that use it.  We'll try to avoid collections for now.
     public enum Type {
         String,            // Java String
             Blob,          // Java serialized object or other binary

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/IRmPersistence.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/IRmPersistence.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/IRmPersistence.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/IRmPersistence.java Mon Nov  9 11:34:50 2015
@@ -24,6 +24,7 @@ import java.util.Properties;
 
 import org.apache.uima.ducc.common.persistence.IDbProperty;
 import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.id.DuccId;
 
 public interface IRmPersistence
 {
@@ -51,7 +52,7 @@ public interface IRmPersistence
      * @param id This is the primary key, the machine name;
      * @param properties These are the props, must be presented in the form of (String, Object) ...
      */
-    public void setProperties(String id, Object... properties) throws Exception;
+    public void setNodeProperties(String id, Object... properties) throws Exception;
 
     /**
      * Set a property on an object.  If the property cannot be set the action
@@ -65,7 +66,7 @@ public interface IRmPersistence
      *         throw will originate in the DB because of some DB issue. An
      *         exception causes the action to be rolled back.
      */
-    public void setProperty(String id, RmProperty key, Object value) throws Exception;
+    public void setNodeProperty(String id, RmNodes key, Object value) throws Exception;
 
     
     /**
@@ -83,7 +84,23 @@ public interface IRmPersistence
      *
      * @return The db id of the created machine.
      */
-    public void createMachine(String id, Map<RmProperty, Object> props) throws Exception;
+    public void createMachine(String id, Map<RmNodes, Object> props) throws Exception;
+
+    /**
+     * Assign a share to this machine.
+     * @param id The node name
+     * @param jobid The duccid of the job owning the new shoare
+     * @param shareid The DuccId of the new share.
+     */
+    public void addAssignment(String id, DuccId jobid, DuccId shareid);
+
+    /**
+     * Remove a share from the machine.
+     * @param id The node name
+     * @param jobid The duccid of the job owning the new shoare
+     * @param shareid The DuccId of the new share.
+     */
+    public void removeAssignment(String id, DuccId jobid, DuccId shareid);
 
     /**
      * Fetch a machine by its id.
@@ -109,10 +126,15 @@ public interface IRmPersistence
      * @throws Exception.  Anything that goes wrong throws.  Usually the
      *         throw will originate in the DB because of some DB issue. 
      */
-    public Map<String, Properties> getAllMachines() throws Exception;
-
+    public Map<String, Map<String, Object>> getAllMachines() throws Exception;
 
-    enum RmProperty
+    /**
+     * Shutdown the connection to the DB;
+     * 
+     */
+    public void close();
+    
+    enum RmNodes
         implements IDbProperty
     {
         TABLE_NAME {
@@ -121,33 +143,37 @@ public interface IRmPersistence
             public boolean isPrivate() { return true;}
             public boolean isMeta() { return true;}
         },
-        Nodepool {
-            public String pname() { return "nodepool"; }
+        Name {
+            public String pname() { return "name"; }
             public Type type()  { return Type.String; }
             public boolean isPrimaryKey() { return true;}
         },
         Memory {
             public String pname() { return "memory"; }
             public Type type()  { return Type.Integer; }
-            public boolean isPrimaryKey() { return true;}
         },
-        Name {
-            public String pname() { return "name"; }
+        Nodepool {
+            public String pname() { return "nodepool"; }
             public Type type()  { return Type.String; }
-            public boolean isPrimaryKey() { return true;}
         },
         SharesLeft {
             public String pname() { return "shares_left"; }
             public Type type()  { return Type.Integer; }
-            public boolean isPrimaryKey() { return true;}
         },
         Responsive{
             public String pname() { return "responsive"; }
             public Type type()  { return Type.Boolean; }
+            public boolean isIndex() { return true; }
         },
         Online{
             public String pname() { return "online"; }
             public Type type()  { return Type.Boolean; }
+            public boolean isIndex() { return true; }
+        },
+        Reservable{
+            public String pname() { return "reservable"; }
+            public Type type()  { return Type.Boolean; }
+            public boolean isIndex() { return true; }
         },
         Ip {
             public String pname() { return "ip"; }
@@ -157,14 +183,14 @@ public interface IRmPersistence
             public String pname() { return "quantum"; }
             public Type type()  { return Type.Integer; }
         },
+        Classes {
+            public String pname() { return "classes"; }
+            public Type type()  { return Type.String; }
+        },
         ShareOrder {
             public String pname() { return "share_order"; }
             public Type type()  { return Type.Integer; }
         },
-        Shares{
-        	public String pname() { return "shares"; }
-            public Type type()  { return Type.Integer; }
-        },
         Blacklisted {
             public String pname() { return "blacklisted"; }
             public Type type()  { return Type.Boolean; }
@@ -181,6 +207,7 @@ public interface IRmPersistence
         public boolean isPrimaryKey() { return false; }
         public boolean isPrivate()    { return false; }
         public boolean isMeta()       { return false; }
-        public String columnName()     { return pname(); }
+        public String  columnName()   { return pname(); }
+        public boolean isIndex()      { return false; }
     }
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/NullRmStatePersistence.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/NullRmStatePersistence.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/NullRmStatePersistence.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/NullRmStatePersistence.java Mon Nov  9 11:34:50 2015
@@ -23,6 +23,7 @@ import java.util.Map;
 import java.util.Properties;
 
 import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.id.DuccId;
 
 
 public class NullRmStatePersistence implements IRmPersistence
@@ -33,9 +34,12 @@ public class NullRmStatePersistence impl
 	
     public void init(DuccLogger logger) throws Exception { }
     public void clear() {}
-    public void setProperty(String id, RmProperty key, Object value) { }
-    public void setProperties(String id, Object... props) {}
-    public void createMachine(String id, Map<RmProperty, Object> props) { }
+    public void close() {}
+    public void setNodeProperty(String id, RmNodes key, Object value) { }
+    public void setNodeProperties(String id, Object... props) {}
+    public void createMachine(String id, Map<RmNodes, Object> props) { }
+    public void addAssignment(String id, DuccId jobid, DuccId shareid) {}
+    public void removeAssignment(String id, DuccId jobid, DuccId shareid) {}
     public Properties getMachine(String id) { return null; }
-    public Map<String, Properties> getAllMachines() { return new HashMap<String, Properties>(); }
+    public Map<String, Map<String, Object>> getAllMachines() { return new HashMap<String, Map<String, Object>>(); }
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/RmPersistenceFactory.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/RmPersistenceFactory.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/RmPersistenceFactory.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/rm/RmPersistenceFactory.java Mon Nov  9 11:34:50 2015
@@ -40,7 +40,12 @@ public class RmPersistenceFactory
         String clname = System.getProperty("ducc.rm.persistence.impl");
         if ( clname == null ) {
         	DuccLogger logger = DuccService.getDuccLogger();
-        	logger.warn(methodName, null, "RM persistence manager is not configured.  Returning null instance.");
+            if ( logger == null ) {
+                //Can happen when called from command-line utilities
+                System.out.println("RM persistence manager is not configured.  Returning null instance.");
+            } else {
+                logger.warn(methodName, null, "RM persistence manager is not configured.  Returning null instance.");
+            }
             return new NullRmStatePersistence();
         }
         ndx = clname.lastIndexOf(".");

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/services/IStateServices.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/services/IStateServices.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/services/IStateServices.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/services/IStateServices.java Mon Nov  9 11:34:50 2015
@@ -111,6 +111,7 @@ public interface IStateServices {
         public boolean isPrimaryKey() { return false; }
         public boolean isPrivate()  { return false; }
         public boolean isMeta()  { return false; }
+        public boolean isIndex()  { return false; }
         public String columnName() { return pname(); }
     };
 
@@ -244,9 +245,9 @@ public interface IStateServices {
         public boolean isPrimaryKey() { return false; }
         public boolean isPrivate()  { return false; }
         public boolean isMeta()  { return false; }
+        public boolean isIndex()  { return false; }
         public String columnName() { return pname(); }
 
-
      };
 	
     // 

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbAlive.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbAlive.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbAlive.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbAlive.java Mon Nov  9 11:34:50 2015
@@ -86,7 +86,6 @@ public class DbAlive
 
             Metadata metadata = cluster.getMetadata();
             System.out.println("Connected to cluster: " + metadata.getClusterName());
-            String x = DbCreate.DUCC_KEYSPACE;
             KeyspaceMetadata  duccKs = metadata.getKeyspace(DbCreate.DUCC_KEYSPACE);
             if ( duccKs == null ) {
                 System.out.println("DUCC keyspace not found.");

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbCreate.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbCreate.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbCreate.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbCreate.java Mon Nov  9 11:34:50 2015
@@ -19,9 +19,7 @@
 
 package org.apache.uima.ducc.database;
 
-import java.io.FileOutputStream;
 import java.util.List;
-import java.util.Properties;
 import java.util.UUID;
 
 import org.apache.uima.ducc.common.utils.DuccLogger;
@@ -111,7 +109,7 @@ public class DbCreate
                 doLog(methodName, "Changed default super user's password and revoked its superuser authority.");
                 doLog(methodName, "From this point, this DB can only be accessed in super user mode by user 'ducc'");
                     
-                return true;
+                break;
             } catch ( NoHostAvailableException e ) {
                 doLog("Waiting for database to boot ...");
                 session = null;
@@ -186,6 +184,7 @@ public class DbCreate
 
         // A 'keyspace' is what we usually think of as a database.
         session.execute("CREATE KEYSPACE IF NOT EXISTS ducc WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};");
+        session.execute("USE " + DUCC_KEYSPACE);
 
         try {
             List<SimpleStatement>rmSchema = RmStatePersistence.mkSchema();

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbManager.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbManager.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbManager.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbManager.java Mon Nov  9 11:34:50 2015
@@ -74,6 +74,7 @@ public class DbManager
     {
         if ( session == null ) {
             session = cluster.connect();
+            session.execute(new SimpleStatement("USE " + DbCreate.DUCC_KEYSPACE));
         }
 
         return new DbHandle(this);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java Mon Nov  9 11:34:50 2015
@@ -68,6 +68,26 @@ class DbUtil
         return buf.toString();
     }
 
+    static List<String> mkIndices(IDbProperty[] props, String tablename)
+    {
+        List<String> ret = new ArrayList<String>();
+        for ( IDbProperty p : props ) {
+            if ( p.isIndex() ) {
+                StringBuffer buf = new StringBuffer("CREATE INDEX ");
+                buf.append(tablename);
+                buf.append("_");
+                buf.append(p.pname());
+                buf.append("_idx ON ");
+                buf.append(tablename);
+                buf.append("(");
+                buf.append(p.pname());
+                buf.append(")");
+                ret.add(buf.toString());
+            }
+        }
+        return ret;
+    }
+
     static String mkFields(StringBuffer buf, String[] fields)
     {
         int max = fields.length - 1;
@@ -120,7 +140,7 @@ class DbUtil
 
             String k = ok.columnName();
             buf.append(k);
-            vals.append(rep(ok.type(), props.get(ok)));
+            vals.append(rep(ok, props.get(ok)));
 
             if ( current++ < max ) {
                 buf.append(",");
@@ -152,7 +172,7 @@ class DbUtil
 
             String k = ok.columnName();
             buf.append(k);
-            vals.append(rep(ok.type(), props.get(ok)));
+            vals.append(rep(ok, props.get(ok)));
 
             if ( current++ < max ) {
                 buf.append(",");
@@ -182,7 +202,7 @@ class DbUtil
 
                 buf.append(prop.columnName());
                 buf.append("=");
-                buf.append(rep(prop.type(), props[i+1]));
+                buf.append(rep(prop, props[i+1]));
                 if ( i + 2 < len ) {
                     buf.append(",");
                 }  
@@ -196,15 +216,14 @@ class DbUtil
     /**
      * Return the correct representation for CQL update, of val, for the indicated type, for this database.
      */
-    static String rep(Type t, Object val)
+    static String rep(IDbProperty p, Object val)
     {
-        switch ( t ) {
-        case String:
-            return "'" + val.toString() + "'";
-        default:
-            return val.toString();
+        switch ( p.type() ) {
+            case String:
+                return "'" + val.toString() + "'";
+            default:
+                return val.toString();
         }
-
     }
 
     /**
@@ -218,7 +237,7 @@ class DbUtil
             case Blob:
                 return  "blob";
             case String:
-                return  "text";
+                return  "varchar";
             case Boolean:
                 return "boolean";
             case Integer:

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmNodeState.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmNodeState.java?rev=1713395&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmNodeState.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmNodeState.java Mon Nov  9 11:34:50 2015
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+
+package org.apache.uima.ducc.database;
+
+import java.util.Map;
+
+import org.apache.uima.ducc.common.persistence.rm.IRmPersistence;
+import org.apache.uima.ducc.common.persistence.rm.RmPersistenceFactory;
+import org.apache.uima.ducc.common.utils.DuccLogger;
+
+public class RmNodeState
+{
+    DuccLogger logger = DuccLogger.getLogger(RmNodeState.class, "State");
+    String dburl = null;
+    
+    RmNodeState(String dburl)
+    {
+        this.dburl = dburl;
+    }
+
+    void run()
+        throws Exception
+    {
+        IRmPersistence persistence = RmPersistenceFactory.getInstance(this.getClass().getName(), "RM");
+        
+        try {
+			Map<String, Map<String, Object>> state = persistence.getAllMachines();
+			for ( String node : state.keySet() ) {
+			    StringBuffer buf = new StringBuffer(node);
+			    buf.append(": ");
+			    Map<String, Object> st = state.get(node);
+			    for ( String k : st.keySet() ) {
+			        buf.append(k);
+			        buf.append("[");
+			        buf.append(st.get(k).toString());
+			        buf.append("] ");
+			    }
+			    System.out.println(buf.toString());
+			}
+		} finally {
+            persistence.close();
+        }
+    }
+
+    public static void main(String[] args)
+    {
+        if ( args.length != 1 ) {
+            System.out.println("Usage: RmNodeState <dburl>");
+            System.exit(1);
+        }
+        System.setProperty("ducc.state.database.url", args[0]);
+
+        RmNodeState rns = new RmNodeState(args[0]);
+        try {
+            rns.run();
+        } catch ( Exception e ) {
+            e.printStackTrace();
+        }
+    }
+}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java Mon Nov  9 11:34:50 2015
@@ -27,7 +27,10 @@ import java.util.Properties;
 
 import org.apache.uima.ducc.common.persistence.rm.IRmPersistence;
 import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.id.DuccId;
 
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
 import com.datastax.driver.core.SimpleStatement;
 
 /**
@@ -40,6 +43,8 @@ public class RmStatePersistence
 
     DbManager dbManager = null;
     DuccLogger logger = null;
+    static final String RM_NODE_TABLE = RmNodes.TABLE_NAME.pname();
+
     public RmStatePersistence()
     {
     }
@@ -66,9 +71,10 @@ public class RmStatePersistence
         init(stateUrl);
     }
 
-    public void shutdown()
+    public void close()
     {
         dbManager.shutdown();
+        dbManager = null;
     }
 
     public void clear()
@@ -78,7 +84,7 @@ public class RmStatePersistence
         DbHandle h = null;
         try {
             h = dbManager.open();
-            h.execute("TRUNCATE ducc.rmnodes");
+            h.execute("TRUNCATE " + RM_NODE_TABLE);
         } catch ( Exception e ) {
             logger.error(methodName, null, "Cannot clear the database.", e);
         } 
@@ -88,46 +94,32 @@ public class RmStatePersistence
     	throws Exception
     {
         List<SimpleStatement> ret = new ArrayList<SimpleStatement>();
-
-        StringBuffer buf = new StringBuffer("CREATE TABLE IF NOT EXISTS ducc." + RmProperty.TABLE_NAME.pname() + " (");
-        buf.append(DbUtil.mkSchema(RmProperty.values()));
-        buf.append(") WITH CLUSTERING ORDER BY (memory desc, name asc, shares_left desc)");
-
+        
+        StringBuffer buf = new StringBuffer("CREATE TABLE IF NOT EXISTS " + RM_NODE_TABLE + " (");
+        buf.append(DbUtil.mkSchema(RmNodes.values()));
+        buf.append(")");
         ret.add(new SimpleStatement(buf.toString()));
+        List<String> indexes = DbUtil.mkIndices(RmNodes.values(), RM_NODE_TABLE);
+        for ( String s : indexes ) {
+            ret.add(new SimpleStatement(s));
+        }
         return ret;
     }
 
-    // static String[] mkSchemaItems()
-    // {
-    //     int size = RmProperty.values().length;
-    //     String[] ret = new String[size];
-    //     int ndx = 0;
-
-    //     for ( RmProperty n: RmProperty.values() ) {
-    //         String s = n.pname();
-    //         s = s + " " + DbUtil.typeToString(n.type());
-    //         if ( n.isPrimaryKey() ) {
-    //             s = s + " PRIMARY KEY";
-    //         }
-    //         ret[ndx++] = s;
-    //     }
-    //     return ret;
-    // }
-
-    public void createMachine(String m, Map<RmProperty, Object> props)
+    public void createMachine(String m, Map<RmNodes, Object> props)
     	throws Exception
     {
         String methodName = "createMachine";
         DbHandle h = dbManager.open();
         try {           
-            String cql = DbUtil.mkInsert("ducc.rmnodes", props);
+            String cql = DbUtil.mkInsert(RM_NODE_TABLE, props);
             h.execute(cql);
         } catch ( Exception e ) {
             logger.error(methodName, null, "Error creating new record:", e);
         } 
     }
 
-    public void setProperties(String node, Object... props)
+    public void setNodeProperties(String node, Object... props)
     	throws Exception
     {
         String methodName = "setProperties";
@@ -140,9 +132,9 @@ public class RmStatePersistence
         DbHandle h = dbManager.open();
 
         try {           
-            h.updateProperties("ducc.rmnodes", "WHERE name='" + node + "'", props);
+            h.updateProperties(RM_NODE_TABLE, "name='" + node + "'", props);
         } catch ( Exception e ) {
-            logger.error(methodName, null, "Problem setting properties");
+            logger.error(methodName, null, "Problem setting properties", e);
         } finally {           
             logger.info(methodName, null, "Total time to update properties on", System.currentTimeMillis() - now);
 
@@ -150,7 +142,7 @@ public class RmStatePersistence
         
     }
 
-    public void setProperty(String node, RmProperty k, Object v)
+    public void setNodeProperty(String node, RmNodes k, Object v)
     	throws Exception
     {
         String methodName = "setProperty";
@@ -158,23 +150,71 @@ public class RmStatePersistence
         DbHandle h = dbManager.open();
 
         try {           
-            h.updateProperty("ducc.rmnodes", "name='" + node + "'", k.columnName(), v);
+            h.updateProperty(RM_NODE_TABLE, "name='" + node + "'", k.columnName(), v);
         } catch ( Exception e ) {
-            logger.error(methodName, null, "Problem setting properties.");
+            logger.error(methodName, null, "Problem setting properties:", e);
         } 
         
     }
-    
+
+    public void addAssignment(String node, DuccId jobid, DuccId shareid)
+    {
+    }
+
+    public void removeAssignment(String node, DuccId jobid, DuccId shareid)
+    {
+    }
+
     public Properties getMachine(String m)
     	throws Exception
     {
     	return null;
     }
     
-    public Map<String, Properties> getAllMachines()
+    public Map<String, Map<String, Object>> getAllMachines()
     	throws Exception
-   {
-    	return new HashMap<String, Properties>();
+    {
+    	String methodName = "getAllMachiens";
+        Map<String, Map<String, Object>> ret = new HashMap<String, Map<String, Object>>();
+        String cql = "SELECT * FROM " + RM_NODE_TABLE;
+        DbHandle h = dbManager.open();
+        ResultSet rs = h.execute(cql);
+        for ( Row r : rs ) {
+            Map<String, Object> mach = new HashMap<String, Object>();
+            // We don't expect any nulls in this table
+            for ( RmNodes n : RmNodes.values() ) {
+                if ( n.isPrivate() ) continue;
+                if ( n.isMeta()    ) continue;
+                switch ( n.type() ) {
+
+                    case String: {
+                        String  v = r.getString(n.columnName());
+                        mach.put(n.pname(), v);
+                        if ( n == RmNodes.Name ) {
+                            ret.put(v, mach);                            
+                        }
+                    }
+                    break;
+
+                    case Integer: {
+                        int v = r.getInt(n.columnName());
+                        mach.put(n.pname(), v);
+                    }
+                    break;
+
+                    case Boolean: {
+                        boolean v = r.getBool(n.columnName());
+                        mach.put(n.pname(), v);
+                    }
+                    break;
+
+                    default:
+                        logger.warn(methodName, null, "Unexpected value in db:", n.pname(), "type", n.type(), "is not recognized.");
+                        break;
+                }
+            }
+        }
+        return ret;
    }
     
     public static void main(String[] args)

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Machine.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Machine.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Machine.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Machine.java Mon Nov  9 11:34:50 2015
@@ -26,7 +26,7 @@ import org.apache.uima.ducc.common.NodeI
 import org.apache.uima.ducc.common.admin.event.RmQueriedMachine;
 import org.apache.uima.ducc.common.admin.event.RmQueriedShare;
 import org.apache.uima.ducc.common.persistence.rm.IRmPersistence;
-import org.apache.uima.ducc.common.persistence.rm.IRmPersistence.RmProperty;
+import org.apache.uima.ducc.common.persistence.rm.IRmPersistence.RmNodes;
 import org.apache.uima.ducc.common.persistence.rm.RmPersistenceFactory;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.common.utils.id.DuccId;
@@ -171,10 +171,11 @@ public class Machine
     {
         String methodName = "heartbeatArrives";
         long now = System.currentTimeMillis();
-        if ( heartbeats == 0 ) return;               // no need to rereset it
+        if ( heartbeats == 0 ) return;
+        heartbeats = 0;
         try {
-            logger.info(methodName, null, "Reset heartbeat to 0");
-			persistence.setProperty(id, RmProperty.Heartbeats, 0);
+            logger.info(methodName, null, "Reset heartbeat to 0 from", heartbeats);
+			persistence.setNodeProperty(id, RmNodes.Heartbeats, 0);
             logger.info(methodName, null, "Time to reset heartbeat", System.currentTimeMillis() - now);
 		} catch (Exception e) {
             logger.warn(methodName, null, "Cannot update heartbeat count in database:", e);
@@ -187,10 +188,10 @@ public class Machine
         long now = System.currentTimeMillis();
 
         if ( c < 2 ) return;                    // we allow a couple because timing and races can create false negatives
+        heartbeats = c;
         try {
-            heartbeats = c;
             logger.info(methodName, null, "Missed heartbeat count", c);
-			persistence.setProperty(id, RmProperty.Heartbeats, c);
+			persistence.setNodeProperty(id, RmNodes.Heartbeats, c);
             logger.info(methodName, null, "Time to record misssed heartbeat", System.currentTimeMillis() - now);
 		} catch (Exception e) {
             logger.warn(methodName, null, "Cannot update heartbeat count in database:", e);
@@ -317,7 +318,9 @@ public class Machine
         activeShares.put(s, s);
         shares_left -= s.getShareOrder();
         try {
-			persistence.setProperties(id, RmProperty.Assignments, activeShares.size(), RmProperty.SharesLeft, shares_left);
+            // Not transactional.  If this turns into a problem we'll have to find a way
+			persistence.setNodeProperties(id, RmNodes.Assignments, activeShares.size(), RmNodes.SharesLeft, shares_left);
+			persistence.addAssignment(id, s.getJob().getId(), s.getId()); // update jobs on machine and specific shares
             logger.info(methodName, null, "Time to assign share in db", System.currentTimeMillis() - now);
 		} catch (Exception e) {
             logger.warn(methodName, null, "Cannot save state; shares_left", shares_left);
@@ -334,7 +337,9 @@ public class Machine
         nodepool.removeShare(s);
         shares_left += s.getShareOrder();
         try {
-			persistence.setProperties(id, RmProperty.Assignments, activeShares.size(), RmProperty.SharesLeft, shares_left);
+            // Not transactional.  If this turns into a problem we'll have to find a way
+			persistence.setNodeProperties(id, RmNodes.Assignments, activeShares.size(), RmNodes.SharesLeft, shares_left);
+			persistence.removeAssignment(id, s.getJob().getId(), s.getId());  // update jobs on machine and specific shares
             logger.info(methodName, null, "Time to remove share in db", System.currentTimeMillis() - now);
 		} catch (Exception e) {
             logger.warn(methodName, null, "Cannot save state; shares_left", shares_left);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/NodePool.java Mon Nov  9 11:34:50 2015
@@ -31,7 +31,7 @@ import java.util.Map;
 import org.apache.uima.ducc.common.Node;
 import org.apache.uima.ducc.common.NodeIdentity;
 import org.apache.uima.ducc.common.persistence.rm.IRmPersistence;
-import org.apache.uima.ducc.common.persistence.rm.IRmPersistence.RmProperty;
+import org.apache.uima.ducc.common.persistence.rm.IRmPersistence.RmNodes;
 import org.apache.uima.ducc.common.persistence.rm.RmPersistenceFactory;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
@@ -69,7 +69,7 @@ class NodePool
     HashMap<Node, Machine>                   preemptables    = new HashMap<Node, Machine>();                   // candidates for preemption for reservations
     int total_shares = 0;
 
-    Map<ResourceClass, ResourceClass>       allClasses       = new HashMap<ResourceClass, ResourceClass>();    // all the classes directly serviced by me
+    Map<ResourceClass, ResourceClass>        allClasses      = new HashMap<ResourceClass, ResourceClass>();    // all the classes directly serviced by me
     //
     // There are "theoretical" shares based on actual capacities of
     // the machines.  They are used for the "how much" part of the
@@ -101,6 +101,7 @@ class NodePool
     GlobalOrder maxorder = null;
 
     IRmPersistence persistence = null;
+    boolean canReserve = false;       // if we contain a class with policy Reserve, then stuff in this pool is reservable
 
 //     NodePool(NodePool parent, String id, EvictionPolicy ep, int order)
 //     {
@@ -138,6 +139,7 @@ class NodePool
     void addResourceClass(ResourceClass cl)
     {  // UIMA-4065
         allClasses.put(cl, cl);
+        if ( cl.getPolicy() == Policy.RESERVE) canReserve = true;
     }
 
     NodePool getParent()
@@ -994,87 +996,47 @@ class NodePool
     }
 
 
-    void signalDb(Machine m, RmProperty key, Object value)
+    void signalDb(Machine m, RmNodes key, Object value)
     {
     	String methodName = "signalDb";
         try {
-			persistence.setProperty(m.getNode().getNodeIdentity().getName(), key, value);
+			persistence.setNodeProperty(m.getNode().getNodeIdentity().getName(), key, value);
 		} catch (Exception e) {
 			logger.warn(methodName, null, "Cannot update DB property", key, "for machine", m);
 		}
     }
 
-    Map<RmProperty, Object> initDbProperties(Machine m)
+    Map<RmNodes, Object> initDbProperties(Machine m)
     {
         Node n = m.getNode();
         NodeIdentity nid = n.getNodeIdentity();
         
-        Map<RmProperty, Object> props = new HashMap<RmProperty, Object>();
-        props.put(RmProperty.Name, nid.getName());
-        props.put(RmProperty.Ip, nid.getIp());
-        props.put(RmProperty.Nodepool, id);
-        props.put(RmProperty.Quantum, share_quantum / ( 1024*1024));
+        Map<RmNodes, Object> props = new HashMap<RmNodes, Object>();
+        props.put(RmNodes.Name, nid.getName());
+        props.put(RmNodes.Ip, nid.getIp());
+        props.put(RmNodes.Nodepool, id);
+        props.put(RmNodes.Quantum, share_quantum / ( 1024*1024));
         
-        props.put(RmProperty.Memory       , m.getMemory() / (1024*1024));
-        props.put(RmProperty.ShareOrder  , m.getShareOrder());
-        props.put(RmProperty.Blacklisted  , m.isBlacklisted());
+        props.put(RmNodes.Memory       , m.getMemory() / (1024*1024));
+        props.put(RmNodes.ShareOrder  , m.getShareOrder());
+        props.put(RmNodes.Blacklisted  , m.isBlacklisted());
 
         // init these here, but must be maintained by machine
-        props.put(RmProperty.Heartbeats   , 0);
-        props.put(RmProperty.SharesLeft   , m.countFreeShares());     // qshares remaining
-        props.put(RmProperty.Assignments  , m.countProcesses());      // processes
+        props.put(RmNodes.Heartbeats   , 0);
+        props.put(RmNodes.SharesLeft   , m.countFreeShares());     // qshares remaining
+        props.put(RmNodes.Assignments  , m.countProcesses());      // processes
         
+        props.put(RmNodes.Reservable   , canReserve);
+
+        StringBuffer buf = new StringBuffer();
+        for ( ResourceClass cl : allClasses.keySet() ) {
+            buf.append(cl.getName());
+            buf.append(" ");
+        }
+        props.put(RmNodes.Classes, buf.toString());
         return props;
     }
 
-    // /**
-    //  * On init, seed the database with everything we know about nodes.
-    //  * TODO: not used - do we care?
-    //  */
-    // void initializeDbx()
-    // {
-    // 	String methodName = "initializeDb";
-    //     for ( NodePool np : children.values() ) {
-    //         np.initializeDbx();
-    //     }
-
-    //     for (Node n : allMachines.keySet()) {
-    //     	Machine m = allMachines.get(n);
-    //         Properties props = initDbProperties(m);
-    //         props.put(RmPropName.Responsive.pname(), true);
-    //         props.put(RmPropName.Online.pname(), true);
-    //         try {
-	// 			persistence.createMachine(m.getId(), props);
-	// 		} catch (Exception e) {
-    //             logger.warn(methodName, null, "Cannot store (online) node", m.getId(), "in db:", e);
-	// 		}
-    //     }
-    //     for (Node n : unresponsiveMachines.keySet()) {
-    //     	Machine m = unresponsiveMachines.get(n);
-    //         Properties props = initDbProperties(m);
-    //         props.setProperty(RmPropName.Responsive.pname(), "false");
-    //         props.setProperty(RmPropName.Online.pname(), "true");                              
-    //         try {
-	// 			persistence.createMachine(m.getId(), props);
-	// 		} catch (Exception e) {
-    //             logger.warn(methodName, null, "Cannot store (unresponsive) node", m.getId(), "in db:", e);
-	// 		}
-    //     }
-    //     for (Node n : offlineMachines.keySet()) {
-    //     	Machine m = offlineMachines.get(n);
-    //         Properties props = initDbProperties(m);
-    //         props.setProperty(RmPropName.Responsive.pname(), "unknown");
-    //         props.setProperty(RmPropName.Online.pname(), "false");                              
-    //         try {
-	// 			persistence.createMachine(m.getId(), props);
-	// 		} catch (Exception e) {
-    //             logger.warn(methodName, null, "Cannot store (offline) node", m.getId(), "in db:", e);
-	// 		}
-    //     }
-
-    // }
-
-
     /**
      * Handle a new node update.
      */
@@ -1099,7 +1061,7 @@ class NodePool
 
         if ( offlineMachines.containsKey(node) ) {               // if it's offline it can't be restored like this.
             Machine m = offlineMachines.get(node);
-            signalDb(m, RmProperty.Responsive, true);
+            signalDb(m, RmNodes.Responsive, true);
             logger.trace(methodName, null, "Node ", m.getId(), " is offline, not activating.");
             return m;
         }
@@ -1111,7 +1073,6 @@ class NodePool
                 m.setShareOrder(order);                          //    hardware changes.
             }
 
-            // TODO soon ... can I just combine this with the code directly below:
             allMachines.put(node, m);
             machinesByName.put(m.getId(), m);
             machinesByIp.put(m.getIp(), m);
@@ -1124,7 +1085,7 @@ class NodePool
             mlist.put(m.key(), m);     
    
             total_shares += order;     //      UIMA-3939
-            signalDb(m, RmProperty.Responsive, true);
+            signalDb(m, RmNodes.Responsive, true);
             logger.info(methodName, null, "Nodepool:", id, "Host reactivated ", m.getId(), String.format("shares %2d total %4d:", order, total_shares), m.toString());
             return m;
         }
@@ -1152,9 +1113,9 @@ class NodePool
                     String.format("shares %2d total %4d:", order, total_shares), machine.toString()); 
         updated++;
 
-        Map<RmProperty, Object> props = initDbProperties(allMachines.get(key));
-        props.put(RmProperty.Responsive, true);
-        props.put(RmProperty.Online, true);
+        Map<RmNodes, Object> props = initDbProperties(allMachines.get(key));
+        props.put(RmNodes.Responsive, true);
+        props.put(RmNodes.Online, true);
         try {
 			persistence.createMachine(machine.getId(), props);
 		} catch (Exception e) {
@@ -1231,7 +1192,7 @@ class NodePool
     void nodeLeaves(Machine m)
     {
         disable(m, unresponsiveMachines);
-        signalDb(m, RmProperty.Responsive, false);
+        signalDb(m, RmNodes.Responsive, false);
     }
 
     // UIMA-4142
@@ -1272,7 +1233,7 @@ class NodePool
                     Node key = mm.key();
                     iter.remove();
                     offlineMachines.put(key, mm);
-                    signalDb(m, RmProperty.Online, false);
+                    signalDb(m, RmNodes.Online, false);
                     return "VaryOff: Nodepool " + id + " - Unresponsive machine, marked offline: " + node;
                 }
             }
@@ -1281,7 +1242,7 @@ class NodePool
         }
 
         disable(m, offlineMachines);
-        signalDb(m, RmProperty.Online, false);
+        signalDb(m, RmNodes.Online, false);
         return "VaryOff: " + node + " - OK.";
     }
 
@@ -1300,7 +1261,7 @@ class NodePool
             Machine mm = iter.next();
             if ( mm.getId().equals(node) ) {
                 iter.remove();
-                signalDb(mm, RmProperty.Online, true);
+                signalDb(mm, RmNodes.Online, true);
                 return "VaryOn: Nodepool " + id + " - Machine marked online: " + node;
             }
         }
@@ -1309,7 +1270,7 @@ class NodePool
         while ( iter.hasNext() ) {
             Machine mm = iter.next();
             if ( mm.getId().equals(node) ) {
-                signalDb(mm, RmProperty.Online, true);
+                signalDb(mm, RmNodes.Online, true);
                 return "VaryOn: Nodepool " + id + " - Machine is online but not responsive: " + node;
             }
         }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Share.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Share.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Share.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/Share.java Mon Nov  9 11:34:50 2015
@@ -18,6 +18,9 @@
 */
 package org.apache.uima.ducc.rm.scheduler;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.uima.ducc.common.Node;
 import org.apache.uima.ducc.common.NodeIdentity;
 import org.apache.uima.ducc.common.utils.id.DuccId;
@@ -61,6 +64,19 @@ public class Share
      @SuppressWarnings("unused")
  	private String pid = "<none>";
 
+    Map<String, Object> getShareProperties()
+    {
+        Map<String, Object> ret = new HashMap<String, Object>();
+        ret.put("numeric_id", id.getFriendly());
+        ret.put("uuid", id.getUnique());
+        ret.put("share_order", share_order);
+        ret.put("init_time", init_time.getElapsedMillis());
+        ret.put("evicted", evicted);
+        ret.put("purged", purged);
+        ret.put("fixed", fixed);
+        ret.put("investment", investment);
+        return ret;
+    }
 
     /**
      * This constructor is used during recovery ONLY.

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/history/IHistoryPersistenceManager.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/history/IHistoryPersistenceManager.java?rev=1713395&r1=1713394&r2=1713395&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/history/IHistoryPersistenceManager.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/history/IHistoryPersistenceManager.java Mon Nov  9 11:34:50 2015
@@ -108,6 +108,7 @@ public interface IHistoryPersistenceMana
         public boolean isPrimaryKey() { return false; }
         public boolean isPrivate()  { return false; }
         public boolean isMeta()  { return false; }
+        public boolean isIndex()  { return false; }
         public String columnName() { return pname(); }
 
      };
@@ -140,7 +141,9 @@ public interface IHistoryPersistenceMana
         public boolean isPrimaryKey() { return false; }
         public boolean isPrivate()  { return false; }
         public boolean isMeta()  { return false; }
+        public boolean isIndex()  { return false; }
         public String columnName() {return pname(); }
+        public Type listType() { return Type.String; }
 
      };