/** construct a Transaction for use in an offline operation */
 public static LifecycleTransaction offline(
     OperationType operationType, Iterable<SSTableReader> readers) {
   // if offline, for simplicity we just use a dummy tracker
   Tracker dummy = new Tracker(null, false);
   dummy.addInitialSSTables(readers);
   dummy.apply(updateCompacting(emptySet(), readers));
   return new LifecycleTransaction(dummy, operationType, readers);
 }
 private Throwable unmarkCompacting(Set<SSTableReader> unmark, Throwable accumulate) {
   accumulate = tracker.apply(updateCompacting(unmark, emptySet()), accumulate);
   // when the CFS is invalidated, it will call unreferenceSSTables().  However,
   // unreferenceSSTables only deals
   // with sstables that aren't currently being compacted.  If there are ongoing compactions that
   // finish or are
   // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so
   // we do that here.
   accumulate = tracker.dropSSTablesIfInvalid(accumulate);
   return accumulate;
 }
  private Throwable checkpoint(Throwable accumulate) {
    if (logger.isDebugEnabled())
      logger.debug("Checkpointing update:{}, obsolete:{}", staged.update, staged.obsolete);

    if (staged.isEmpty()) return accumulate;

    Set<SSTableReader> toUpdate = toUpdate();
    Set<SSTableReader> fresh = copyOf(fresh());

    // check the current versions of the readers we're replacing haven't somehow been replaced by
    // someone else
    checkNotReplaced(filterIn(toUpdate, staged.update));

    // ensure any new readers are in the compacting set, since we aren't done with them yet
    // and don't want anyone else messing with them
    // apply atomically along with updating the live set of readers
    tracker.apply(
        compose(updateCompacting(emptySet(), fresh), updateLiveSet(toUpdate, staged.update)));

    // log the staged changes and our newly marked readers
    marked.addAll(fresh);
    logged.log(staged);

    // setup our tracker, and mark our prior versions replaced, also releasing our references to
    // them
    // we do not replace/release obsoleted readers, since we may need to restore them on rollback
    accumulate = setReplaced(filterOut(toUpdate, staged.obsolete), accumulate);
    accumulate = release(selfRefs(filterOut(toUpdate, staged.obsolete)), accumulate);

    staged.clear();
    return accumulate;
  }
  /** point of no return: commit all changes, but leave all readers marked as compacting */
  public Throwable doCommit(Throwable accumulate) {
    assert staged.isEmpty() : "must be no actions introduced between prepareToCommit and a commit";

    logger.debug("Committing update:{}, obsolete:{}", staged.update, staged.obsolete);

    // this is now the point of no return; we cannot safely rollback, so we ignore exceptions until
    // we're done
    // we restore state by obsoleting our obsolete files, releasing our references to them, and
    // updating our size
    // and notification status for the obsolete and new files
    accumulate = markObsolete(tracker, logged.obsolete, accumulate);
    accumulate = tracker.updateSizeTracking(logged.obsolete, logged.update, accumulate);
    accumulate = release(selfRefs(logged.obsolete), accumulate);
    accumulate = tracker.notifySSTablesChanged(originals, logged.update, operationType, accumulate);
    return accumulate;
  }
  /** undo all of the changes made by this transaction, resetting the state to its original form */
  public Throwable doAbort(Throwable accumulate) {
    if (logger.isDebugEnabled())
      logger.debug(
          "Aborting transaction over {}, with ({},{}) logged and ({},{}) staged",
          originals,
          logged.update,
          logged.obsolete,
          staged.update,
          staged.obsolete);

    if (logged.isEmpty() && staged.isEmpty()) return accumulate;

    // mark obsolete all readers that are not versions of those present in the original set
    Iterable<SSTableReader> obsolete =
        filterOut(concatUniq(staged.update, logged.update), originals);
    logger.debug("Obsoleting {}", obsolete);
    // we don't pass the tracker in for the obsoletion, since these readers have never been notified
    // externally
    // nor had their size accounting affected
    accumulate = markObsolete(null, obsolete, accumulate);

    // replace all updated readers with a version restored to its original state
    accumulate = tracker.apply(updateLiveSet(logged.update, restoreUpdatedOriginals()), accumulate);
    // setReplaced immediately preceding versions that have not been obsoleted
    accumulate = setReplaced(logged.update, accumulate);
    // we have replaced all of logged.update and never made visible staged.update,
    // and the files we have logged as obsolete we clone fresh versions of, so they are no longer
    // needed either
    // any _staged_ obsoletes should either be in staged.update already, and dealt with there,
    // or is still in its original form (so left as is); in either case no extra action is needed
    accumulate =
        release(selfRefs(concat(staged.update, logged.update, logged.obsolete)), accumulate);
    logged.clear();
    staged.clear();
    return accumulate;
  }
 public boolean isOffline() {
   return tracker.isDummy();
 }
Beispiel #7
0
 /** Refreshes step positions. */
 protected void refreshSteps() {
   locked = true;
   if (refreshStepsLater) return;
   // return if this is an empty dynamic system
   if (this instanceof DynamicSystem) {
     DynamicSystem system = (DynamicSystem) this;
     if (system.particles.length == 0) return;
   }
   if (trackerPanel != null) {
     refreshDerivsLater = trackerPanel.getPlayer().getClipControl().isPlaying();
     int n = trackerPanel.getFrameNumber();
     VideoClip clip = trackerPanel.getPlayer().getVideoClip();
     // determine last frame to be marked (must satisfy both model and clip)
     int end = Math.min(getEndFrame(), n);
     while (end > getStartFrame() && !clip.includesFrame(end)) {
       end--;
     }
     if (end <= lastValidFrame) return;
     if (lastValidFrame == -1) {
       reset(); // initializes model, sets lastValidFrame to marked frame, if any
       if (lastValidFrame == -1 || end <= lastValidFrame) return;
     }
     int start = lastValidFrame;
     Tracker.logTime(
         this.getClass().getSimpleName()
             + this.hashCode()
             + " refreshing steps "
             + start
             + " to "
             + end); //$NON-NLS-1$ //$NON-NLS-2$
     boolean singleStep = (end - start == 1);
     // step forward to end
     ImageCoordSystem coords = trackerPanel.getCoords();
     // get underlying coords if appropriate
     boolean useDefault = isUseDefaultReferenceFrame();
     while (useDefault && coords instanceof ReferenceFrame) {
       coords = ((ReferenceFrame) coords).getCoords();
     }
     double startTime = t0 + dt * tracePtsPerStep * (start - getStartFrame()) / clip.getStepSize();
     double stepSize = 1.0 * clip.getStepSize() / tracePtsPerStep;
     int stepCount = (tracePtsPerStep * (end - start)) / clip.getStepSize();
     ParticleModel[] models = getModels();
     // prepare larger trace arrays and copy existing points into them
     for (ParticleModel next : models) {
       next.locked = false;
       int traceLength = next.traceX.length + stepCount;
       next.prevX = next.traceX;
       next.prevY = next.traceY;
       next.traceX = new double[traceLength];
       next.traceY = new double[traceLength];
       System.arraycopy(next.prevX, 0, next.traceX, 0, next.prevX.length);
       System.arraycopy(next.prevY, 0, next.traceY, 0, next.prevY.length);
     }
     for (int i = 0; i < stepCount; i++) {
       int stepNumber = i + 1;
       int frameNumber = start + (int) (stepNumber * stepSize);
       time = startTime + stepNumber * dt;
       Point2D[] points = getNextTracePositions();
       if (points == null) continue;
       AffineTransform transform = coords.getToImageTransform(frameNumber);
       for (int j = 0; j < models.length; j++) {
         transform.transform(points[j], points[j]);
         // determine if point is invalid due to out of bounds
         boolean valid =
             Math.abs(points[j].getX()) < xLimit && Math.abs(points[j].getY()) < yLimit;
         if (!valid && !invalidWarningShown) {
           invalidWarningShown = true;
           Runnable runner = new Runnable() { // avoids deadlock?
                 public void run() {
                   //            		if (invalidWarningShown) return;
                   JOptionPane.showMessageDialog(
                       trackerPanel,
                       TrackerRes.getString("ParticleModel.Dialog.Offscreen.Message1")
                           + XML.NEW_LINE //$NON-NLS-1$
                           + TrackerRes.getString(
                               "ParticleModel.Dialog.Offscreen.Message2"), //$NON-NLS-1$
                       TrackerRes.getString("ParticleModel.Dialog.Offscreen.Title"), // $NON-NLS-1$
                       JOptionPane.WARNING_MESSAGE);
                 }
               };
           SwingUtilities.invokeLater(runner);
         }
         models[j].traceX[models[j].prevX.length + i] = valid ? points[j].getX() : Double.NaN;
         models[j].traceY[models[j].prevY.length + i] = valid ? points[j].getY() : Double.NaN;
         if (stepNumber % tracePtsPerStep == 0) { // refresh position step
           saveState(frameNumber);
           PositionStep step = (PositionStep) models[j].getStep(frameNumber);
           if (step == null) {
             step = createPositionStep(models[j], frameNumber, 0, 0);
             step.setFootprint(models[j].getFootprint());
             models[j].steps.setStep(frameNumber, step);
           }
           step.getPosition().setPosition(valid ? points[j] : nan); // this method is fast
         }
       }
     }
     int count = 4 + (end - start);
     int startUpdate = start;
     // step back twice to pick up possible valid derivatives
     if (startUpdate > clip.getStepSize()) startUpdate -= clip.getStepSize();
     if (startUpdate > clip.getStepSize()) startUpdate -= clip.getStepSize();
     lastValidFrame = end;
     for (ParticleModel next : models) {
       next.steps.setLength(end + 1);
       coords = trackerPanel.getCoords(); // get active coords
       // special treatment if this is the origin of current reference frame
       if (coords instanceof ReferenceFrame
           && ((ReferenceFrame) coords).getOriginTrack() == next) {
         // set origins of reference frame
         boolean prev = next.refreshing; // save refreshing value
         next.refreshing = true;
         ((ReferenceFrame) coords).setOrigins();
         // then set positions to zero wrt origins
         for (int i = 0; i < clip.getStepCount(); i++) {
           int frameNumber = clip.stepToFrame(i);
           PositionStep step = (PositionStep) next.getStep(frameNumber);
           if (step == null) continue;
           AffineTransform transform = coords.getToImageTransform(frameNumber);
           next.point.setLocation(0, 0);
           transform.transform(next.point, next.point);
           step.getPosition().setPosition(next.point); // this method is fast
         }
         next.refreshing = prev; // restore refreshing value
         if (!refreshDerivsLater) {
           next.updateDerivatives(startUpdate, count);
         }
       } else if (!refreshDerivsLater) {
         next.updateDerivatives(startUpdate, count);
       }
       if (next.vAtOrigin) next.vTailsToOriginItem.doClick();
       if (next.aAtOrigin) next.aTailsToOriginItem.doClick();
       if (!refreshDerivsLater) {
         if (singleStep)
           next.support.firePropertyChange("step", null, new Integer(n)); // $NON-NLS-1$
         else next.support.firePropertyChange("steps", null, null); // $NON-NLS-1$
       }
       // erase refreshed steps
       for (int i = start + 1; i <= end; i++) {
         Step step = next.getStep(i);
         if (step != null) step.erase();
       }
       next.locked = true;
     }
     trackerPanel.repaint();
   }
 }