Index: /trunk/ippTasks/destreak.pro
===================================================================
--- /trunk/ippTasks/destreak.pro	(revision 25464)
+++ /trunk/ippTasks/destreak.pro	(revision 25465)
@@ -13,4 +13,5 @@
 ### indexes into Database lists
 $magicToDS_DB = 0
+$magicDSAdvance_DB = 0
 $magicDSToRevert_DB = 0
 $magicDSCompletedRevert_DB = 0
@@ -41,4 +42,7 @@
 ### Turn tasks on
 macro destreak.on
+    # destreak and revert should not run at the same time
+    destreak.revert.off
+
     task destreak.load
         active true
@@ -47,7 +51,13 @@
         active true
     end
+    task destreak.advance
+        active true
+    end
 end
 
 macro destreak.revert.on
+    # destreak and revert should not run at the same time
+    destreak.off
+
     task destreak.revert.load
         active true
@@ -67,4 +77,7 @@
     end
     task destreak.run
+        active false
+    end
+    task destreak.advance
         active false
     end
@@ -100,6 +113,6 @@
   npending     1
 
-  stdout NULL
-  stderr $LOGDIR/magic.destreak.log
+#  stdout NULL
+#  stderr $LOGSUBDIR/destreak.load.log
 
   task.exec
@@ -233,4 +246,50 @@
 end
 
+task	       destreak.advance
+    # task to finish processing for magicDSRuns 
+  host         local
+
+  periods      -poll $LOADPOLL
+  #periods      -exec $LOADEXEC
+  periods      -exec 30
+  periods      -timeout 20
+  npending     1
+
+#  stdout NULL
+#  stderr $LOGSUBDIR/destreak.advance.log
+
+  task.exec
+    $run = magicdstool -advancerun 
+    if ($DB:n != 0)
+
+      $run = $run -dbname $DB:$magicDSAdvance_DB
+
+      $magicDSAdvance_DB ++
+      if ($magicDSAdvance_DB >= $DB:n) set magicDSAdvance_DB = 0
+    end
+    add_poll_args run
+    add_poll_labels run
+    command $run
+  end
+
+  # success
+  task.exit    0
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+
+  task.exit    crash
+    showcommand crash
+  end
+
+  # operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
 task	       destreak.revert.load
   host         local
@@ -386,5 +445,5 @@
 
   stdout NULL
-  stderr $LOGSUBDIR/destreak.completed.revert
+  stderr $LOGSUBDIR/destreak.completed.revert.log
 
   task.exec
@@ -398,4 +457,5 @@
       $run = $run -dbname $DB:$magicDSCompletedRevert_DB
 
+      $magicDSCompletedRevert_DB ++
       if ($magicDSCompletedRevert_DB >= $DB:n) set magicDSCompletedRevert_DB = 0
     end
Index: /trunk/ippTools/share/magicdstool_completed_runs.sql
===================================================================
--- /trunk/ippTools/share/magicdstool_completed_runs.sql	(revision 25464)
+++ /trunk/ippTools/share/magicdstool_completed_runs.sql	(revision 25465)
@@ -1,9 +1,11 @@
 SELECT DISTINCT
-    magic_ds_id
+    magic_ds_id,
+    re_place,
+    label
 FROM
     (
 -- raw stage
 SELECT
-    magicDSRun.magic_ds_id
+    magicDSRun.*
     FROM magicDSRun
     JOIN rawImfile ON stage_id = rawImfile.exp_id
@@ -23,5 +25,5 @@
 -- chip stage
 SELECT
-    magicDSRun.magic_ds_id
+    magicDSRun.*
     FROM magicDSRun
     JOIN chipProcessedImfile ON stage_id = chip_id
@@ -42,5 +44,5 @@
 -- camera stage
 SELECT
-    magicDSRun.magic_ds_id
+    magicDSRun.*
     FROM magicDSRun
     JOIN camProcessedExp ON stage_id = camProcessedExp.cam_id
@@ -59,5 +61,5 @@
 -- warp stage
 SELECT
-    magicDSRun.magic_ds_id
+    magicDSRun.*
     FROM magicDSRun
     JOIN warpSkyfile on stage_id = warp_id
@@ -79,5 +81,5 @@
 -- diff stage
 SELECT DISTINCT
-    magicDSRun.magic_ds_id
+    magicDSRun.*
     FROM magicDSRun
     JOIN magicRun USING (magic_id)
@@ -101,3 +103,3 @@
         AND SUM(magicDSFile.fault) = 0
 
-   ) as Foo
+   ) as magicDSRun
Index: /trunk/ippTools/src/magicdstool.c
===================================================================
--- /trunk/ippTools/src/magicdstool.c	(revision 25464)
+++ /trunk/ippTools/src/magicdstool.c	(revision 25465)
@@ -37,4 +37,5 @@
 static bool todestreakMode(pxConfig *config);
 static bool adddestreakedfileMode(pxConfig *config);
+static bool advancerunMode(pxConfig *config);
 static bool revertdestreakedfileMode(pxConfig *config);
 static bool getskycellsMode(pxConfig *config);
@@ -44,5 +45,4 @@
 
 static bool setmagicDSRunState(pxConfig *config, psS64 magic_id, const char *state);
-static bool magicDSRunComplete(pxConfig *config, bool setmagicked);
 static bool magicDSGetIDs(pxConfig *config, psString stage, psS64 magic_id, psS64 *stage_id, psS64 *cam_id);
 
@@ -70,4 +70,5 @@
         MODECASE(MAGICDSTOOL_MODE_TODESTREAK,          todestreakMode);
         MODECASE(MAGICDSTOOL_MODE_ADDDESTREAKEDFILE,   adddestreakedfileMode);
+        MODECASE(MAGICDSTOOL_MODE_ADVANCERUN,          advancerunMode);
         MODECASE(MAGICDSTOOL_MODE_REVERTDESTREAKEDFILE,revertdestreakedfileMode);
         MODECASE(MAGICDSTOOL_MODE_GETSKYCELLS,         getskycellsMode);
@@ -119,5 +120,5 @@
     PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
     PXOPT_COPY_S64(config->args, where, "-diff_id", "diff_id", "==");
-    PXOPT_COPY_S64(config->args, where, "-magic_id","magic_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-magic_id","magicRun.magic_id", "==");
     PXOPT_COPY_S32(config->args, where, "-streaks_max","streaks", "<=");
 
@@ -661,13 +662,4 @@
     }
 
-    if (!magicDSRunComplete(config, setmagicked)) {
-            // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
     if (!psDBCommit(config->dbh)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -743,7 +735,13 @@
 }
 
-static bool magicDSRunComplete(pxConfig *config, bool setmagicked)
+static bool advancerunMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-magic_ds_id", "magicDSRun.magic_ds_id", "==");
+    pxAddLabelSearchArgs (config, where, "-label", "magicDSRun.label", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
 
     // look for completed magicDSRuns
@@ -754,4 +752,10 @@
     }
 
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " WHERE %s", whereClause);
+        psFree(whereClause);
+    }
+
     if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -771,4 +775,8 @@
         return true;
     }
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
     for (long i = 0; i < psArrayLength(output); i++) {
         psMetadata *row = output->data[i];
@@ -776,8 +784,12 @@
         psS64 magic_ds_id = psMetadataLookupS64(NULL, row, "magic_ds_id");
 
-        // if requested, set stageRun.magicked
+        // if re_place, set stageRun.magicked
+        bool setmagicked = psMetadataLookupBool(NULL, row, "re_place");
         if (setmagicked && !setRunMagicked(config, magic_ds_id)) {
             psError(PS_ERR_UNKNOWN, false, "failed to change stageRun.magicked for magic_ds_id: %" PRId64,
                 magic_ds_id);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
             return false;
         }
@@ -788,8 +800,14 @@
                 magic_ds_id);
             psFree(output);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
             return false;
         }
     }
-
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     return true;
@@ -833,4 +851,5 @@
     return true;
 }
+
 static bool completedrevertMode(pxConfig *config)
 {
Index: /trunk/ippTools/src/magicdstool.h
===================================================================
--- /trunk/ippTools/src/magicdstool.h	(revision 25464)
+++ /trunk/ippTools/src/magicdstool.h	(revision 25465)
@@ -30,4 +30,5 @@
     MAGICDSTOOL_MODE_TODESTREAK,
     MAGICDSTOOL_MODE_ADDDESTREAKEDFILE,
+    MAGICDSTOOL_MODE_ADVANCERUN,
     MAGICDSTOOL_MODE_REVERTDESTREAKEDFILE,
     MAGICDSTOOL_MODE_GETSKYCELLS,
Index: /trunk/ippTools/src/magicdstoolConfig.c
===================================================================
--- /trunk/ippTools/src/magicdstoolConfig.c	(revision 25464)
+++ /trunk/ippTools/src/magicdstoolConfig.c	(revision 25465)
@@ -147,4 +147,10 @@
     psMetadataAddU64(completedrevertArgs, PS_LIST_TAIL, "-limit", 0, "limit result set to N items", 0);
 
+    // -advancerun
+    psMetadata *advancerunArgs = psMetadataAlloc();
+    psMetadataAddS64(advancerunArgs, PS_LIST_TAIL, "-magic_ds_id", 0, "search by magic Destreak ID", 0);
+    psMetadataAddStr(advancerunArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "define label", NULL);
+    psMetadataAddU64(advancerunArgs, PS_LIST_TAIL, "-limit", 0, "limit result set to N items", 0);
+
     psFree(now);
 
@@ -162,4 +168,6 @@
     PXOPT_ADD_MODE("-adddestreakedfile",   "add a de-streaked file",
                     MAGICDSTOOL_MODE_ADDDESTREAKEDFILE, adddestreakedfileArgs);
+    PXOPT_ADD_MODE("-advancerun", "change state for runs that have finished destrreaking",
+                    MAGICDSTOOL_MODE_ADVANCERUN, advancerunArgs);
     PXOPT_ADD_MODE("-revertdestreakedfile", " revert a faulted de-streaked file",
                     MAGICDSTOOL_MODE_REVERTDESTREAKEDFILE, revertdestreakedfileArgs);
@@ -174,4 +182,5 @@
                     MAGICDSTOOL_MODE_COMPLETEDREVERT, completedrevertArgs);
 
+
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
         psError(PS_ERR_UNKNOWN, true, "option parsing failed");
