You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org> on 2018/05/14 17:06:15 UTC

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Steven Jacobs has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2641

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 328 insertions(+), 138 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/1

diff --git a/asterix-bad/pom.xml b/asterix-bad/pom.xml
index 6f5cd32..51aba74 100644
--- a/asterix-bad/pom.xml
+++ b/asterix-bad/pom.xml
@@ -271,6 +271,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-control-common</artifactId>
+      <version>${hyracks.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
       <artifactId>algebricks-runtime</artifactId>
     </dependency>
     <dependency>
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java b/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
index d422663..0467f6e 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
@@ -47,7 +47,7 @@
     String FIELD_NAME_ARITY = "Arity";
     String FIELD_NAME_DEPENDENCIES = "Dependencies";
     String FIELD_NAME_PARAMS = "Params";
-    String FIELD_NAME_RETURN_TYPE = "ReturnType";
+    String FIELD_NAME_TYPE = "Type";
     String FIELD_NAME_DEFINITION = "Definition";
     String FIELD_NAME_LANGUAGE = "Language";
     String FIELD_NAME_BODY = "Body";
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java b/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
index e326ce6..8090fb8 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
@@ -21,6 +21,7 @@
 import java.io.StringReader;
 import java.time.Instant;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executors;
@@ -51,6 +52,7 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
+import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
@@ -66,6 +68,19 @@
     private static final int POOL_SIZE = 1;
 
     private static final long millisecondTimeout = BADConstants.EXECUTOR_TIMEOUT * 1000;
+
+    public static void setupExecutorJob(EntityId entityId, JobSpecification channeljobSpec,
+            IHyracksClientConnection hcc, DeployedJobSpecEventListener listener, ITxnIdFactory txnIdFactory,
+            String duration) throws Exception {
+        if (channeljobSpec != null) {
+            channeljobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
+            DeployedJobSpecId destributedId = hcc.deployJobSpec(channeljobSpec);
+            ScheduledExecutorService ses = startRepetitiveDeployedJobSpec(destributedId, hcc, findPeriod(duration),
+                    new HashMap<>(), entityId, txnIdFactory, listener);
+            listener.storeDistributedInfo(destributedId, ses);
+        }
+
+    }
 
     //Starts running a deployed job specification periodically with an interval of "period" seconds
     public static ScheduledExecutorService startRepetitiveDeployedJobSpec(DeployedJobSpecId distributedId,
@@ -93,7 +108,8 @@
             Map<byte[], byte[]> jobParameters, long period, EntityId entityId, ITxnIdFactory txnIdFactory,
             DeployedJobSpecEventListener listener) throws Exception {
         long executionMilliseconds =
-                runDeployedJobSpec(distributedId, hcc, jobParameters, entityId, txnIdFactory, null, listener, null);
+                runDeployedJobSpec(distributedId, hcc, null, jobParameters, entityId, txnIdFactory, null, listener,
+                        null);
         if (executionMilliseconds > period) {
             LOGGER.log(Level.SEVERE,
                     "Periodic job for " + entityId.getExtensionName() + " " + entityId.getDataverse() + "."
@@ -106,7 +122,7 @@
     }
 
     public static long runDeployedJobSpec(DeployedJobSpecId distributedId, IHyracksClientConnection hcc,
-            Map<byte[], byte[]> jobParameters, EntityId entityId, ITxnIdFactory txnIdFactory,
+            IHyracksDataset hdc, Map<byte[], byte[]> jobParameters, EntityId entityId, ITxnIdFactory txnIdFactory,
             ICcApplicationContext appCtx, DeployedJobSpecEventListener listener, QueryTranslator statementExecutor)
             throws Exception {
         listener.waitWhileAtState(ActivityState.SUSPENDED);
@@ -122,7 +138,7 @@
         long executionMilliseconds = Instant.now().toEpochMilli() - startTime;
 
         if (listener.getType() == DeployedJobSpecEventListener.PrecompiledType.QUERY) {
-            ResultReader resultReader = new ResultReader(listener.getResultDataset(), jobId, listener.getResultId());
+            ResultReader resultReader = new ResultReader(hdc, jobId, new ResultSetId(0));
 
             ResultUtil.printResults(appCtx, resultReader, statementExecutor.getSessionOutput(),
                     new IStatementExecutor.Stats(), null);
@@ -217,11 +233,10 @@
             }
         } else {
             //Procedures
-            metadataProvider.setResultSetId(listener.getResultId());
-            final IStatementExecutor.ResultDelivery resultDelivery =
-                    requestParameters.getResultProperties().getDelivery();
-            final IHyracksDataset hdc = requestParameters.getHyracksDataset();
-            final IStatementExecutor.Stats stats = requestParameters.getStats();
+            metadataProvider.setResultSetId(new ResultSetId(0));
+            IStatementExecutor.ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
+            IHyracksDataset hdc = requestParameters.getHyracksDataset();
+            IStatementExecutor.Stats stats = requestParameters.getStats();
             boolean resultsAsync = resultDelivery == IStatementExecutor.ResultDelivery.ASYNC
                     || resultDelivery == IStatementExecutor.ResultDelivery.DEFERRED;
             metadataProvider.setResultAsyncMode(resultsAsync);
@@ -239,13 +254,11 @@
     public static JobSpecification compileQueryJob(IStatementExecutor statementExecutor,
             MetadataProvider metadataProvider, IHyracksClientConnection hcc, Query q) throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
-        boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        JobSpecification jobSpec = null;
+        JobSpecification jobSpec;
         try {
             jobSpec = statementExecutor.rewriteCompileQuery(hcc, metadataProvider, q, null);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-            bActiveTxn = false;
         } catch (Exception e) {
             ((QueryTranslator) statementExecutor).abort(e, e, mdTxnCtx);
             throw e;
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
index 4ab7530..f6f7d25 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
@@ -185,9 +185,6 @@
     public void handleCreateIndexStatement(MetadataProvider metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
 
-        //TODO: Check whether a delete or insert procedure using the index. If so, we will need to
-        // disallow the procedure until after the newly distributed version is ready
-
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         //Allow channels to use the new index
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
index 22767f2..ef906a9 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
@@ -24,7 +24,6 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -46,7 +45,6 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.CallExpr;
@@ -75,7 +73,6 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.dataflow.common.data.parsers.IValueParser;
 
@@ -176,42 +173,44 @@
                 new Identifier(BADConstants.BAD_DATAVERSE_NAME), subscriptionsTypeName, null, null, null,
                 new HashMap<String, String>(), DatasetType.INTERNAL, idd, null, true);
 
-        //Setup the results dataset
-        partitionFields = new ArrayList<>();
-        fieldNames = new ArrayList<>();
-        fieldNames.add(BADConstants.ResultId);
-        partitionFields.add(fieldNames);
-        idd = new InternalDetailsDecl(partitionFields, keyIndicators, true, null);
-        DatasetDecl createResultsDataset = new DatasetDecl(dataverseName, new Identifier(resultsTableName),
-                new Identifier(BADConstants.BAD_DATAVERSE_NAME), resultsTypeName, null, null, null,
-                new HashMap<String, String>(), DatasetType.INTERNAL, idd, null, true);
-
-        //Create an index on timestamp for results
-        CreateIndexStatement createTimeIndex = new CreateIndexStatement();
-        createTimeIndex.setDatasetName(new Identifier(resultsTableName));
-        createTimeIndex.setDataverseName(dataverseName);
-        createTimeIndex.setIndexName(new Identifier(resultsTableName + "TimeIndex"));
-        createTimeIndex.setIfNotExists(false);
-        createTimeIndex.setIndexType(IndexType.BTREE);
-        createTimeIndex.setEnforced(false);
-        createTimeIndex.setGramLength(0);
-        List<String> fNames = new ArrayList<>();
-        fNames.add(BADConstants.ChannelExecutionTime);
-        Pair<List<String>, IndexedTypeExpression> fields = new Pair<>(fNames, null);
-        createTimeIndex.addFieldExprPair(fields);
-        createTimeIndex.addFieldIndexIndicator(0);
-
-
-        //Run both statements to create datasets
         ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createSubscriptionsDataset,
                 hcc, null);
-        metadataProvider.getLocks().reset();
-        ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createResultsDataset, hcc,
-                null);
-        metadataProvider.getLocks().reset();
 
-        //Create a time index for the results
-        ((QueryTranslator) statementExecutor).handleCreateIndexStatement(metadataProvider, createTimeIndex, hcc, null);
+        if (!push) {
+            //Setup the results dataset
+            partitionFields = new ArrayList<>();
+            fieldNames = new ArrayList<>();
+            fieldNames.add(BADConstants.ResultId);
+            partitionFields.add(fieldNames);
+            idd = new InternalDetailsDecl(partitionFields, keyIndicators, true, null);
+            DatasetDecl createResultsDataset = new DatasetDecl(dataverseName, new Identifier(resultsTableName),
+                    new Identifier(BADConstants.BAD_DATAVERSE_NAME), resultsTypeName, null, null, null, new HashMap<>(),
+                    DatasetType.INTERNAL, idd, null, true);
+
+            //Create an index on timestamp for results
+            CreateIndexStatement createTimeIndex = new CreateIndexStatement();
+            createTimeIndex.setDatasetName(new Identifier(resultsTableName));
+            createTimeIndex.setDataverseName(dataverseName);
+            createTimeIndex.setIndexName(new Identifier(resultsTableName + "TimeIndex"));
+            createTimeIndex.setIfNotExists(false);
+            createTimeIndex.setIndexType(IndexType.BTREE);
+            createTimeIndex.setEnforced(false);
+            createTimeIndex.setGramLength(0);
+            List<String> fNames = new ArrayList<>();
+            fNames.add(BADConstants.ChannelExecutionTime);
+            Pair<List<String>, IndexedTypeExpression> fields = new Pair<>(fNames, null);
+            createTimeIndex.addFieldExprPair(fields);
+            createTimeIndex.addFieldIndexIndicator(0);
+            metadataProvider.getLocks().reset();
+            ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createResultsDataset,
+                    hcc, null);
+            metadataProvider.getLocks().reset();
+
+            //Create a time index for the results
+            ((QueryTranslator) statementExecutor).handleCreateIndexStatement(metadataProvider, createTimeIndex, hcc,
+                    null);
+
+        }
 
     }
 
@@ -257,18 +256,6 @@
                 hcc, hdc, ResultDelivery.ASYNC, null, stats, true, null);
     }
 
-    private void setupExecutorJob(EntityId entityId, JobSpecification channeljobSpec, IHyracksClientConnection hcc,
-            DeployedJobSpecEventListener listener, ITxnIdFactory txnIdFactory) throws Exception {
-        if (channeljobSpec != null) {
-            channeljobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
-            DeployedJobSpecId destributedId = hcc.deployJobSpec(channeljobSpec);
-            ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(destributedId, hcc,
-                    BADJobService.findPeriod(duration), new HashMap<>(), entityId, txnIdFactory, listener);
-            listener.storeDistributedInfo(destributedId, ses, null, null);
-        }
-
-    }
-
     @Override
     public void handle(IHyracksClientConnection hcc, IStatementExecutor statementExecutor,
             IRequestParameters requestContext, MetadataProvider metadataProvider, int resultSetId)
@@ -283,7 +270,7 @@
         dataverseName = new Identifier(((QueryTranslator) statementExecutor).getActiveDataverse(dataverseName));
         dataverse = dataverseName.getValue();
         subscriptionsTableName = channelName + BADConstants.subscriptionEnding;
-        resultsTableName = channelName + BADConstants.resultsEnding;
+        resultsTableName = !push ? channelName + BADConstants.resultsEnding : "";
 
         EntityId entityId = new EntityId(BADConstants.CHANNEL_EXTENSION_NAME, dataverse, channelName.getValue());
         ICcApplicationContext appCtx = metadataProvider.getApplicationContext();
@@ -291,7 +278,7 @@
                 (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
         DeployedJobSpecEventListener listener = (DeployedJobSpecEventListener) activeEventHandler.getListener(entityId);
         boolean alreadyActive = false;
-        Channel channel = null;
+        Channel channel;
 
         MetadataTransactionContext mdTxnCtx = null;
         try {
@@ -313,7 +300,7 @@
             if (MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, subscriptionsTableName) != null) {
                 throw new AsterixException("The channel name:" + channelName + " is not available.");
             }
-            if (MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, resultsTableName) != null) {
+            if (!push && MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, resultsTableName) != null) {
                 throw new AsterixException("The channel name:" + channelName + " is not available.");
             }
             MetadataProvider tempMdProvider = new MetadataProvider(metadataProvider.getApplicationContext(),
@@ -330,12 +317,12 @@
             // Now we subscribe
             if (listener == null) {
                 listener = new DeployedJobSpecEventListener(appCtx, entityId,
-                        push ? PrecompiledType.PUSH_CHANNEL : PrecompiledType.CHANNEL, null,
-                        "BadListener");
+                        push ? PrecompiledType.PUSH_CHANNEL : PrecompiledType.CHANNEL);
                 activeEventHandler.registerListener(listener);
             }
 
-            setupExecutorJob(entityId, channeljobSpec, hcc, listener, metadataProvider.getTxnIdFactory());
+            BADJobService.setupExecutorJob(entityId, channeljobSpec, hcc, listener, metadataProvider.getTxnIdFactory(),
+                    duration);
             channel = new Channel(dataverse, channelName.getValue(), subscriptionsTableName, resultsTableName, function,
                     duration, null, body);
 
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
index 03db7bc..13a993d 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
@@ -72,7 +72,6 @@
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
@@ -176,7 +175,7 @@
     }
 
     private Pair<JobSpecification, PrecompiledType> createProcedureJob(IStatementExecutor statementExecutor,
-            MetadataProvider metadataProvider, IHyracksClientConnection hcc, IHyracksDataset hdc, Stats stats)
+            MetadataProvider metadataProvider, IHyracksClientConnection hcc, Stats stats)
                     throws Exception {
         if (getProcedureBodyStatement().getKind() == Statement.Kind.INSERT) {
             if (!varList.isEmpty()) {
@@ -188,7 +187,7 @@
                     insertStatement.getDatasetName().getValue()));
             return new Pair<>(
                     ((QueryTranslator) statementExecutor).handleInsertUpsertStatement(metadataProvider,
-                            getProcedureBodyStatement(), hcc, hdc, ResultDelivery.ASYNC, null, stats, true, null),
+                            getProcedureBodyStatement(), hcc, null, ResultDelivery.ASYNC, null, stats, true, null),
                     PrecompiledType.INSERT);
         } else if (getProcedureBodyStatement().getKind() == Statement.Kind.QUERY) {
             SqlppRewriterFactory fact = new SqlppRewriterFactory();
@@ -218,11 +217,11 @@
     }
 
     private void setupDeployedJobSpec(EntityId entityId, JobSpecification jobSpec, IHyracksClientConnection hcc,
-            DeployedJobSpecEventListener listener, ResultSetId resultSetId, IHyracksDataset hdc, Stats stats)
+            DeployedJobSpecEventListener listener, ResultSetId resultSetId, Stats stats)
             throws Exception {
         jobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
         DeployedJobSpecId deployedJobSpecId = hcc.deployJobSpec(jobSpec);
-        listener.storeDistributedInfo(deployedJobSpecId, null, hdc, resultSetId);
+        listener.storeDistributedInfo(deployedJobSpecId, null);
     }
 
     @Override
@@ -255,29 +254,25 @@
             if (alreadyActive) {
                 throw new AsterixException("Procedure " + signature.getName() + " is already running");
             }
-            metadataProvider.setResultSetId(new ResultSetId(resultSetId++));
-            final ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
-            final IHyracksDataset hdc = requestParameters.getHyracksDataset();
+            metadataProvider.setResultSetId(new ResultSetId(0));
             final Stats stats = requestParameters.getStats();
-            boolean resultsAsync = resultDelivery == ResultDelivery.ASYNC || resultDelivery == ResultDelivery.DEFERRED;
-            metadataProvider.setResultAsyncMode(resultsAsync);
+            metadataProvider.setResultAsyncMode(false);
             metadataProvider.setMaxResultReads(1);
             //Create Procedure Internal Job
             Pair<JobSpecification, PrecompiledType> procedureJobSpec =
-                    createProcedureJob(statementExecutor, metadataProvider, hcc, hdc, stats);
+                    createProcedureJob(statementExecutor, metadataProvider, hcc, stats);
 
             // Now we subscribe
             if (listener == null) {
-                listener = new DeployedJobSpecEventListener(appCtx, entityId, procedureJobSpec.second, null,
-                        "BadListener");
+                listener = new DeployedJobSpecEventListener(appCtx, entityId, procedureJobSpec.second);
                 activeEventHandler.registerListener(listener);
             }
             setupDeployedJobSpec(entityId, procedureJobSpec.first, hcc, listener, metadataProvider.getResultSetId(),
-                    hdc,
                     stats);
 
             procedure = new Procedure(dataverse, signature.getName(), signature.getArity(), getParamList(),
-                    Function.RETURNTYPE_VOID, getProcedureBody(), Function.LANGUAGE_AQL, duration, dependencies);
+                    procedureJobSpec.second.toString(), getProcedureBody(), Function.LANGUAGE_AQL, duration,
+                    dependencies);
 
             MetadataManager.INSTANCE.addEntity(mdTxnCtx, procedure);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
index 025b9e6..60625a2 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
@@ -118,7 +118,8 @@
             Map<byte[], byte[]> contextRuntimeVarMap = createParameterMap(procedure);
             DeployedJobSpecId deployedJobSpecId = listener.getDeployedJobSpecId();
             if (procedure.getDuration().equals("")) {
-                BADJobService.runDeployedJobSpec(deployedJobSpecId, hcc, contextRuntimeVarMap, entityId,
+                BADJobService.runDeployedJobSpec(deployedJobSpecId, hcc, requestParameters.getHyracksDataset(),
+                        contextRuntimeVarMap, entityId,
                         metadataProvider.getTxnIdFactory(), appCtx, listener, (QueryTranslator) statementExecutor);
 
 
@@ -126,8 +127,7 @@
                 ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(deployedJobSpecId, hcc,
                         BADJobService.findPeriod(procedure.getDuration()), contextRuntimeVarMap, entityId,
                         metadataProvider.getTxnIdFactory(), listener);
-                listener.storeDistributedInfo(deployedJobSpecId, ses, listener.getResultDataset(),
-                        listener.getResultId());
+                listener.storeDistributedInfo(deployedJobSpecId, ses);
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             txnActive = false;
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
index 1e5e627..a764a5a 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
@@ -28,19 +28,19 @@
 public class BADMetadataRecordTypes {
 
     // -------------------------------------- Subscriptions --------------------------------------//
-    private static final String[] subTypeFieldNames = { BADConstants.DataverseName, BADConstants.BrokerName,
-            BADConstants.SubscriptionId };
+    private static final String[] subTypeFieldNames =
+            { BADConstants.DataverseName, BADConstants.BrokerName, BADConstants.SubscriptionId };
     private static final IAType[] subTypeFieldTypes = { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.AUUID };
-    public static final ARecordType channelSubscriptionsType = new ARecordType(BADConstants.ChannelSubscriptionsType,
-            subTypeFieldNames, subTypeFieldTypes, true);
+    public static final ARecordType channelSubscriptionsType =
+            new ARecordType(BADConstants.ChannelSubscriptionsType, subTypeFieldNames, subTypeFieldTypes, true);
 
     // ---------------------------------------- Results --------------------------------------------//
     private static final String[] resultTypeFieldNames = { BADConstants.ResultId, BADConstants.ChannelExecutionTime,
             BADConstants.SubscriptionId, BADConstants.DeliveryTime };
-    private static final IAType[] resultTypeFieldTypes = { BuiltinType.AUUID, BuiltinType.ADATETIME, BuiltinType.AUUID,
-            BuiltinType.ADATETIME };
-    public static final ARecordType channelResultsType = new ARecordType(BADConstants.ChannelResultsType,
-            resultTypeFieldNames, resultTypeFieldTypes, true);
+    private static final IAType[] resultTypeFieldTypes =
+            { BuiltinType.AUUID, BuiltinType.ADATETIME, BuiltinType.AUUID, BuiltinType.ADATETIME };
+    public static final ARecordType channelResultsType =
+            new ARecordType(BADConstants.ChannelResultsType, resultTypeFieldNames, resultTypeFieldTypes, true);
 
     //------------------------------------------ Channel ----------------------------------------//     
     public static final int CHANNEL_ARECORD_DATAVERSE_NAME_FIELD_INDEX = 0;
@@ -86,7 +86,7 @@
     public static final int PROCEDURE_ARECORD_PROCEDURE_NAME_FIELD_INDEX = 1;
     public static final int PROCEDURE_ARECORD_PROCEDURE_ARITY_FIELD_INDEX = 2;
     public static final int PROCEDURE_ARECORD_PROCEDURE_PARAM_LIST_FIELD_INDEX = 3;
-    public static final int PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX = 4;
+    public static final int PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX = 4;
     public static final int PROCEDURE_ARECORD_PROCEDURE_DEFINITION_FIELD_INDEX = 5;
     public static final int PROCEDURE_ARECORD_PROCEDURE_LANGUAGE_FIELD_INDEX = 6;
     public static final int PROCEDURE_ARECORD_PROCEDURE_DURATION_FIELD_INDEX = 7;
@@ -96,9 +96,8 @@
             BADConstants.RECORD_TYPENAME_PROCEDURE,
             // FieldNames
             new String[] { BADConstants.DataverseName, BADConstants.ProcedureName, BADConstants.FIELD_NAME_ARITY,
-                    BADConstants.FIELD_NAME_PARAMS, BADConstants.FIELD_NAME_RETURN_TYPE,
-                    BADConstants.FIELD_NAME_DEFINITION, BADConstants.FIELD_NAME_LANGUAGE, BADConstants.Duration,
-                    BADConstants.FIELD_NAME_DEPENDENCIES },
+                    BADConstants.FIELD_NAME_PARAMS, BADConstants.FIELD_NAME_TYPE, BADConstants.FIELD_NAME_DEFINITION,
+                    BADConstants.FIELD_NAME_LANGUAGE, BADConstants.Duration, BADConstants.FIELD_NAME_DEPENDENCIES },
             // FieldTypes
             new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING,
                     new AOrderedListType(BuiltinType.ASTRING, null), BuiltinType.ASTRING, BuiltinType.ASTRING,
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
index 78f7c95..fd918ba 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
@@ -30,9 +30,6 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.metadata.IDataset;
-import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
-import org.apache.hyracks.api.dataset.IHyracksDataset;
-import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.log4j.Logger;
@@ -53,9 +50,6 @@
     private ScheduledExecutorService executorService = null;
     private final PrecompiledType type;
 
-    private IHyracksDataset hdc;
-    private ResultSetId resultSetId;
-
     // members
     protected volatile ActivityState state;
     protected final ICcApplicationContext appCtx;
@@ -63,29 +57,16 @@
     protected final ActiveEvent statsUpdatedEvent;
     protected long statsTimestamp;
     protected String stats;
-    protected final String runtimeName;
-    protected final AlgebricksAbsolutePartitionConstraint locations;
     private int runningInstance;
 
-    public DeployedJobSpecEventListener(ICcApplicationContext appCtx, EntityId entityId, PrecompiledType type,
-            AlgebricksAbsolutePartitionConstraint locations, String runtimeName) {
+    public DeployedJobSpecEventListener(ICcApplicationContext appCtx, EntityId entityId, PrecompiledType type) {
         this.appCtx = appCtx;
         this.entityId = entityId;
         setState(ActivityState.STOPPED);
         this.statsTimestamp = -1;
         this.statsUpdatedEvent = new ActiveEvent(null, Kind.STATS_UPDATED, entityId, null);
         this.stats = "{\"Stats\":\"N/A\"}";
-        this.runtimeName = runtimeName;
-        this.locations = locations;
         this.type = type;
-    }
-
-    public IHyracksDataset getResultDataset() {
-        return hdc;
-    }
-
-    public ResultSetId getResultId() {
-        return resultSetId;
     }
 
     public DeployedJobSpecId getDeployedJobSpecId() {
@@ -121,12 +102,9 @@
         return type;
     }
 
-    public void storeDistributedInfo(DeployedJobSpecId deployedJobSpecId, ScheduledExecutorService ses,
-            IHyracksDataset hdc, ResultSetId resultSetId) {
+    public void storeDistributedInfo(DeployedJobSpecId deployedJobSpecId, ScheduledExecutorService ses) {
         this.deployedJobSpecId = deployedJobSpecId;
         this.executorService = ses;
-        this.hdc = hdc;
-        this.resultSetId = resultSetId;
     }
 
     public ScheduledExecutorService getExecutorService() {
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
index 50d506b..dff4577 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
@@ -34,7 +34,7 @@
     private final int arity;
     private final List<String> params;
     private final String body;
-    private final String returnType;
+    private final String type;
     private final String language;
     private final String duration;
     /*
@@ -46,12 +46,12 @@
      */
     private final List<List<List<String>>> dependencies;
 
-    public Procedure(String dataverseName, String functionName, int arity, List<String> params, String returnType,
+    public Procedure(String dataverseName, String functionName, int arity, List<String> params, String type,
             String functionBody, String language, String duration, List<List<List<String>>> dependencies) {
         this.procedureId = new EntityId(BADConstants.PROCEDURE_KEYWORD, dataverseName, functionName);
         this.params = params;
         this.body = functionBody;
-        this.returnType = returnType == null ? RETURNTYPE_VOID : returnType;
+        this.type = type;
         this.language = language;
         this.arity = arity;
         this.duration = duration;
@@ -76,8 +76,8 @@
         return body;
     }
 
-    public String getReturnType() {
-        return returnType;
+    public String getType() {
+        return type;
     }
 
     public String getLanguage() {
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
index 0a6acb9..a0e6657 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
@@ -96,7 +96,7 @@
         }
 
         String returnType = ((AString) procedureRecord
-                .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX))
+                .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX))
                         .getStringValue();
 
         String definition = ((AString) procedureRecord
@@ -194,9 +194,9 @@
 
         // write field 4
         fieldValue.reset();
-        aString.setValue(procedure.getReturnType());
+        aString.setValue(procedure.getType());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
-        recordBuilder.addField(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX, fieldValue);
+        recordBuilder.addField(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX, fieldValue);
 
         // write field 5
         fieldValue.reset();
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
new file mode 100644
index 0000000..3e6c0f5
--- /dev/null
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
@@ -0,0 +1,163 @@
+/*
+ * 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.asterix.bad.recovery;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.asterix.active.EntityId;
+import org.apache.asterix.active.IActiveEntityEventsListener;
+import org.apache.asterix.app.active.ActiveNotificationHandler;
+import org.apache.asterix.app.result.ResultReader;
+import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
+import org.apache.asterix.app.translator.RequestParameters;
+import org.apache.asterix.bad.BADJobService;
+import org.apache.asterix.bad.lang.BADCompilationProvider;
+import org.apache.asterix.bad.lang.BADLangExtension;
+import org.apache.asterix.bad.lang.BADStatementExecutor;
+import org.apache.asterix.bad.metadata.Channel;
+import org.apache.asterix.bad.metadata.DeployedJobSpecEventListener;
+import org.apache.asterix.bad.metadata.DeployedJobSpecEventListener.PrecompiledType;
+import org.apache.asterix.bad.metadata.Procedure;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.hyracks.bootstrap.GlobalRecoveryManager;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.translator.IStatementExecutor;
+import org.apache.asterix.translator.ResultProperties;
+import org.apache.asterix.translator.SessionConfig;
+import org.apache.asterix.translator.SessionOutput;
+import org.apache.hyracks.algebricks.runtime.serializer.ResultSerializerFactoryProvider;
+import org.apache.hyracks.algebricks.runtime.writers.PrinterBasedWriterFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.DeployedJobSpecIdFactory;
+import org.apache.hyracks.client.dataset.HyracksDataset;
+import org.apache.hyracks.control.common.utils.HyracksThreadFactory;
+
+public class BADGlobalRecoveryManager extends GlobalRecoveryManager {
+
+    private static final Logger LOGGER = Logger.getLogger(BADGlobalRecoveryManager.class.getName());
+
+    @Override
+    protected void recover(ICcApplicationContext appCtx) throws HyracksDataException {
+        try {
+            LOGGER.info("Starting Global Recovery");
+            MetadataManager.INSTANCE.init();
+            MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+            mdTxnCtx = doRecovery(appCtx, mdTxnCtx);
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            deployJobs(appCtx);
+            recoveryCompleted = true;
+            recovering = false;
+            LOGGER.info("Global Recovery Completed. Refreshing cluster state...");
+            appCtx.getClusterStateManager().refreshState();
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    private void deployJobs(ICcApplicationContext appCtx) throws Exception {
+
+        MetadataProvider metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+        MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(mdTxnCtx);
+
+        List<Channel> channels = BADLangExtension.getAllChannels(mdTxnCtx);
+        List<Procedure> procedures = BADLangExtension.getAllProcedures(mdTxnCtx);
+
+        MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+        metadataProvider.getLocks().unlock();
+
+        SessionConfig sessionConfig =
+                new SessionConfig(SessionConfig.OutputFormat.ADM, true, true, true, SessionConfig.PlanFormat.STRING);
+
+        BADStatementExecutor badStatementExecutor = new BADStatementExecutor(appCtx, new ArrayList<>(),
+                new SessionOutput(sessionConfig, null), new BADCompilationProvider(), Executors.newSingleThreadExecutor(
+                        new HyracksThreadFactory(DefaultStatementExecutorFactory.class.getSimpleName())));
+
+        ActiveNotificationHandler activeEventHandler =
+                (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
+
+        //Remove any lingering listeners
+        for (IActiveEntityEventsListener listener : activeEventHandler.getEventListeners()) {
+            if (listener instanceof DeployedJobSpecEventListener) {
+                activeEventHandler.unregisterListener(listener);
+            }
+        }
+
+        DeployedJobSpecIdFactory deployedJobSpecIdFactory = new DeployedJobSpecIdFactory();
+
+        //Redeploy Jobs
+        for (Channel channel : channels) {
+            EntityId entityId = channel.getChannelId();
+            DeployedJobSpecId deployedJobSpecId = deployedJobSpecIdFactory.create();
+            metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+            DeployedJobSpecEventListener listener = new DeployedJobSpecEventListener(appCtx, entityId,
+                    channel.getResultsDatasetName().equals("") ? PrecompiledType.PUSH_CHANNEL
+                            : PrecompiledType.CHANNEL);
+            listener.storeDistributedInfo(deployedJobSpecId, null);
+            listener.suspend();
+            activeEventHandler.registerListener(listener);
+            BADJobService.redeployJobSpec(entityId, channel.getChannelBody(), metadataProvider, badStatementExecutor,
+                    hcc, new RequestParameters(null, null, null, null, null, null));
+
+            ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(deployedJobSpecId, hcc,
+                    BADJobService.findPeriod(channel.getDuration()), new HashMap<>(), entityId,
+                    metadataProvider.getTxnIdFactory(), listener);
+            listener.storeDistributedInfo(deployedJobSpecId, ses);
+
+            LOGGER.log(Level.SEVERE, entityId.getExtensionName() + " " + entityId.getDataverse() + "."
+                    + entityId.getEntityName() + " was stopped by cluster failure. It has restarted.");
+
+        }
+        for (Procedure procedure : procedures) {
+            EntityId entityId = procedure.getEntityId();
+            DeployedJobSpecId deployedJobSpecId = deployedJobSpecIdFactory.create();
+            metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+            metadataProvider.setWriterFactory(PrinterBasedWriterFactory.INSTANCE);
+            metadataProvider.setResultSerializerFactoryProvider(ResultSerializerFactoryProvider.INSTANCE);
+            DeployedJobSpecEventListener listener =
+                    new DeployedJobSpecEventListener(appCtx, entityId, PrecompiledType.valueOf(procedure.getType()));
+            listener.storeDistributedInfo(deployedJobSpecId, null);
+            listener.suspend();
+            activeEventHandler.registerListener(listener);
+            BADJobService.redeployJobSpec(entityId, procedure.getBody(), metadataProvider, badStatementExecutor, hcc,
+                    new RequestParameters(
+                            new HyracksDataset(hcc, appCtx.getCompilerProperties().getFrameSize(),
+                                    ResultReader.NUM_READERS),
+                            new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE),
+                            new IStatementExecutor.Stats(), null, null, null));
+            //Log that the procedure stopped by cluster restart. Procedure is available again now.
+            LOGGER.log(Level.SEVERE, entityId.getExtensionName() + " " + entityId.getDataverse() + "."
+                    + entityId.getEntityName()
+                    + " was lost with cluster failure and any repetitive instances have stopped. It is now available to run again.");
+            //TODO: allow repetitive procedures to restart execution automatically
+            //Issue: need to store in metadata the information for running instances
+        }
+        hcc.resetDeployedJobIdFactory(deployedJobSpecIdFactory.maxDeployedJobSpecId());
+    }
+}
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
new file mode 100644
index 0000000..b5f6465
--- /dev/null
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
@@ -0,0 +1,51 @@
+/*
+ * 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.asterix.bad.recovery;
+
+import java.util.List;
+
+import org.apache.asterix.app.cc.IGlobalRecoveryExtension;
+import org.apache.asterix.common.api.ExtensionId;
+import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+public class BADRecoveryExtension implements IGlobalRecoveryExtension {
+
+    public static final ExtensionId BAD_RECOVERY_EXTENSION_ID =
+            new ExtensionId(BADRecoveryExtension.class.getSimpleName(), 0);
+
+    private static class LazyHolder {
+        private static final IGlobalRecoveryManager INSTANCE = new BADGlobalRecoveryManager();
+
+    }
+
+    @Override
+    public ExtensionId getId() {
+        return BAD_RECOVERY_EXTENSION_ID;
+    }
+
+    @Override
+    public void configure(List<Pair<String, String>> args) {
+    }
+
+    @Override
+    public IGlobalRecoveryManager getGlobalRecoveryManager() {
+        return LazyHolder.INSTANCE;
+    }
+}
diff --git a/asterix-bad/src/main/resources/cc.conf b/asterix-bad/src/main/resources/cc.conf
index 1153dcc..371cbe8 100644
--- a/asterix-bad/src/main/resources/cc.conf
+++ b/asterix-bad/src/main/resources/cc.conf
@@ -59,3 +59,5 @@
 enabled = true
 [extension/org.apache.asterix.bad.metadata.BADMetadataExtension]
 enabled = true
+[extension/org.apache.asterix.bad.recovery.BADRecoveryExtension]
+enabled = true
\ No newline at end of file
diff --git a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
index 1cd49e3..8dbfc6d 100644
--- a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
+++ b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
@@ -68,7 +68,7 @@
     public static void init() {
         djsel = new DeployedJobSpecEventListener(null,
                 new EntityId(BADConstants.CHANNEL_EXTENSION_NAME, "test", "test"),
-                DeployedJobSpecEventListener.PrecompiledType.CHANNEL, null, "BadListener");
+                DeployedJobSpecEventListener.PrecompiledType.CHANNEL);
     }
 
     @Test
diff --git a/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm b/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
index c41aec1..79fa293 100644
--- a/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
+++ b/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
@@ -1,6 +1,6 @@
-{ "DataverseName": "two", "ProcedureName": "addMe", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "use two;\ninsert into channels.UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [  ] ] }
-{ "DataverseName": "two", "ProcedureName": "deleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\ndelete from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "localAddMe", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "use two;\ninsert into UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [  ] ] }
-{ "DataverseName": "two", "ProcedureName": "localDeleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\ndelete from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "localSelectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\nselect roomNumber from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "selectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\nselect roomNumber from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
\ No newline at end of file
+{ "DataverseName": "two", "ProcedureName": "addMe", "Arity": "0", "Params": [  ], "Type": "INSERT", "Definition": "use two;\ninsert into channels.UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [  ] ] }
+{ "DataverseName": "two", "ProcedureName": "deleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "DELETE", "Definition": "use two;\ndelete from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "localAddMe", "Arity": "0", "Params": [  ], "Type": "INSERT", "Definition": "use two;\ninsert into UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [  ] ] }
+{ "DataverseName": "two", "ProcedureName": "localDeleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "DELETE", "Definition": "use two;\ndelete from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "localSelectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "QUERY", "Definition": "use two;\nselect roomNumber from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "selectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "QUERY", "Definition": "use two;\nselect roomNumber from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
\ No newline at end of file

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 12:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/292/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 12
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 11:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/290/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Xikui Wang (Code Review)" <do...@asterixdb.incubator.apache.org>.
Xikui Wang has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 5:

(11 comments)

Testcases would be very much appreciated...

https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
File asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java:

Line 142:             ResultReader resultReader = new ResultReader(hdc, jobId, new ResultSetId(0));
is this always reading the 1st result set? (I know there are some issues in a deployed job with multiple results. is this the one?)


Line 249:         if (useNewId) {
I'm comfused... What's the difference between deploy and redeploy + newId


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
File asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java:

Line 273:         resultsTableName = !push ? channelName + BADConstants.resultsEnding : "";
push : "" : constant


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
File asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java:

PS5, Line 274: LANGUAGE_AQL
it's AQL?


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
File asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java:

Line 105:     public void storeDeployedJobSpecId(DeployedJobSpecId deployedJobSpecId) {
-> setDeployedJobSpecId ?


Line 109:     public void storeExecutorService(ScheduledExecutorService ses) {
same


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
File asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java:

Line 49:     public Procedure(String dataverseName, String functionName, int arity, List<String> params, String type,
Is it no longer the return type?


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
File asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java:

PS5, Line 92: tionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
            :         metadataProvider.setMetadataTxnContext(mdTxnCtx);
            : 
            :         List<Channel> channels = BADLangExtension.getAllChannels(mdTxnCtx);
            :         List<Procedure> procedures = BADLangExtension.getAllProcedures(mdTxnCtx);
            : 
            :         MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
why not do this in recover after doRecovery()?


Line 112:         for (IActiveEntityEventsListener listener : activeEventHandler.getEventListeners()) {
do you want to check & stop EventListeners' executorService before you remove them?


Line 125:             listener.suspend();
this is to make sure if there is any dangling deployed job running instance, they have to stop first?


PS5, Line 161:             //Issue: need to store in metadata the information for running instances
I don't understand this issue here... maybe we can talk about this offline...


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Steven Jacobs has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 5:

(3 comments)

https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
File asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java:

PS5, Line 92: tionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
            :         metadataProvider.setMetadataTxnContext(mdTxnCtx);
            : 
            :         List<Channel> channels = BADLangExtension.getAllChannels(mdTxnCtx);
            :         List<Procedure> procedures = BADLangExtension.getAllProcedures(mdTxnCtx);
            : 
            :         MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
> sorry that I didn't explain my comment very well. What I meant is that it s
Done


Line 125:             listener.suspend();
> the followup question is the system now is in suspend state right? Would it
the redeployJobSpec call (line 127) calls listener.resume() at the end.


PS5, Line 161:             //Issue: need to store in metadata the information for running instances
> In other word, we are not storing the period of the repetitive procedures? 
We do store the period, but just having the period doesn't give us any guarantees about whether there were actually instances of the procedure running or not. In other words, you can create a repetitive procedure but not execute it.

There is a deeper question about maintaining multiple instances of repetitive procedures as well, which is why this is listed as TODO


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 5:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/282/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 1:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/277/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#3).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 341 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/3
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 3
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 13:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/293/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 13
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#13).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup
Added recovery test

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
A asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
50 files changed, 727 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/13
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 13
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 8:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/287/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 8
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#7).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 352 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/7
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 7
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#6).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 348 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/6
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 6
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Till Westmann <ti...@apache.org>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Steven Jacobs has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 11:

(1 comment)

https://asterix-gerrit.ics.uci.edu/#/c/2641/11/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
File asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java:

Line 86:         if (testNumber == 1) {
> The cluster gets stopped after the 0th test (line 95) and started again bef
In case this isn't very clear from looking, the three tests are as follows:
0) Test 0 creates the channels and procedures
The cluster is restarted
1) Test 1 checks whether the channels started again successfully 
2) Test 2 checks whether the procedures are still usable


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 6:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/285/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 6
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Till Westmann <ti...@apache.org>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 14:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/294/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 14
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 7:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/286/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 7
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#12).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.2.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.5.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.6.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.2.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.4.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.5.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.2.update.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.2.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.5.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.5.adm
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
46 files changed, 620 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/12
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 12
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 3:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/279/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 3
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Steven Jacobs has submitted this change and it was merged.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup
Added recovery test

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
A asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
50 files changed, 731 insertions(+), 197 deletions(-)

Approvals:
  Jenkins: Verified
  Xikui Wang: Looks good to me, approved



diff --git a/asterix-bad/pom.xml b/asterix-bad/pom.xml
index 6f5cd32..b7d775a 100644
--- a/asterix-bad/pom.xml
+++ b/asterix-bad/pom.xml
@@ -271,6 +271,16 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-client</artifactId>
+      <version>${hyracks.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-control-common</artifactId>
+      <version>${hyracks.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
       <artifactId>algebricks-runtime</artifactId>
     </dependency>
     <dependency>
@@ -284,6 +294,11 @@
       <version>${asterix.version}</version>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.6</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.asterix</groupId>
       <artifactId>asterix-fuzzyjoin</artifactId>
       <version>${asterix.version}</version>
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java b/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
index d422663..0467f6e 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
@@ -47,7 +47,7 @@
     String FIELD_NAME_ARITY = "Arity";
     String FIELD_NAME_DEPENDENCIES = "Dependencies";
     String FIELD_NAME_PARAMS = "Params";
-    String FIELD_NAME_RETURN_TYPE = "ReturnType";
+    String FIELD_NAME_TYPE = "Type";
     String FIELD_NAME_DEFINITION = "Definition";
     String FIELD_NAME_LANGUAGE = "Language";
     String FIELD_NAME_BODY = "Body";
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java b/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
index e587072..69145d9 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
@@ -21,6 +21,7 @@
 import java.io.StringReader;
 import java.time.Instant;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executors;
@@ -51,6 +52,7 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
+import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
@@ -66,6 +68,20 @@
     private static final int POOL_SIZE = 1;
 
     private static final long millisecondTimeout = BADConstants.EXECUTOR_TIMEOUT * 1000;
+
+    public static void setupExecutorJob(EntityId entityId, JobSpecification channeljobSpec,
+            IHyracksClientConnection hcc, DeployedJobSpecEventListener listener, ITxnIdFactory txnIdFactory,
+            String duration) throws Exception {
+        if (channeljobSpec != null) {
+            channeljobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
+            DeployedJobSpecId deployedId = hcc.deployJobSpec(channeljobSpec);
+            ScheduledExecutorService ses = startRepetitiveDeployedJobSpec(deployedId, hcc, findPeriod(duration),
+                    new HashMap<>(), entityId, txnIdFactory, listener);
+            listener.setDeployedJobSpecId(deployedId);
+            listener.setExecutorService(ses);
+        }
+
+    }
 
     //Starts running a deployed job specification periodically with an interval of "period" seconds
     public static ScheduledExecutorService startRepetitiveDeployedJobSpec(DeployedJobSpecId distributedId,
@@ -93,7 +109,8 @@
             Map<byte[], byte[]> jobParameters, long period, EntityId entityId, ITxnIdFactory txnIdFactory,
             DeployedJobSpecEventListener listener) throws Exception {
         long executionMilliseconds =
-                runDeployedJobSpec(distributedId, hcc, jobParameters, entityId, txnIdFactory, null, listener, null);
+                runDeployedJobSpec(distributedId, hcc, null, jobParameters, entityId, txnIdFactory, null, listener,
+                        null);
         if (executionMilliseconds > period) {
             LOGGER.log(Level.SEVERE,
                     "Periodic job for " + entityId.getExtensionName() + " " + entityId.getDataverse() + "."
@@ -106,7 +123,7 @@
     }
 
     public static long runDeployedJobSpec(DeployedJobSpecId distributedId, IHyracksClientConnection hcc,
-            Map<byte[], byte[]> jobParameters, EntityId entityId, ITxnIdFactory txnIdFactory,
+            IHyracksDataset hdc, Map<byte[], byte[]> jobParameters, EntityId entityId, ITxnIdFactory txnIdFactory,
             ICcApplicationContext appCtx, DeployedJobSpecEventListener listener, QueryTranslator statementExecutor)
             throws Exception {
         listener.waitWhileAtState(ActivityState.SUSPENDED);
@@ -122,7 +139,7 @@
         long executionMilliseconds = Instant.now().toEpochMilli() - startTime;
 
         if (listener.getType() == DeployedJobSpecEventListener.PrecompiledType.QUERY) {
-            ResultReader resultReader = new ResultReader(listener.getResultDataset(), jobId, listener.getResultId());
+            ResultReader resultReader = new ResultReader(hdc, jobId, new ResultSetId(0));
 
             ResultUtil.printResults(appCtx, resultReader, statementExecutor.getSessionOutput(),
                     new IStatementExecutor.Stats(), null);
@@ -189,7 +206,7 @@
 
     public static void redeployJobSpec(EntityId entityId, String queryBodyString, MetadataProvider metadataProvider,
             BADStatementExecutor badStatementExecutor, IHyracksClientConnection hcc,
-            IRequestParameters requestParameters) throws Exception {
+            IRequestParameters requestParameters, boolean useNewId) throws Exception {
 
         ICcApplicationContext appCtx = metadataProvider.getApplicationContext();
         ActiveNotificationHandler activeEventHandler =
@@ -217,11 +234,10 @@
             }
         } else {
             //Procedures
-            metadataProvider.setResultSetId(listener.getResultId());
-            final IStatementExecutor.ResultDelivery resultDelivery =
-                    requestParameters.getResultProperties().getDelivery();
-            final IHyracksDataset hdc = requestParameters.getHyracksDataset();
-            final IStatementExecutor.Stats stats = requestParameters.getStats();
+            metadataProvider.setResultSetId(new ResultSetId(0));
+            IStatementExecutor.ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
+            IHyracksDataset hdc = requestParameters.getHyracksDataset();
+            IStatementExecutor.Stats stats = requestParameters.getStats();
             boolean resultsAsync = resultDelivery == IStatementExecutor.ResultDelivery.ASYNC
                     || resultDelivery == IStatementExecutor.ResultDelivery.DEFERRED;
             metadataProvider.setResultAsyncMode(resultsAsync);
@@ -230,7 +246,12 @@
             jobSpec = compileProcedureJob(badStatementExecutor, metadataProvider, hcc, hdc, stats, fStatements.get(1));
 
         }
-        hcc.redeployJobSpec(listener.getDeployedJobSpecId(), jobSpec);
+        if (useNewId) {
+            DeployedJobSpecId id = hcc.deployJobSpec(jobSpec);
+            listener.setDeployedJobSpecId(id);
+        } else {
+            hcc.redeployJobSpec(listener.getDeployedJobSpecId(), jobSpec);
+        }
 
         listener.resume();
 
@@ -239,13 +260,11 @@
     public static JobSpecification compileQueryJob(IStatementExecutor statementExecutor,
             MetadataProvider metadataProvider, IHyracksClientConnection hcc, Query q) throws Exception {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
-        boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
-        JobSpecification jobSpec = null;
+        JobSpecification jobSpec;
         try {
             jobSpec = statementExecutor.rewriteCompileQuery(hcc, metadataProvider, q, null);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-            bActiveTxn = false;
         } catch (Exception e) {
             ((QueryTranslator) statementExecutor).abort(e, e, mdTxnCtx);
             throw e;
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
index 4ab7530..2f23a9c 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
@@ -185,9 +185,6 @@
     public void handleCreateIndexStatement(MetadataProvider metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
 
-        //TODO: Check whether a delete or insert procedure using the index. If so, we will need to
-        // disallow the procedure until after the newly distributed version is ready
-
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         //Allow channels to use the new index
@@ -243,13 +240,13 @@
         for (Channel channel : usages.first) {
             metadataProvider = new MetadataProvider(appCtx, activeDataverse);
             BADJobService.redeployJobSpec(channel.getChannelId(), channel.getChannelBody(), metadataProvider, this, hcc,
-                    requestParameters);
+                    requestParameters, false);
             metadataProvider.getLocks().unlock();
         }
         for (Procedure procedure : usages.second) {
             metadataProvider = new MetadataProvider(appCtx, activeDataverse);
             BADJobService.redeployJobSpec(procedure.getEntityId(), procedure.getBody(), metadataProvider, this, hcc,
-                    requestParameters);
+                    requestParameters, false);
             metadataProvider.getLocks().unlock();
         }
 
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
index 22767f2..204e8aa 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
@@ -24,7 +24,6 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -46,7 +45,6 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.CallExpr;
@@ -75,7 +73,6 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.dataflow.common.data.parsers.IValueParser;
 
@@ -176,42 +173,44 @@
                 new Identifier(BADConstants.BAD_DATAVERSE_NAME), subscriptionsTypeName, null, null, null,
                 new HashMap<String, String>(), DatasetType.INTERNAL, idd, null, true);
 
-        //Setup the results dataset
-        partitionFields = new ArrayList<>();
-        fieldNames = new ArrayList<>();
-        fieldNames.add(BADConstants.ResultId);
-        partitionFields.add(fieldNames);
-        idd = new InternalDetailsDecl(partitionFields, keyIndicators, true, null);
-        DatasetDecl createResultsDataset = new DatasetDecl(dataverseName, new Identifier(resultsTableName),
-                new Identifier(BADConstants.BAD_DATAVERSE_NAME), resultsTypeName, null, null, null,
-                new HashMap<String, String>(), DatasetType.INTERNAL, idd, null, true);
-
-        //Create an index on timestamp for results
-        CreateIndexStatement createTimeIndex = new CreateIndexStatement();
-        createTimeIndex.setDatasetName(new Identifier(resultsTableName));
-        createTimeIndex.setDataverseName(dataverseName);
-        createTimeIndex.setIndexName(new Identifier(resultsTableName + "TimeIndex"));
-        createTimeIndex.setIfNotExists(false);
-        createTimeIndex.setIndexType(IndexType.BTREE);
-        createTimeIndex.setEnforced(false);
-        createTimeIndex.setGramLength(0);
-        List<String> fNames = new ArrayList<>();
-        fNames.add(BADConstants.ChannelExecutionTime);
-        Pair<List<String>, IndexedTypeExpression> fields = new Pair<>(fNames, null);
-        createTimeIndex.addFieldExprPair(fields);
-        createTimeIndex.addFieldIndexIndicator(0);
-
-
-        //Run both statements to create datasets
         ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createSubscriptionsDataset,
                 hcc, null);
-        metadataProvider.getLocks().reset();
-        ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createResultsDataset, hcc,
-                null);
-        metadataProvider.getLocks().reset();
 
-        //Create a time index for the results
-        ((QueryTranslator) statementExecutor).handleCreateIndexStatement(metadataProvider, createTimeIndex, hcc, null);
+        if (!push) {
+            //Setup the results dataset
+            partitionFields = new ArrayList<>();
+            fieldNames = new ArrayList<>();
+            fieldNames.add(BADConstants.ResultId);
+            partitionFields.add(fieldNames);
+            idd = new InternalDetailsDecl(partitionFields, keyIndicators, true, null);
+            DatasetDecl createResultsDataset = new DatasetDecl(dataverseName, new Identifier(resultsTableName),
+                    new Identifier(BADConstants.BAD_DATAVERSE_NAME), resultsTypeName, null, null, null, new HashMap<>(),
+                    DatasetType.INTERNAL, idd, null, true);
+
+            //Create an index on timestamp for results
+            CreateIndexStatement createTimeIndex = new CreateIndexStatement();
+            createTimeIndex.setDatasetName(new Identifier(resultsTableName));
+            createTimeIndex.setDataverseName(dataverseName);
+            createTimeIndex.setIndexName(new Identifier(resultsTableName + "TimeIndex"));
+            createTimeIndex.setIfNotExists(false);
+            createTimeIndex.setIndexType(IndexType.BTREE);
+            createTimeIndex.setEnforced(false);
+            createTimeIndex.setGramLength(0);
+            List<String> fNames = new ArrayList<>();
+            fNames.add(BADConstants.ChannelExecutionTime);
+            Pair<List<String>, IndexedTypeExpression> fields = new Pair<>(fNames, null);
+            createTimeIndex.addFieldExprPair(fields);
+            createTimeIndex.addFieldIndexIndicator(0);
+            metadataProvider.getLocks().reset();
+            ((QueryTranslator) statementExecutor).handleCreateDatasetStatement(metadataProvider, createResultsDataset,
+                    hcc, null);
+            metadataProvider.getLocks().reset();
+
+            //Create a time index for the results
+            ((QueryTranslator) statementExecutor).handleCreateIndexStatement(metadataProvider, createTimeIndex, hcc,
+                    null);
+
+        }
 
     }
 
@@ -257,18 +256,6 @@
                 hcc, hdc, ResultDelivery.ASYNC, null, stats, true, null);
     }
 
-    private void setupExecutorJob(EntityId entityId, JobSpecification channeljobSpec, IHyracksClientConnection hcc,
-            DeployedJobSpecEventListener listener, ITxnIdFactory txnIdFactory) throws Exception {
-        if (channeljobSpec != null) {
-            channeljobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
-            DeployedJobSpecId destributedId = hcc.deployJobSpec(channeljobSpec);
-            ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(destributedId, hcc,
-                    BADJobService.findPeriod(duration), new HashMap<>(), entityId, txnIdFactory, listener);
-            listener.storeDistributedInfo(destributedId, ses, null, null);
-        }
-
-    }
-
     @Override
     public void handle(IHyracksClientConnection hcc, IStatementExecutor statementExecutor,
             IRequestParameters requestContext, MetadataProvider metadataProvider, int resultSetId)
@@ -283,7 +270,7 @@
         dataverseName = new Identifier(((QueryTranslator) statementExecutor).getActiveDataverse(dataverseName));
         dataverse = dataverseName.getValue();
         subscriptionsTableName = channelName + BADConstants.subscriptionEnding;
-        resultsTableName = channelName + BADConstants.resultsEnding;
+        resultsTableName = push ? "" : channelName + BADConstants.resultsEnding;
 
         EntityId entityId = new EntityId(BADConstants.CHANNEL_EXTENSION_NAME, dataverse, channelName.getValue());
         ICcApplicationContext appCtx = metadataProvider.getApplicationContext();
@@ -291,7 +278,7 @@
                 (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
         DeployedJobSpecEventListener listener = (DeployedJobSpecEventListener) activeEventHandler.getListener(entityId);
         boolean alreadyActive = false;
-        Channel channel = null;
+        Channel channel;
 
         MetadataTransactionContext mdTxnCtx = null;
         try {
@@ -313,7 +300,7 @@
             if (MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, subscriptionsTableName) != null) {
                 throw new AsterixException("The channel name:" + channelName + " is not available.");
             }
-            if (MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, resultsTableName) != null) {
+            if (!push && MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, resultsTableName) != null) {
                 throw new AsterixException("The channel name:" + channelName + " is not available.");
             }
             MetadataProvider tempMdProvider = new MetadataProvider(metadataProvider.getApplicationContext(),
@@ -330,12 +317,12 @@
             // Now we subscribe
             if (listener == null) {
                 listener = new DeployedJobSpecEventListener(appCtx, entityId,
-                        push ? PrecompiledType.PUSH_CHANNEL : PrecompiledType.CHANNEL, null,
-                        "BadListener");
+                        push ? PrecompiledType.PUSH_CHANNEL : PrecompiledType.CHANNEL);
                 activeEventHandler.registerListener(listener);
             }
 
-            setupExecutorJob(entityId, channeljobSpec, hcc, listener, metadataProvider.getTxnIdFactory());
+            BADJobService.setupExecutorJob(entityId, channeljobSpec, hcc, listener, metadataProvider.getTxnIdFactory(),
+                    duration);
             channel = new Channel(dataverse, channelName.getValue(), subscriptionsTableName, resultsTableName, function,
                     duration, null, body);
 
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
index 03db7bc..be5bedb 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
@@ -72,7 +72,6 @@
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.api.dataset.IHyracksDataset;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
@@ -176,7 +175,7 @@
     }
 
     private Pair<JobSpecification, PrecompiledType> createProcedureJob(IStatementExecutor statementExecutor,
-            MetadataProvider metadataProvider, IHyracksClientConnection hcc, IHyracksDataset hdc, Stats stats)
+            MetadataProvider metadataProvider, IHyracksClientConnection hcc, Stats stats)
                     throws Exception {
         if (getProcedureBodyStatement().getKind() == Statement.Kind.INSERT) {
             if (!varList.isEmpty()) {
@@ -188,7 +187,7 @@
                     insertStatement.getDatasetName().getValue()));
             return new Pair<>(
                     ((QueryTranslator) statementExecutor).handleInsertUpsertStatement(metadataProvider,
-                            getProcedureBodyStatement(), hcc, hdc, ResultDelivery.ASYNC, null, stats, true, null),
+                            getProcedureBodyStatement(), hcc, null, ResultDelivery.ASYNC, null, stats, true, null),
                     PrecompiledType.INSERT);
         } else if (getProcedureBodyStatement().getKind() == Statement.Kind.QUERY) {
             SqlppRewriterFactory fact = new SqlppRewriterFactory();
@@ -218,11 +217,11 @@
     }
 
     private void setupDeployedJobSpec(EntityId entityId, JobSpecification jobSpec, IHyracksClientConnection hcc,
-            DeployedJobSpecEventListener listener, ResultSetId resultSetId, IHyracksDataset hdc, Stats stats)
+            DeployedJobSpecEventListener listener, ResultSetId resultSetId, Stats stats)
             throws Exception {
         jobSpec.setProperty(ActiveNotificationHandler.ACTIVE_ENTITY_PROPERTY_NAME, entityId);
         DeployedJobSpecId deployedJobSpecId = hcc.deployJobSpec(jobSpec);
-        listener.storeDistributedInfo(deployedJobSpecId, null, hdc, resultSetId);
+        listener.setDeployedJobSpecId(deployedJobSpecId);
     }
 
     @Override
@@ -255,29 +254,25 @@
             if (alreadyActive) {
                 throw new AsterixException("Procedure " + signature.getName() + " is already running");
             }
-            metadataProvider.setResultSetId(new ResultSetId(resultSetId++));
-            final ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
-            final IHyracksDataset hdc = requestParameters.getHyracksDataset();
+            metadataProvider.setResultSetId(new ResultSetId(0));
             final Stats stats = requestParameters.getStats();
-            boolean resultsAsync = resultDelivery == ResultDelivery.ASYNC || resultDelivery == ResultDelivery.DEFERRED;
-            metadataProvider.setResultAsyncMode(resultsAsync);
+            metadataProvider.setResultAsyncMode(false);
             metadataProvider.setMaxResultReads(1);
             //Create Procedure Internal Job
             Pair<JobSpecification, PrecompiledType> procedureJobSpec =
-                    createProcedureJob(statementExecutor, metadataProvider, hcc, hdc, stats);
+                    createProcedureJob(statementExecutor, metadataProvider, hcc, stats);
 
             // Now we subscribe
             if (listener == null) {
-                listener = new DeployedJobSpecEventListener(appCtx, entityId, procedureJobSpec.second, null,
-                        "BadListener");
+                listener = new DeployedJobSpecEventListener(appCtx, entityId, procedureJobSpec.second);
                 activeEventHandler.registerListener(listener);
             }
             setupDeployedJobSpec(entityId, procedureJobSpec.first, hcc, listener, metadataProvider.getResultSetId(),
-                    hdc,
                     stats);
 
             procedure = new Procedure(dataverse, signature.getName(), signature.getArity(), getParamList(),
-                    Function.RETURNTYPE_VOID, getProcedureBody(), Function.LANGUAGE_AQL, duration, dependencies);
+                    procedureJobSpec.second.toString(), getProcedureBody(), Function.LANGUAGE_SQLPP, duration,
+                    dependencies);
 
             MetadataManager.INSTANCE.addEntity(mdTxnCtx, procedure);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
index 025b9e6..b794538 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
@@ -118,7 +118,8 @@
             Map<byte[], byte[]> contextRuntimeVarMap = createParameterMap(procedure);
             DeployedJobSpecId deployedJobSpecId = listener.getDeployedJobSpecId();
             if (procedure.getDuration().equals("")) {
-                BADJobService.runDeployedJobSpec(deployedJobSpecId, hcc, contextRuntimeVarMap, entityId,
+                BADJobService.runDeployedJobSpec(deployedJobSpecId, hcc, requestParameters.getHyracksDataset(),
+                        contextRuntimeVarMap, entityId,
                         metadataProvider.getTxnIdFactory(), appCtx, listener, (QueryTranslator) statementExecutor);
 
 
@@ -126,8 +127,7 @@
                 ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(deployedJobSpecId, hcc,
                         BADJobService.findPeriod(procedure.getDuration()), contextRuntimeVarMap, entityId,
                         metadataProvider.getTxnIdFactory(), listener);
-                listener.storeDistributedInfo(deployedJobSpecId, ses, listener.getResultDataset(),
-                        listener.getResultId());
+                listener.setExecutorService(ses);
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
             txnActive = false;
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
index 1e5e627..a764a5a 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
@@ -28,19 +28,19 @@
 public class BADMetadataRecordTypes {
 
     // -------------------------------------- Subscriptions --------------------------------------//
-    private static final String[] subTypeFieldNames = { BADConstants.DataverseName, BADConstants.BrokerName,
-            BADConstants.SubscriptionId };
+    private static final String[] subTypeFieldNames =
+            { BADConstants.DataverseName, BADConstants.BrokerName, BADConstants.SubscriptionId };
     private static final IAType[] subTypeFieldTypes = { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.AUUID };
-    public static final ARecordType channelSubscriptionsType = new ARecordType(BADConstants.ChannelSubscriptionsType,
-            subTypeFieldNames, subTypeFieldTypes, true);
+    public static final ARecordType channelSubscriptionsType =
+            new ARecordType(BADConstants.ChannelSubscriptionsType, subTypeFieldNames, subTypeFieldTypes, true);
 
     // ---------------------------------------- Results --------------------------------------------//
     private static final String[] resultTypeFieldNames = { BADConstants.ResultId, BADConstants.ChannelExecutionTime,
             BADConstants.SubscriptionId, BADConstants.DeliveryTime };
-    private static final IAType[] resultTypeFieldTypes = { BuiltinType.AUUID, BuiltinType.ADATETIME, BuiltinType.AUUID,
-            BuiltinType.ADATETIME };
-    public static final ARecordType channelResultsType = new ARecordType(BADConstants.ChannelResultsType,
-            resultTypeFieldNames, resultTypeFieldTypes, true);
+    private static final IAType[] resultTypeFieldTypes =
+            { BuiltinType.AUUID, BuiltinType.ADATETIME, BuiltinType.AUUID, BuiltinType.ADATETIME };
+    public static final ARecordType channelResultsType =
+            new ARecordType(BADConstants.ChannelResultsType, resultTypeFieldNames, resultTypeFieldTypes, true);
 
     //------------------------------------------ Channel ----------------------------------------//     
     public static final int CHANNEL_ARECORD_DATAVERSE_NAME_FIELD_INDEX = 0;
@@ -86,7 +86,7 @@
     public static final int PROCEDURE_ARECORD_PROCEDURE_NAME_FIELD_INDEX = 1;
     public static final int PROCEDURE_ARECORD_PROCEDURE_ARITY_FIELD_INDEX = 2;
     public static final int PROCEDURE_ARECORD_PROCEDURE_PARAM_LIST_FIELD_INDEX = 3;
-    public static final int PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX = 4;
+    public static final int PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX = 4;
     public static final int PROCEDURE_ARECORD_PROCEDURE_DEFINITION_FIELD_INDEX = 5;
     public static final int PROCEDURE_ARECORD_PROCEDURE_LANGUAGE_FIELD_INDEX = 6;
     public static final int PROCEDURE_ARECORD_PROCEDURE_DURATION_FIELD_INDEX = 7;
@@ -96,9 +96,8 @@
             BADConstants.RECORD_TYPENAME_PROCEDURE,
             // FieldNames
             new String[] { BADConstants.DataverseName, BADConstants.ProcedureName, BADConstants.FIELD_NAME_ARITY,
-                    BADConstants.FIELD_NAME_PARAMS, BADConstants.FIELD_NAME_RETURN_TYPE,
-                    BADConstants.FIELD_NAME_DEFINITION, BADConstants.FIELD_NAME_LANGUAGE, BADConstants.Duration,
-                    BADConstants.FIELD_NAME_DEPENDENCIES },
+                    BADConstants.FIELD_NAME_PARAMS, BADConstants.FIELD_NAME_TYPE, BADConstants.FIELD_NAME_DEFINITION,
+                    BADConstants.FIELD_NAME_LANGUAGE, BADConstants.Duration, BADConstants.FIELD_NAME_DEPENDENCIES },
             // FieldTypes
             new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING,
                     new AOrderedListType(BuiltinType.ASTRING, null), BuiltinType.ASTRING, BuiltinType.ASTRING,
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
index 78f7c95..4598d71 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
@@ -30,9 +30,6 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.metadata.IDataset;
-import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
-import org.apache.hyracks.api.dataset.IHyracksDataset;
-import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.log4j.Logger;
@@ -53,9 +50,6 @@
     private ScheduledExecutorService executorService = null;
     private final PrecompiledType type;
 
-    private IHyracksDataset hdc;
-    private ResultSetId resultSetId;
-
     // members
     protected volatile ActivityState state;
     protected final ICcApplicationContext appCtx;
@@ -63,29 +57,16 @@
     protected final ActiveEvent statsUpdatedEvent;
     protected long statsTimestamp;
     protected String stats;
-    protected final String runtimeName;
-    protected final AlgebricksAbsolutePartitionConstraint locations;
     private int runningInstance;
 
-    public DeployedJobSpecEventListener(ICcApplicationContext appCtx, EntityId entityId, PrecompiledType type,
-            AlgebricksAbsolutePartitionConstraint locations, String runtimeName) {
+    public DeployedJobSpecEventListener(ICcApplicationContext appCtx, EntityId entityId, PrecompiledType type) {
         this.appCtx = appCtx;
         this.entityId = entityId;
         setState(ActivityState.STOPPED);
         this.statsTimestamp = -1;
         this.statsUpdatedEvent = new ActiveEvent(null, Kind.STATS_UPDATED, entityId, null);
         this.stats = "{\"Stats\":\"N/A\"}";
-        this.runtimeName = runtimeName;
-        this.locations = locations;
         this.type = type;
-    }
-
-    public IHyracksDataset getResultDataset() {
-        return hdc;
-    }
-
-    public ResultSetId getResultId() {
-        return resultSetId;
     }
 
     public DeployedJobSpecId getDeployedJobSpecId() {
@@ -121,14 +102,15 @@
         return type;
     }
 
-    public void storeDistributedInfo(DeployedJobSpecId deployedJobSpecId, ScheduledExecutorService ses,
-            IHyracksDataset hdc, ResultSetId resultSetId) {
+    public void setDeployedJobSpecId(DeployedJobSpecId deployedJobSpecId) {
         this.deployedJobSpecId = deployedJobSpecId;
-        this.executorService = ses;
-        this.hdc = hdc;
-        this.resultSetId = resultSetId;
     }
 
+    public void setExecutorService(ScheduledExecutorService ses) {
+        this.executorService = ses;
+    }
+
+
     public ScheduledExecutorService getExecutorService() {
         return executorService;
     }
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
index 50d506b..dff4577 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
@@ -34,7 +34,7 @@
     private final int arity;
     private final List<String> params;
     private final String body;
-    private final String returnType;
+    private final String type;
     private final String language;
     private final String duration;
     /*
@@ -46,12 +46,12 @@
      */
     private final List<List<List<String>>> dependencies;
 
-    public Procedure(String dataverseName, String functionName, int arity, List<String> params, String returnType,
+    public Procedure(String dataverseName, String functionName, int arity, List<String> params, String type,
             String functionBody, String language, String duration, List<List<List<String>>> dependencies) {
         this.procedureId = new EntityId(BADConstants.PROCEDURE_KEYWORD, dataverseName, functionName);
         this.params = params;
         this.body = functionBody;
-        this.returnType = returnType == null ? RETURNTYPE_VOID : returnType;
+        this.type = type;
         this.language = language;
         this.arity = arity;
         this.duration = duration;
@@ -76,8 +76,8 @@
         return body;
     }
 
-    public String getReturnType() {
-        return returnType;
+    public String getType() {
+        return type;
     }
 
     public String getLanguage() {
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
index 0a6acb9..a0e6657 100644
--- a/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
@@ -96,7 +96,7 @@
         }
 
         String returnType = ((AString) procedureRecord
-                .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX))
+                .getValueByPos(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX))
                         .getStringValue();
 
         String definition = ((AString) procedureRecord
@@ -194,9 +194,9 @@
 
         // write field 4
         fieldValue.reset();
-        aString.setValue(procedure.getReturnType());
+        aString.setValue(procedure.getType());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
-        recordBuilder.addField(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_RETURN_TYPE_FIELD_INDEX, fieldValue);
+        recordBuilder.addField(BADMetadataRecordTypes.PROCEDURE_ARECORD_PROCEDURE_TYPE_FIELD_INDEX, fieldValue);
 
         // write field 5
         fieldValue.reset();
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
new file mode 100644
index 0000000..d34d170
--- /dev/null
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
@@ -0,0 +1,163 @@
+/*
+ * 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.asterix.bad.recovery;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.asterix.active.EntityId;
+import org.apache.asterix.active.IActiveEntityEventsListener;
+import org.apache.asterix.app.active.ActiveNotificationHandler;
+import org.apache.asterix.app.result.ResultReader;
+import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
+import org.apache.asterix.app.translator.RequestParameters;
+import org.apache.asterix.bad.BADJobService;
+import org.apache.asterix.bad.lang.BADCompilationProvider;
+import org.apache.asterix.bad.lang.BADLangExtension;
+import org.apache.asterix.bad.lang.BADStatementExecutor;
+import org.apache.asterix.bad.metadata.Channel;
+import org.apache.asterix.bad.metadata.DeployedJobSpecEventListener;
+import org.apache.asterix.bad.metadata.DeployedJobSpecEventListener.PrecompiledType;
+import org.apache.asterix.bad.metadata.Procedure;
+import org.apache.asterix.common.context.IStorageComponentProvider;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.hyracks.bootstrap.GlobalRecoveryManager;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.translator.IStatementExecutor;
+import org.apache.asterix.translator.ResultProperties;
+import org.apache.asterix.translator.SessionConfig;
+import org.apache.asterix.translator.SessionOutput;
+import org.apache.hyracks.algebricks.runtime.serializer.ResultSerializerFactoryProvider;
+import org.apache.hyracks.algebricks.runtime.writers.PrinterBasedWriterFactory;
+import org.apache.hyracks.api.application.ICCServiceContext;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.client.dataset.HyracksDataset;
+import org.apache.hyracks.control.common.utils.HyracksThreadFactory;
+
+public class BADGlobalRecoveryManager extends GlobalRecoveryManager {
+
+    private static final Logger LOGGER = Logger.getLogger(BADGlobalRecoveryManager.class.getName());
+
+    public BADGlobalRecoveryManager(ICCServiceContext serviceCtx, IHyracksClientConnection hcc,
+            IStorageComponentProvider componentProvider) {
+        super(serviceCtx, hcc, componentProvider);
+    }
+
+    @Override
+    protected void recover(ICcApplicationContext appCtx) throws HyracksDataException {
+        try {
+            LOGGER.info("Starting Global Recovery");
+            MetadataManager.INSTANCE.init();
+            MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+            mdTxnCtx = doRecovery(appCtx, mdTxnCtx);
+            List<Channel> channels = BADLangExtension.getAllChannels(mdTxnCtx);
+            List<Procedure> procedures = BADLangExtension.getAllProcedures(mdTxnCtx);
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            deployJobs(appCtx, channels, procedures);
+            recoveryCompleted = true;
+            recovering = false;
+            LOGGER.info("Global Recovery Completed. Refreshing cluster state...");
+            appCtx.getClusterStateManager().refreshState();
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    private void deployJobs(ICcApplicationContext appCtx, List<Channel> channels, List<Procedure> procedures)
+            throws Exception {
+        SessionConfig sessionConfig =
+                new SessionConfig(SessionConfig.OutputFormat.ADM, true, true, true, SessionConfig.PlanFormat.STRING);
+
+        BADStatementExecutor badStatementExecutor = new BADStatementExecutor(appCtx, new ArrayList<>(),
+                new SessionOutput(sessionConfig, null), new BADCompilationProvider(), Executors.newSingleThreadExecutor(
+                        new HyracksThreadFactory(DefaultStatementExecutorFactory.class.getSimpleName())));
+
+        ActiveNotificationHandler activeEventHandler =
+                (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
+
+        //Remove any lingering listeners
+        for (IActiveEntityEventsListener listener : activeEventHandler.getEventListeners()) {
+            if (listener instanceof DeployedJobSpecEventListener) {
+                if (((DeployedJobSpecEventListener) listener).getExecutorService() != null) {
+                    ((DeployedJobSpecEventListener) listener).getExecutorService().shutdown();
+                }
+                activeEventHandler.unregisterListener(listener);
+            }
+        }
+
+        MetadataProvider metadataProvider;
+
+        //Redeploy Jobs
+        for (Channel channel : channels) {
+            EntityId entityId = channel.getChannelId();
+            metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+            DeployedJobSpecEventListener listener = new DeployedJobSpecEventListener(appCtx, entityId,
+                    channel.getResultsDatasetName().equals("") ? PrecompiledType.PUSH_CHANNEL
+                            : PrecompiledType.CHANNEL);
+            listener.suspend();
+            activeEventHandler.registerListener(listener);
+            BADJobService.redeployJobSpec(entityId, channel.getChannelBody(), metadataProvider, badStatementExecutor,
+                    hcc, new RequestParameters(null, null, null, null, null, null), true);
+
+            ScheduledExecutorService ses = BADJobService.startRepetitiveDeployedJobSpec(listener.getDeployedJobSpecId(),
+                    hcc,
+                    BADJobService.findPeriod(channel.getDuration()), new HashMap<>(), entityId,
+                    metadataProvider.getTxnIdFactory(), listener);
+            listener.setExecutorService(ses);
+            metadataProvider.getLocks().unlock();
+
+            LOGGER.log(Level.SEVERE, entityId.getExtensionName() + " " + entityId.getDataverse() + "."
+                    + entityId.getEntityName() + " was stopped by cluster failure. It has restarted.");
+
+        }
+        for (Procedure procedure : procedures) {
+            EntityId entityId = procedure.getEntityId();
+            metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
+            metadataProvider.setWriterFactory(PrinterBasedWriterFactory.INSTANCE);
+            metadataProvider.setResultSerializerFactoryProvider(ResultSerializerFactoryProvider.INSTANCE);
+            DeployedJobSpecEventListener listener =
+                    new DeployedJobSpecEventListener(appCtx, entityId, PrecompiledType.valueOf(procedure.getType()));
+            listener.suspend();
+            activeEventHandler.registerListener(listener);
+            BADJobService.redeployJobSpec(entityId, procedure.getBody(), metadataProvider, badStatementExecutor, hcc,
+                    new RequestParameters(
+                            new HyracksDataset(hcc, appCtx.getCompilerProperties().getFrameSize(),
+                                    ResultReader.NUM_READERS),
+                            new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE),
+                            new IStatementExecutor.Stats(), null, null, null),
+                    true);
+            metadataProvider.getLocks().unlock();
+            //Log that the procedure stopped by cluster restart. Procedure is available again now.
+            LOGGER.log(Level.SEVERE, entityId.getExtensionName() + " " + entityId.getDataverse() + "."
+                    + entityId.getEntityName()
+                    + " was lost with cluster failure and any repetitive instances have stopped. It is now available to run again.");
+            //TODO: allow repetitive procedures to restart execution automatically
+            //Issue: need to store in metadata the information for running instances
+        }
+    }
+}
diff --git a/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
new file mode 100644
index 0000000..609b6de
--- /dev/null
+++ b/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
@@ -0,0 +1,50 @@
+/*
+ * 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.asterix.bad.recovery;
+
+import java.util.List;
+
+import org.apache.asterix.app.cc.IGlobalRecoveryExtension;
+import org.apache.asterix.common.api.ExtensionId;
+import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
+import org.apache.asterix.common.context.IStorageComponentProvider;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.api.application.ICCServiceContext;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+
+public class BADRecoveryExtension implements IGlobalRecoveryExtension {
+
+    public static final ExtensionId BAD_RECOVERY_EXTENSION_ID =
+            new ExtensionId(BADRecoveryExtension.class.getSimpleName(), 0);
+
+    @Override
+    public ExtensionId getId() {
+        return BAD_RECOVERY_EXTENSION_ID;
+    }
+
+    @Override
+    public void configure(List<Pair<String, String>> args) {
+    }
+
+    @Override
+    public IGlobalRecoveryManager getGlobalRecoveryManager(ICCServiceContext serviceCtx, IHyracksClientConnection hcc,
+            IStorageComponentProvider componentProvider) {
+        return new BADGlobalRecoveryManager(serviceCtx, hcc, componentProvider);
+    }
+}
diff --git a/asterix-bad/src/main/resources/cc.conf b/asterix-bad/src/main/resources/cc.conf
index 1153dcc..371cbe8 100644
--- a/asterix-bad/src/main/resources/cc.conf
+++ b/asterix-bad/src/main/resources/cc.conf
@@ -59,3 +59,5 @@
 enabled = true
 [extension/org.apache.asterix.bad.metadata.BADMetadataExtension]
 enabled = true
+[extension/org.apache.asterix.bad.recovery.BADRecoveryExtension]
+enabled = true
\ No newline at end of file
diff --git a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
index 0a2beed..aa1f17b 100644
--- a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
+++ b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
@@ -19,7 +19,6 @@
 package org.apache.asterix.bad.test;
 
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
-import org.apache.asterix.common.config.GlobalConfig;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
@@ -36,6 +35,7 @@
         }
     }
 
+    @Override
     protected void run(boolean cleanupOnStart, boolean cleanupOnShutdown, String loadExternalLibs) throws Exception {
         Runtime.getRuntime().addShutdownHook(new Thread() {
             @Override
diff --git a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
index 1cd49e3..8dbfc6d 100644
--- a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
+++ b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
@@ -68,7 +68,7 @@
     public static void init() {
         djsel = new DeployedJobSpecEventListener(null,
                 new EntityId(BADConstants.CHANNEL_EXTENSION_NAME, "test", "test"),
-                DeployedJobSpecEventListener.PrecompiledType.CHANNEL, null, "BadListener");
+                DeployedJobSpecEventListener.PrecompiledType.CHANNEL);
     }
 
     @Test
diff --git a/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
new file mode 100644
index 0000000..b62e4b9
--- /dev/null
+++ b/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.asterix.bad.test;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class BADRecoveryTest {
+
+    private static final java.util.logging.Logger LOGGER =
+            java.util.logging.Logger.getLogger(BADRecoveryTest.class.getName());
+
+    private static final String PATH_ACTUAL = "target" + File.separator + "rttest" + File.separator;
+    private static final String PATH_BASE = "src/test/resources/recoveryts/";
+    private TestCaseContext tcCtx;
+    private static ProcessBuilder pb;
+    private static Map<String, String> env;
+    private final TestExecutor testExecutor = new TestExecutor();
+    private static int testNumber;
+    private static File asterixInstallerPath;
+    private static File installerTargetPath;
+    private static String ncServiceHomeDirName;
+    private static String ncServiceHomePath;
+    private static String scriptHomePath;
+    private static String reportPath;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        File outdir = new File(PATH_ACTUAL);
+        outdir.mkdirs();
+
+        asterixInstallerPath = new File(System.getProperty("user.dir"));
+        installerTargetPath =
+                new File(new File(asterixInstallerPath.getParentFile().getParentFile(), "asterix-server"), "target");
+        reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
+        ncServiceHomeDirName = installerTargetPath.list(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return new File(dir, name).isDirectory() && name.startsWith("asterix-server")
+                        && name.endsWith("binary-assembly");
+            }
+        })[0];
+        ncServiceHomePath = new File(installerTargetPath, ncServiceHomeDirName).getAbsolutePath();
+
+        pb = new ProcessBuilder();
+        env = pb.environment();
+        env.put("JAVA_HOME", System.getProperty("java.home"));
+        //Create the folder to run asterix with extensions
+        String asterixInstallerTarget = asterixInstallerPath + File.separator + "target";
+        Process p = Runtime.getRuntime().exec("cp -R " + ncServiceHomePath + " " + asterixInstallerTarget);
+        p.waitFor();
+
+        ncServiceHomePath = asterixInstallerTarget + File.separator + ncServiceHomeDirName;
+
+        String confDir = File.separator + "opt" + File.separator + "local" + File.separator + "conf" + File.separator;
+        p = Runtime.getRuntime().exec("rm " + ncServiceHomePath + confDir + "cc.conf");
+        p.waitFor();
+
+        String BADconf = asterixInstallerPath + File.separator + "src" + File.separator + "main" + File.separator
+                + "resources" + File.separator + "cc.conf";
+        p = Runtime.getRuntime().exec("cp " + BADconf + " " + ncServiceHomePath + confDir);
+        p.waitFor();
+
+        LOGGER.info("NCSERVICE_HOME=" + ncServiceHomePath);
+        env.put("NCSERVICE_HOME", ncServiceHomePath);
+        env.put("JAVA_HOME", System.getProperty("java.home"));
+        scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
+                + "resources" + File.separator + "recoveryts" + File.separator + "scripts";
+        env.put("SCRIPT_HOME", scriptHomePath);
+
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
+
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "configure_and_validate.sh");
+
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
+        File outdir = new File(PATH_ACTUAL);
+        FileUtils.deleteDirectory(outdir);
+        File dataCopyDir = new File(ncServiceHomePath);
+        FileUtils.deleteDirectory(dataCopyDir);
+
+    }
+
+    @Parameters(name = "RecoveryIT {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<Object[]>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+    }
+
+    public BADRecoveryTest(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+
+    @Test
+    public void test() throws Exception {
+        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
+    }
+
+}
diff --git a/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
new file mode 100644
index 0000000..bab0849
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+/*
+* Description  : Restart cluster and confirm that channels and procedures still work
+* Expected Res : Success
+* Date         : 2018
+* Author       : Steven Jacobs
+*/
+
+drop dataverse two if exists;
+drop dataverse channels if exists;
+create dataverse channels;
+use channels;
+
+create type userLocation as {
+  userId: int,
+  roomNumber: int
+};
+
+create dataset UserLocations(userLocation)
+primary key userId;
+
+create function RoomOccupants(room) {
+  (select location.userId
+  from UserLocations location
+  where location.roomNumber = room)
+};
+
+create broker brokerA at "http://www.notifyA.com";
+
+create repetitive channel roomRecords using RoomOccupants@1 period duration("PT5S");
+
+create procedure selectSome(r) {
+select roomNumber from channels.UserLocations
+where roomNumber = r
+order by userId
+};
+
+create procedure deleteSome(r) {
+delete from channels.UserLocations
+where roomNumber = r
+};
+
+create procedure addMe() {
+  insert into channels.UserLocations([
+    {"userId":2, "roomNumber":123}]
+  )
+};
+
+upsert into UserLocations([
+{"userId":1, "roomNumber":123},
+{"userId":3, "roomNumber":350}]
+);
+
+create repetitive channel roomRecords2 using RoomOccupants@1 period duration("PT5S");
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
similarity index 87%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
index aa0722a..65386e7 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that procedure still works after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+execute addMe();
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
similarity index 86%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
index aa0722a..f72d947 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that procedure still works after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+execute selectSome(123);
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
similarity index 86%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
index aa0722a..00a6277 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that procedure still works after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+execute deleteSome(123);
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
similarity index 86%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
index aa0722a..f72d947 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that procedure still works after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+execute selectSome(123);
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
similarity index 84%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
index aa0722a..dc023c4 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+drop channel roomRecords;
+drop channel roomRecords2;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
new file mode 100644
index 0000000..8fd9780
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# 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.
+stop_and_start.sh
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
similarity index 84%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
index aa0722a..4b866e6 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+array_count((select *
+from roomRecordsResults result));
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
similarity index 84%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
index aa0722a..9408860 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+array_count((select *
+from roomRecords2Results result));
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
similarity index 81%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
index aa0722a..9a3931b 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
@@ -16,12 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
-* Description  : Simple Query Procedure with parameters
-* Expected Res : Success
-* Date         : May 2017
-* Author       : Steven Jacobs
-*/
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+subscribe to roomRecords (123) on brokerA;
+subscribe to roomRecords2 (123) on brokerA;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
similarity index 86%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
index aa0722a..e3641a0 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
@@ -17,11 +17,9 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
-use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+8000
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
similarity index 83%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
index aa0722a..3fb2ebc 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+array_count((select *
+from roomRecordsResults result)) > 0;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
similarity index 83%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
index aa0722a..051738e 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that channel is still running after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
-
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+array_count((select *
+from roomRecords2Results result)) > 0;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
similarity index 86%
copy from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
copy to asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
index aa0722a..f72d947 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
@@ -17,11 +17,12 @@
  * under the License.
  */
 /*
-* Description  : Simple Query Procedure with parameters
+* Description  : Confirm that procedure still works after cluster restart
 * Expected Res : Success
-* Date         : May 2017
+* Date         : May 2018
 * Author       : Steven Jacobs
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+
+execute selectSome(123);
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
new file mode 100644
index 0000000..acbb918
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
@@ -0,0 +1,2 @@
+{ "roomNumber": 123 }
+{ "roomNumber": 123 }
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
new file mode 100644
index 0000000..c227083
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
new file mode 100644
index 0000000..c227083
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
new file mode 100644
index 0000000..f32a580
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
@@ -0,0 +1 @@
+true
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
new file mode 100644
index 0000000..f32a580
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
@@ -0,0 +1 @@
+true
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
new file mode 100644
index 0000000..30ffd5c
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
@@ -0,0 +1 @@
+{ "roomNumber": 123 }
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh b/asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
new file mode 100755
index 0000000..a1d7114
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# 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.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh b/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
new file mode 100755
index 0000000..ab09dd2
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# 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.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh b/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
new file mode 100755
index 0000000..99db8b2
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# 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.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh -f;
+rm -rf $NCSERVICE_HOME/opt/local/data;
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/recoveryts/testsuite.xml b/asterix-bad/src/test/resources/recoveryts/testsuite.xml
new file mode 100644
index 0000000..c549a3e
--- /dev/null
+++ b/asterix-bad/src/test/resources/recoveryts/testsuite.xml
@@ -0,0 +1,30 @@
+<!--
+ ! 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.
+ !-->
+<test-suite  xmlns="urn:xml.testframework.asterix.apache.org"
+             ResultOffsetPath="results"
+             QueryOffsetPath="queries"
+             QueryFileExtension=".sqlpp">
+  <test-group name="recovery">
+    <test-case FilePath="recovery">
+      <compilation-unit name="restart_cluster">
+        <output-dir compare="Text">restart_cluster</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.update.sqlpp b/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
similarity index 100%
rename from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.update.sqlpp
rename to asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.update.sqlpp b/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
similarity index 100%
rename from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.update.sqlpp
rename to asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.update.sqlpp b/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
similarity index 100%
rename from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.update.sqlpp
rename to asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
diff --git a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp b/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
similarity index 95%
rename from asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
rename to asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
index aa0722a..e5152e8 100644
--- a/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.update.sqlpp
+++ b/asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
@@ -24,4 +24,4 @@
 */
 
 use channels;
-execute selectSome(108,"jacob");
\ No newline at end of file
+execute selectSome(4815162342,"jacob");
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm b/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
index c41aec1..1f55577 100644
--- a/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
+++ b/asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
@@ -1,6 +1,6 @@
-{ "DataverseName": "two", "ProcedureName": "addMe", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "use two;\ninsert into channels.UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [  ] ] }
-{ "DataverseName": "two", "ProcedureName": "deleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\ndelete from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "localAddMe", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "use two;\ninsert into UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [  ] ] }
-{ "DataverseName": "two", "ProcedureName": "localDeleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\ndelete from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\");", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "localSelectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\nselect roomNumber from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
-{ "DataverseName": "two", "ProcedureName": "selectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "ReturnType": "VOID", "Definition": "use two;\nselect roomNumber from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\")\norder by id;", "Language": "AQL", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
\ No newline at end of file
+{ "DataverseName": "two", "ProcedureName": "addMe", "Arity": "0", "Params": [  ], "Type": "INSERT", "Definition": "use two;\ninsert into channels.UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [  ] ] }
+{ "DataverseName": "two", "ProcedureName": "deleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "DELETE", "Definition": "use two;\ndelete from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\");", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "localAddMe", "Arity": "0", "Params": [  ], "Type": "INSERT", "Definition": "use two;\ninsert into UserLocations([\n    {\"timeStamp\":current_datetime(), \"roomNumber\":222}]\n  );", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [  ] ] }
+{ "DataverseName": "two", "ProcedureName": "localDeleteSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "DELETE", "Definition": "use two;\ndelete from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\");", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "localSelectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "QUERY", "Definition": "use two;\nselect roomNumber from UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand really_contains(roomNumber,\"l\")\norder by id;", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "two", "UserLocations" ] ], [ [ "two", "get_job_param", "1" ], [ "two", "really_contains", "2" ], [ "two", "get_job_param", "1" ] ] ] }
+{ "DataverseName": "two", "ProcedureName": "selectSome", "Arity": "2", "Params": [ "r", "otherRoom" ], "Type": "QUERY", "Definition": "use two;\nselect roomNumber from channels.UserLocations\nwhere roomNumber = get_job_param(\"r\")\nor roomNumber = get_job_param(\"otherRoom\")\nand channels.really_contains(roomNumber,\"l\")\norder by id;", "Language": "SQLPP", "Duration": "", "Dependencies": [ [ [ "channels", "UserLocations" ] ], [ [ "channels", "really_contains", "2" ], [ "two", "get_job_param", "1" ], [ "two", "get_job_param", "1" ] ] ] }
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
index 6dd90d2..7b188e8 100644
--- a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
+++ b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
@@ -1 +1 @@
-222
\ No newline at end of file
+{ "roomNumber": 222 }
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
index b1d4fa9..7de1800 100644
--- a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
+++ b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
@@ -1,2 +1,2 @@
-222
-225
\ No newline at end of file
+{ "roomNumber": 222 }
+{ "roomNumber": 225 }
\ No newline at end of file
diff --git a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
index bee5525..298d0c5 100644
--- a/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
+++ b/asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
@@ -1,2 +1,2 @@
-{ "roomNumber": 108 }
+{ "roomNumber": 4815162342 }
 { "roomNumber": "jacob" }
\ No newline at end of file

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 15
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 12:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/291/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 12
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Xikui Wang (Code Review)" <do...@asterixdb.incubator.apache.org>.
Xikui Wang has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 15: Code-Review+2

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 15
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 10:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/289/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 10
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#14).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup
Added recovery test

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
A asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
50 files changed, 727 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/14
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 14
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#11).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.2.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.5.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.6.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.2.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.4.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.5.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.2.update.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.2.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.5.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.5.adm
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
46 files changed, 627 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/11
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Xikui Wang (Code Review)" <do...@asterixdb.incubator.apache.org>.
Xikui Wang has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 11:

(4 comments)

Several more follow-ups... We should be able to push it in in next round...

https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
File asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java:

PS5, Line 92: lusterStateManager().refreshState();
            :         } catch (Exception e) {
            :             throw HyracksDataException.create(e);
            :         }
            :     }
            : 
            :     private void deployJobs(ICcApplicationContext appCtx, Lis
> Done
sorry that I didn't explain my comment very well. What I meant is that it seems to me that the getChannels and getAllPredures can be done within the previous txn. Is the 2nd txn necessary?


Line 125:             metadataProvider = new MetadataProvider(appCtx, MetadataBuiltinEntities.DEFAULT_DATAVERSE);
> yes
the followup question is the system now is in suspend state right? Would it be a problem for the later execution? (It's never resumed. My observation from reading codes the job run will overwrite the state immediately...)


PS5, Line 161:             LOGGER.log(Level.SEVERE, entityId.getExtensionName() + " " + entityId.ge
> Sure. We can talk about it more in future, but the main issue is:
In other word, we are not storing the period of the repetitive procedures? I guess for the non-repetitive case, deploy the job spec should be good enough I guess...


https://asterix-gerrit.ics.uci.edu/#/c/2641/11/asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
File asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp:

Line 25: 25000
why sleep 25 seconds? (This will make the bad test longer for every patch right?...)


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#8).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 352 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/8
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 8
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#10).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.2.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.5.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.6.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.2.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.4.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.5.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.2.update.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.2.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.5.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.5.adm
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
45 files changed, 587 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/10
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 10
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#5).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 348 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/5
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#15).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup
Added recovery test

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.10.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.11.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.12.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.13.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.14.ddl.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.2.script.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.5.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.6.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.7.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.8.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/restart_cluster/restart_cluster.9.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.11.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.13.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.7.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.8.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/restart_cluster/restart_cluster.9.adm
A asterix-bad/src/test/resources/recoveryts/scripts/recovery/restart_cluster/stop_and_start.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/configure_and_validate.sh
A asterix-bad/src/test/resources/recoveryts/scripts/setup_teardown/stop_and_delete.sh
A asterix-bad/src/test/resources/recoveryts/testsuite.xml
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
50 files changed, 731 insertions(+), 197 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/15
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 15
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#9).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADAsterixHyracksIntegrationUtil.java
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
A asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.2.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.4.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.5.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.6.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.1.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.2.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.3.query.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.4.update.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/check_procedures/check_procedures.5.query.sqlpp
A asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.1.ddl.sqlpp
C asterix-bad/src/test/resources/recoveryts/queries/recovery/ddl/ddl.2.update.sqlpp
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.2.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.4.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_channels/check_channels.5.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.1.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.3.adm
A asterix-bad/src/test/resources/recoveryts/results/recovery/check_procedures/check_procedures.5.adm
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.3.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure/query_procedure.5.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.query.sqlpp
R asterix-bad/src/test/resources/runtimets/queries/procedure/query_procedure_with_parameters/query_procedure_with_parameters.3.query.sqlpp
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.3.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure/query_procedure.5.adm
M asterix-bad/src/test/resources/runtimets/results/procedure/query_procedure_with_parameters/query_procedure_with_parameters.2.adm
45 files changed, 594 insertions(+), 204 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/9
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 9
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Xikui Wang (Code Review)" <do...@asterixdb.incubator.apache.org>.
Xikui Wang has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 11:

(1 comment)

https://asterix-gerrit.ics.uci.edu/#/c/2641/11/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
File asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java:

Line 86:         if (testNumber == 1) {
Sorry for the 2nd comment. What does this mean?


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 15:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/295/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 15
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#2).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 333 insertions(+), 138 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/2
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 2
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Steven Jacobs has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 5:

(11 comments)

https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
File asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java:

Line 142:             ResultReader resultReader = new ResultReader(hdc, jobId, new ResultSetId(0));
> is this always reading the 1st result set? (I know there are some issues in
Procedures and Channels only allow one statement (so one result set) so this is a simplification for them. Maybe other deployed jobs will have potential issues,


Line 249:         if (useNewId) {
> I'm comfused... What's the difference between deploy and redeploy + newId
When the cluster is restarted, we just deploy the jobs as new jobs (the old deployed jobs would be lost anyway).

When an index is added, we use the redeploy to replace the existing job spec


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
File asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java:

Line 273:         resultsTableName = !push ? channelName + BADConstants.resultsEnding : "";
> push : "" : constant
Done


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
File asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java:

PS5, Line 274: LANGUAGE_AQL
> it's AQL?
Done


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
File asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java:

Line 105:     public void storeDeployedJobSpecId(DeployedJobSpecId deployedJobSpecId) {
> -> setDeployedJobSpecId ?
Done


Line 109:     public void storeExecutorService(ScheduledExecutorService ses) {
> same
Done


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
File asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java:

Line 49:     public Procedure(String dataverseName, String functionName, int arity, List<String> params, String type,
> Is it no longer the return type?
The return type was left over from functions, we don't use such a thing in procedures. I needed to add a Procedure type, so I figured I should remove the unused field while adding the new one.


https://asterix-gerrit.ics.uci.edu/#/c/2641/5/asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
File asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java:

PS5, Line 92: tionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
            :         metadataProvider.setMetadataTxnContext(mdTxnCtx);
            : 
            :         List<Channel> channels = BADLangExtension.getAllChannels(mdTxnCtx);
            :         List<Procedure> procedures = BADLangExtension.getAllProcedures(mdTxnCtx);
            : 
            :         MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
> why not do this in recover after doRecovery()?
Done


Line 112:         for (IActiveEntityEventsListener listener : activeEventHandler.getEventListeners()) {
> do you want to check & stop EventListeners' executorService before you remo
Done


Line 125:             listener.suspend();
> this is to make sure if there is any dangling deployed job running instance
yes


PS5, Line 161:             //Issue: need to store in metadata the information for running instances
> I don't understand this issue here... maybe we can talk about this offline.
Sure. We can talk about it more in future, but the main issue is:

1) A repetitive procedure can exist without running (no one has called "execute"
2) At cluster restart, the listener is gone, so the only information we have is the metadata
3) For every channel we automatically know that there should be one running instance, so we just start it again. We have no such guarantee for a procedure, and the metadata doesn't tell us anything about if/how many were running.


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 2:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/278/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 2
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 9:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/288/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 9
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Steven Jacobs has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 11:

(2 comments)

https://asterix-gerrit.ics.uci.edu/#/c/2641/11/asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java
File asterix-bad/src/test/java/org/apache/asterix/bad/test/BADRecoveryTest.java:

Line 86:         if (testNumber == 1) {
> Sorry for the 2nd comment. What does this mean?
The cluster gets stopped after the 0th test (line 95) and started again before the 1st test (line 88). Other than that we don't need to keep restarting the cluster.


https://asterix-gerrit.ics.uci.edu/#/c/2641/11/asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp
File asterix-bad/src/test/resources/recoveryts/queries/recovery/check_channels/check_channels.3.sleep.sqlpp:

Line 25: 25000
> why sleep 25 seconds? (This will make the bad test longer for every patch r
I want to make absolutely certain that the channel is still executing. I know the tests can run on slower machines. There are several issues that lead me to make it this long:

1) I don't have confidence in making the channel period less than 5 seconds (even on my local build there are rare instances taking longer than 1 second to execute the tiny channel job.
2) The cluster deinit() has no precise timing, e.g. we don't know how long the channel was running before the cluster stopped.
3) The cluster init() also has no precise timing, so there's no way to guarantee how long the channel has been running before this sleep happens.

Essentially I start the comparison much higher than expected (< 3 when we actually expect 0) to account for potential executions during the start and stop, so I have to add 15 seconds worth of time to make sure that we get to at least 3, and I also want to make sure that we increase, which is why I put 10 seconds more.

I think by giving this much wiggle room we make sure to prevent random failures of the test.


-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 11
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: Yes

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 4:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/280/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 4
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Steven Jacobs (Code Review)" <do...@asterixdb.incubator.apache.org>.
Hello Jenkins,

I'd like you to reexamine a change.  Please visit

    https://asterix-gerrit.ics.uci.edu/2641

to look at the new patch set (#4).

Change subject: Redeploy channels and procedures during recovery
......................................................................

Redeploy channels and procedures during recovery

Use the GlobalRecoveryManager extension to redeploy channels/procedures
Restart execution of channels during recovery
Some code cleanup

Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
---
M asterix-bad/pom.xml
M asterix-bad/src/main/java/org/apache/asterix/bad/BADConstants.java
M asterix-bad/src/main/java/org/apache/asterix/bad/BADJobService.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADStatementExecutor.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateChannelStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/ExecuteProcedureStatement.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/BADMetadataRecordTypes.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/DeployedJobSpecEventListener.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/Procedure.java
M asterix-bad/src/main/java/org/apache/asterix/bad/metadata/ProcedureTupleTranslator.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADGlobalRecoveryManager.java
A asterix-bad/src/main/java/org/apache/asterix/bad/recovery/BADRecoveryExtension.java
M asterix-bad/src/main/resources/cc.conf
M asterix-bad/src/test/java/org/apache/asterix/bad/test/BADListenerTest.java
M asterix-bad/src/test/resources/runtimets/results/procedure/create_procedure_check_metadata/create_procedure_check_metadata.1.adm
16 files changed, 348 insertions(+), 143 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb-bad refs/changes/41/2641/4
-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 4
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>

Change in asterixdb-bad[master]: Redeploy channels and procedures during recovery

Posted by "Jenkins (Code Review)" <do...@asterixdb.incubator.apache.org>.
Jenkins has posted comments on this change.

Change subject: Redeploy channels and procedures during recovery
......................................................................


Patch Set 5:

Build Started https://asterix-jenkins.ics.uci.edu/job/asterixbad-gerrit/281/

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2641
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6897ccf9cddb9ec8d10256e252ee893afe6db145
Gerrit-PatchSet: 5
Gerrit-Project: asterixdb-bad
Gerrit-Branch: master
Gerrit-Owner: Steven Jacobs <sj...@ucr.edu>
Gerrit-Reviewer: Jenkins <je...@fulliautomatix.ics.uci.edu>
Gerrit-Reviewer: Xikui Wang <xk...@gmail.com>
Gerrit-HasComments: No