Class 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 Detail

      • XSTREAM

        public static final XStream2 XSTREAM
    • Constructor Detail

      • BulkFlowNodeStorage

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

      • 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
      • 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
      • 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