Class SnapshotsService

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, ClusterStateApplier, LifecycleComponent, Releasable

    public class SnapshotsService
    extends AbstractLifecycleComponent
    implements ClusterStateApplier
    Service responsible for creating snapshots

    A typical snapshot creating process looks like this:

    • On the master node the createSnapshot(CreateSnapshotRequest, ActionListener) is called and makes sure that no snapshot is currently running and registers the new snapshot in cluster state
    • When cluster state is updated the beginSnapshot(ClusterState, SnapshotsInProgress.Entry, boolean, ActionListener) method kicks in and initializes the snapshot in the repository and then populates list of shards that needs to be snapshotted in cluster state
    • Each data node is watching for these shards and when new shards scheduled for snapshotting appear in the cluster state, data nodes start processing them through SnapshotShardsService.startNewSnapshots(org.elasticsearch.cluster.SnapshotsInProgress) method
    • Once shard snapshot is created data node updates state of the shard in the cluster state using the SnapshotShardsService.sendSnapshotShardUpdate(Snapshot, ShardId, ShardSnapshotStatus) method
    • When last shard is completed master node in SnapshotShardsService.innerUpdateSnapshotState(org.elasticsearch.snapshots.SnapshotShardsService.UpdateIndexShardSnapshotStatusRequest, org.elasticsearch.action.ActionListener<org.elasticsearch.snapshots.SnapshotShardsService.UpdateIndexShardSnapshotStatusResponse>) method marks the snapshot as completed
    • After cluster state is updated, the endSnapshot(SnapshotsInProgress.Entry, MetaData) finalizes snapshot in the repository, notifies all snapshotCompletionListeners that snapshot is completed, and finally calls removeSnapshotFromClusterState(Snapshot, SnapshotInfo, Exception) to remove snapshot from cluster state
    • Method Detail

      • getRepositoryData

        public RepositoryData getRepositoryData​(java.lang.String repositoryName)
        Gets the RepositoryData for the given repository.
        Parameters:
        repositoryName - repository name
        Returns:
        repository data
      • snapshot

        public SnapshotInfo snapshot​(java.lang.String repositoryName,
                                     SnapshotId snapshotId)
        Retrieves snapshot from repository
        Parameters:
        repositoryName - repository name
        snapshotId - snapshot id
        Returns:
        snapshot
        Throws:
        SnapshotMissingException - if snapshot is not found
      • snapshots

        public java.util.List<SnapshotInfo> snapshots​(java.lang.String repositoryName,
                                                      java.util.List<SnapshotId> snapshotIds,
                                                      boolean ignoreUnavailable)
        Returns a list of snapshots from repository sorted by snapshot creation date
        Parameters:
        repositoryName - repository name
        snapshotIds - snapshots for which to fetch snapshot information
        ignoreUnavailable - if true, snapshots that could not be read will only be logged with a warning, if false, they will throw an error
        Returns:
        list of snapshots
      • currentSnapshots

        public java.util.List<SnapshotInfo> currentSnapshots​(java.lang.String repositoryName)
        Returns a list of currently running snapshots from repository sorted by snapshot creation date
        Parameters:
        repositoryName - repository name
        Returns:
        list of snapshots
      • createSnapshot

        public void createSnapshot​(CreateSnapshotRequest request,
                                   ActionListener<Snapshot> listener)
        Initializes the snapshotting process.

        This method is used by clients to start snapshot. It makes sure that there is no snapshots are currently running and creates a snapshot record in cluster state metadata.

        Parameters:
        request - snapshot request
        listener - snapshot creation listener
      • currentSnapshots

        public java.util.List<SnapshotsInProgress.Entry> currentSnapshots​(java.lang.String repository,
                                                                          java.util.List<java.lang.String> snapshots)
        Returns status of the currently running snapshots

        This method is executed on master node

        Parameters:
        repository - repository id
        snapshots - list of snapshots that will be used as a filter, empty list means no snapshots are filtered
        Returns:
        list of metadata for currently running snapshots
      • snapshotShards

        public java.util.Map<ShardId,​IndexShardSnapshotStatus> snapshotShards​(java.lang.String repositoryName,
                                                                                    RepositoryData repositoryData,
                                                                                    SnapshotInfo snapshotInfo)
                                                                             throws java.io.IOException
        Returns status of shards currently finished snapshots

        This method is executed on master node and it's complimentary to the SnapshotShardsService.currentSnapshotShards(Snapshot) because it returns similar information but for already finished snapshots.

        Parameters:
        repositoryName - repository name
        snapshotInfo - snapshot info
        Returns:
        map of shard id to snapshot status
        Throws:
        java.io.IOException
      • applyClusterState

        public void applyClusterState​(ClusterChangedEvent event)
        Description copied from interface: ClusterStateApplier
        Called when a new cluster state (ClusterChangedEvent.state() needs to be applied. The cluster state to be applied is already committed when this method is called, so an applier must therefore be prepared to deal with any state it receives without throwing an exception. Throwing an exception from an applier is very bad because it will stop the application of this state before it has reached all the other appliers, and will likely result in another attempt to apply the same (or very similar) cluster state which might continue until this node is removed from the cluster.
        Specified by:
        applyClusterState in interface ClusterStateApplier
      • deleteSnapshot

        public void deleteSnapshot​(java.lang.String repositoryName,
                                   java.lang.String snapshotName,
                                   ActionListener<java.lang.Void> listener,
                                   boolean immediatePriority)
        Deletes a snapshot from the repository, looking up the Snapshot reference before deleting. If the snapshot is still running cancels the snapshot first and then deletes it from the repository.
        Parameters:
        repositoryName - repositoryName
        snapshotName - snapshotName
        listener - listener
      • isRepositoryInUse

        public static boolean isRepositoryInUse​(ClusterState clusterState,
                                                java.lang.String repository)
        Checks if a repository is currently in use by one of the snapshots
        Parameters:
        clusterState - cluster state
        repository - repository id
        Returns:
        true if repository is currently in use by one of the running snapshots
      • snapshottingIndices

        public static java.util.Set<Index> snapshottingIndices​(ClusterState currentState,
                                                               java.util.Set<Index> indicesToCheck)
        Returns the indices that are currently being snapshotted (with partial == false) and that are contained in the indices-to-check set.