Class BulkFlowNodeStorage

java.lang.Object
org.jenkinsci.plugins.workflow.support.storage.FlowNodeStorage
org.jenkinsci.plugins.workflow.support.storage.BulkFlowNodeStorage
All Implemented Interfaces:
org.jenkinsci.plugins.workflow.graph.FlowActionStorage

public class BulkFlowNodeStorage extends FlowNodeStorage
FlowNodeStorage implementation that stores all the FlowNodes together in one file for efficient bulk I/O

This defers persisting until flush() is called (or until we flush individual nodes explicitly or by storing them without specifying delayWritingActions=true. It also doesn't use the atomic write operations. Performance characteristics: much better use of the filesystem and far more efficient read/write if you do it all at once. HOWEVER, if you insist on explicitly writing out each node, this reverts to overall O(n^2) performance, where n is node count. For these reasons, this implementation should only be used where FlowDurabilityHint.isPersistWithEveryStep() is false.

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final XStream2
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    BulkFlowNodeStorage(org.jenkinsci.plugins.workflow.flow.FlowExecution exec, File dir)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Force persisting any nodes that had writing deferred
    void
    flushNode(org.jenkinsci.plugins.workflow.graph.FlowNode n)
    Persists a single FlowNode to disk (if not already persisted).
    org.jenkinsci.plugins.workflow.graph.FlowNode
     
    boolean
    Have we written everything to disk that we need to, or is there something waiting to be written
    loadActions(org.jenkinsci.plugins.workflow.graph.FlowNode node)
     
    void
    saveActions(org.jenkinsci.plugins.workflow.graph.FlowNode node, List<Action> actions)
    Just stores this one node
    void
    storeNode(org.jenkinsci.plugins.workflow.graph.FlowNode n)
    Registers node in this storage, potentially persisting to disk.
    void
    storeNode(org.jenkinsci.plugins.workflow.graph.FlowNode n, boolean delayWritingActions)
    Register the given node to the storage, potentially flushing to disk, and optionally marking the node as deferring writes.

    Methods inherited from class org.jenkinsci.plugins.workflow.support.storage.FlowNodeStorage

    autopersist, isAvoidAtomicWrite, setAvoidAtomicWrite

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • XSTREAM

      public static final XStream2 XSTREAM
  • Constructor Details

    • BulkFlowNodeStorage

      public BulkFlowNodeStorage(org.jenkinsci.plugins.workflow.flow.FlowExecution exec, File dir)
  • Method Details

    • getNode

      @CheckForNull public org.jenkinsci.plugins.workflow.graph.FlowNode getNode(@NonNull String id) throws IOException
      Specified by:
      getNode in class FlowNodeStorage
      Returns:
      null If no node of the given ID has been persisted before.
      Throws:
      IOException
    • storeNode

      public void storeNode(@NonNull org.jenkinsci.plugins.workflow.graph.FlowNode n, boolean delayWritingActions) throws IOException
      Description copied from class: FlowNodeStorage
      Register the given node to the storage, potentially flushing to disk, and optionally marking the node as deferring writes.

      This should be invoked with delayWritingAction=true until you have a fully configured node to write out. Generally FlowNodeStorage.autopersist(FlowNode) should be automatically invoked before Step execution begins unless the step is block-scoped (in which case the FlowNode will handle this).

      Overrides:
      storeNode in class FlowNodeStorage
      Parameters:
      n - Node to store
      delayWritingActions - If true, node will avoid persisting actions except on explicit flush or when you call FlowNodeStorage.autopersist(FlowNode).
      Throws:
      IOException
    • storeNode

      public void storeNode(org.jenkinsci.plugins.workflow.graph.FlowNode n) throws IOException
      Description copied from class: FlowNodeStorage
      Registers node in this storage, potentially persisting to disk. FlowNodeStorage.flushNode(FlowNode) will guarantee it is persisted.
      Specified by:
      storeNode in class FlowNodeStorage
      Throws:
      IOException
    • flushNode

      public void flushNode(@NonNull org.jenkinsci.plugins.workflow.graph.FlowNode n) throws IOException
      Persists a single FlowNode to disk (if not already persisted).
      Overrides:
      flushNode in class FlowNodeStorage
      Parameters:
      n - Node to persist
      Throws:
      IOException
    • flush

      public void flush() throws IOException
      Force persisting any nodes that had writing deferred
      Overrides:
      flush in class FlowNodeStorage
      Throws:
      IOException
    • loadActions

      public List<Action> loadActions(@NonNull org.jenkinsci.plugins.workflow.graph.FlowNode node) throws IOException
      Throws:
      IOException
    • saveActions

      public void saveActions(@NonNull org.jenkinsci.plugins.workflow.graph.FlowNode node, @NonNull List<Action> actions) throws IOException
      Just stores this one node
      Throws:
      IOException
    • isPersistedFully

      public boolean isPersistedFully()
      Have we written everything to disk that we need to, or is there something waiting to be written
      Overrides:
      isPersistedFully in class FlowNodeStorage