Author: degenaro
Date: Tue Oct 18 14:56:01 2016
New Revision: 1765450

URL: http://svn.apache.org/viewvc?rev=1765450&view=rev
Log:
UIMA-5060 DUCC Orchestrator (OR) "warm" restart issues

- for restoration of next job/reservation sequence number, use the greater of 
seqno in state/orchestrator.properties and historical/ckpt from database 
comprising jobs+reservations
- log a WARNing in or.log if historical/ckpt data is used

Added:
    
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
   (with props)
Modified:
    
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IPropertiesFileManager.java
    
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/DuccIdFactory.java
    
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/IDuccIdFactory.java
    
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorCommonArea.java

Modified: 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IPropertiesFileManager.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IPropertiesFileManager.java?rev=1765450&r1=1765449&r2=1765450&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IPropertiesFileManager.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/persistence/IPropertiesFileManager.java
 Tue Oct 18 14:56:01 2016
@@ -20,4 +20,6 @@ package org.apache.uima.ducc.common.pers
 
 public interface IPropertiesFileManager {
        public int increment(String key);
+       public String get(String key, String defaultValue);
+       public void set(String key, String value);
 }

Modified: 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/DuccIdFactory.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/DuccIdFactory.java?rev=1765450&r1=1765449&r2=1765450&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/DuccIdFactory.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/DuccIdFactory.java
 Tue Oct 18 14:56:01 2016
@@ -62,4 +62,32 @@ public class DuccIdFactory implements ID
                        return new DuccId(seqno.get());
                }
        }
+       
+       /**
+        * set seqno to candidate if it is bigger than previous, return 
previous value
+        */
+       public long setIfMax(long candidate) {
+               long previous = seqno.get();
+               synchronized(this) {
+                       if(propertiesFileManager != null) {
+                               try {
+                                       String propertiesFileValue = 
propertiesFileManager.get(propertiesFileKey, ""+previous);
+                                       previous = 
Long.parseLong(propertiesFileValue);
+                               }
+                               catch(Exception e) {
+                                       // No worries
+                               }
+                               if(candidate > previous) {
+                                       
propertiesFileManager.set(propertiesFileKey, ""+candidate);
+                                       seqno.set(candidate);
+                               }
+                       }
+                       else {
+                               if(candidate > previous) {
+                                       seqno.set(candidate);
+                               }
+                       }
+               }
+               return previous;
+       }
 }

Modified: 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/IDuccIdFactory.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/IDuccIdFactory.java?rev=1765450&r1=1765449&r2=1765450&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/IDuccIdFactory.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/id/IDuccIdFactory.java
 Tue Oct 18 14:56:01 2016
@@ -21,5 +21,5 @@ package org.apache.uima.ducc.common.util
 public interface IDuccIdFactory {
        
        public DuccId next();
-       
+       public long setIfMax(long s);
 }

Modified: 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorCommonArea.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorCommonArea.java?rev=1765450&r1=1765449&r2=1765450&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorCommonArea.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorCommonArea.java
 Tue Oct 18 14:56:01 2016
@@ -46,6 +46,7 @@ public class OrchestratorCommonArea {
        private static OrchestratorCommonArea orchestratorCommonArea = null;
        
        private static final DuccLogger logger = 
DuccLoggerComponents.getOrLogger(OrchestratorCommonArea.class.getName());
+       private static final DuccId jobid = null;
        
        private static DuccPropertiesResolver dpr = 
DuccPropertiesResolver.getInstance();
        
@@ -118,7 +119,8 @@ public class OrchestratorCommonArea {
                        
ComponentHelper.oneInstance(IDuccEnv.DUCC_STATE_DIR,"orchestrator");
                }
                // </Jira 3414>
-               setPropertiesFileManager(new 
PropertiesFileManager(IDuccLoggerComponents.abbrv_orchestrator, 
IDuccEnv.DUCC_STATE_DIR, constOrchestratorProperties, false, true));
+               PropertiesFileManager pfm = new 
PropertiesFileManager(IDuccLoggerComponents.abbrv_orchestrator, 
IDuccEnv.DUCC_STATE_DIR, constOrchestratorProperties, false, true);
+               setPropertiesFileManager(pfm);
                initSeqNo();
                setDuccIdFactory(new 
DuccIdFactory(propertiesFileManager,constSeqNo));
                workMap = new DuccWorkMap();
@@ -134,6 +136,13 @@ public class OrchestratorCommonArea {
             System.exit(1);       // what should we do here? exit or acquire 
the NullHistoryManager?
         }
         logger.info(methodName, null, "Got history manager of class", 
historyPersistenceManager.getClass().getName());
+        //
+        OrchestratorRecovery orchestratorRecovery = new 
OrchestratorRecovery(historyPersistenceManager);
+        long historicSeqNo = orchestratorRecovery.recoverSeqNo();
+        long previousSeqNo = getDuccIdFactory().setIfMax(historicSeqNo);
+        if(previousSeqNo != historicSeqNo) {
+               logger.warn(methodName, jobid, "properties:"+previousSeqNo+" 
"+""+"historic:"+historicSeqNo);
+        }
        }
        
        public String getStateDirectory() {

Added: 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java?rev=1765450&view=auto
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
 (added)
+++ 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
 Tue Oct 18 14:56:01 2016
@@ -0,0 +1,191 @@
+/*
+ * 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.orchestrator;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
+import org.apache.uima.ducc.transport.event.common.IDuccWorkReservation;
+import 
org.apache.uima.ducc.transport.event.common.history.IHistoryPersistenceManager;
+
+/**
+ * Purpose: scan job+reservation history+checkpoint data for the largest 
sequence number
+ */
+public class OrchestratorRecovery {
+       
+       private static final DuccLogger logger = 
DuccLoggerComponents.getOrLogger(OrchestratorRecovery.class.getName());
+       private static final DuccId jobid = null;
+       
+       IHistoryPersistenceManager historyPersistenceManager = null;
+       
+       public OrchestratorRecovery(IHistoryPersistenceManager 
historyPersistenceManager) {
+               setHistoryPersistenceManager(historyPersistenceManager);
+       }
+       
+       private void setHistoryPersistenceManager(IHistoryPersistenceManager 
value) {
+               historyPersistenceManager = value;
+       }
+       
+       private Long findHistoryLastJob() {
+               String location = "findHistoryLastJob";
+               Long retVal = new Long(-1);
+               try {
+                       List<IDuccWorkJob> duccWorkJobs = 
historyPersistenceManager.restoreJobs(1);
+                       if(duccWorkJobs != null) {
+                               if(!duccWorkJobs.isEmpty()) {
+                                       for(IDuccWorkJob job : duccWorkJobs) {
+                                               DuccId duccId = job.getDuccId();
+                                               retVal = duccId.getFriendly();
+                                               logger.info(location, jobid, 
"hist job "+retVal);
+                                               break;
+                                       }
+                               }
+                               else {
+                                       logger.debug(location, jobid, "hist job 
empty");
+                               }
+                       }
+                       else {
+                               logger.debug(location, jobid, "hist job not 
found");
+                       }
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
+       private Long findHistoryLastReservation() {
+               String location = "findHistoryLastReservation";
+               Long retVal = new Long(-1);
+               try {
+                       List<IDuccWorkReservation> duccWorkReservations = 
historyPersistenceManager.restoreReservations(1);
+                       if(duccWorkReservations != null) {
+                               if(!duccWorkReservations.isEmpty()) {
+                                       for(IDuccWorkReservation reservation : 
duccWorkReservations) {
+                                               DuccId duccId = 
reservation.getDuccId();
+                                               retVal = duccId.getFriendly();
+                                               logger.info(location, jobid, 
"hist reservation "+retVal);
+                                               break;
+                                       }
+                               }
+                               else {
+                                       logger.debug(location, jobid, "hist 
reservation empty");
+                               }
+                       }
+                       else {
+                               logger.debug(location, jobid, "hist reservation 
not found");
+                       }
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
+       private Long findCheckpointLastJob() {
+               String location = "findCheckpointLastJob";
+               Long retVal = new Long(-1);
+               DuccWorkMap workMap = 
OrchestratorCommonArea.getInstance().getWorkMap();
+               try {
+                       if(workMap != null) {
+                               DuccId duccId = getMax(workMap.getJobKeySet());
+                               if(duccId != null) {
+                                       retVal = duccId.getFriendly();
+                                       logger.info(location, jobid, "ckpt job 
"+retVal);
+                               }
+                               else {
+                                       logger.debug(location, jobid, "ckpt job 
not found");
+                               }
+                       }
+                       else {
+                               logger.debug(location, jobid, "workmap not 
found");
+                       }
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
+       private Long findCheckpointLastReservation() {
+               String location = "findCheckpointLastReservation";
+               Long retVal = new Long(-1);
+               DuccWorkMap workMap = 
OrchestratorCommonArea.getInstance().getWorkMap();
+               try {
+                       if(workMap != null) {
+                               DuccId duccId = 
getMax(workMap.getReservationKeySet());
+                               if(duccId != null) {
+                                       retVal = duccId.getFriendly();
+                                       logger.info(location, jobid, "ckpt 
reservation "+retVal);
+                               }
+                               else {
+                                       logger.debug(location, jobid, "ckpt 
reservation not found");
+                               }
+                       }
+                       else {
+                               logger.debug(location, jobid, "workmap not 
found");
+                       }
+               }
+               catch(Exception e) {
+                       logger.error(location, jobid, e);
+               }
+               return retVal;
+       }
+       
+       private DuccId getMax(Set<DuccId> keys) {
+               DuccId retVal = null;
+               if(keys != null) {
+                       for(DuccId key : keys) {
+                               if(retVal == null) {
+                                       retVal = key;
+                               }
+                               else if(key.getFriendly() > 
retVal.getFriendly()) {
+                                       retVal = key;
+                               }
+                       }
+               }
+               return retVal;
+       }
+       
+       private Long maxOf(Long v0, Long v1, String text) {
+               String location = "maxOf";
+               Long retVal = v0;
+               if(v1 > v0) {
+                       retVal = v1+1;
+                       logger.info(location, jobid, text);
+               }
+               return retVal;
+       }
+       
+       public Long recoverSeqNo() {
+               String location = "recoverSeqNo";
+               Long seqNo = new Long(-1);
+               seqNo = maxOf(seqNo, findHistoryLastJob(), "history:job");
+               seqNo = maxOf(seqNo, findHistoryLastReservation(), 
"history:reservation");
+               seqNo = maxOf(seqNo, findCheckpointLastJob(), "checkpoint:job");
+               seqNo = maxOf(seqNo, findCheckpointLastReservation(), 
"checkpoint:reservation");
+               logger.info(location, jobid, seqNo);
+               return seqNo;
+       }
+}

Propchange: 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorRecovery.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to