api.go
func (r *Raft) restoreSnapshot() error {
	snapshots, err := r.snapshots.List()
	if err != nil {
		r.logger.Error(fmt.Sprintf("Failed to list snapshots: %v", err))
		return err
	}

	// Try to load in order of newest to oldest
	for _, snapshot := range snapshots {
		_, source, err := r.snapshots.Open(snapshot.ID)
		if err != nil {
			r.logger.Error(fmt.Sprintf("Failed to open snapshot %v: %v", snapshot.ID, err))
			continue
		}
		defer source.Close()

		if err := r.fsm.Restore(source); err != nil {
			r.logger.Error(fmt.Sprintf("Failed to restore snapshot %v: %v", snapshot.ID, err))
			continue
		}

		// Log success
		r.logger.Info(fmt.Sprintf("Restored from snapshot %v", snapshot.ID))

		// Update the lastApplied so we don't replay old logs
		r.setLastApplied(snapshot.Index)

		// Update the last stable snapshot info
		r.setLastSnapshot(snapshot.Index, snapshot.Term)

		// Update the configuration
		if snapshot.Version > 0 {
			r.configurations.committed = snapshot.Configuration
			r.configurations.committedIndex = snapshot.ConfigurationIndex
			r.configurations.latest = snapshot.Configuration
			r.configurations.latestIndex = snapshot.ConfigurationIndex
		} else {
			configuration := decodePeers(snapshot.Peers, r.trans)
			r.configurations.committed = configuration
			r.configurations.committedIndex = snapshot.Index
			r.configurations.latest = configuration
			r.configurations.latestIndex = snapshot.Index
		}

		// Success!
		return nil
	}

	// If we had snapshots and failed to load them, its an error
	if len(snapshots) > 0 {
		return fmt.Errorf("failed to load any existing snapshots")
	}
	return nil
}
func (r *Raft) restoreSnapshot() error {
	snapshots, err := r.snapshots.List()
	if err != nil {
		r.logger.Error(fmt.Sprintf("Failed to list snapshots: %v", err))
		return err
	}

	// Try to load in order of newest to oldest
	for _, snapshot := range snapshots {
		_, source, err := r.snapshots.Open(snapshot.ID)
		if err != nil {
			r.logger.Error(fmt.Sprintf("Failed to open snapshot %v: %v", snapshot.ID, err))
			continue
		}
		defer source.Close()

		if err := r.fsm.Restore(source); err != nil {
			r.logger.Error(fmt.Sprintf("Failed to restore snapshot %v: %v", snapshot.ID, err))
			continue
		}

		// Log success
		r.logger.Info(fmt.Sprintf("Restored from snapshot %v", snapshot.ID))

		// Update the lastApplied so we don't replay old logs
		r.setLastApplied(snapshot.Index)

		// Update the last stable snapshot info
		r.setLastSnapshot(snapshot.Index, snapshot.Term)

		// Update the configuration
		if snapshot.Version > 0 {
			r.configurations.committed = snapshot.Configuration
			r.configurations.committedIndex = snapshot.ConfigurationIndex
			r.configurations.latest = snapshot.Configuration
			r.configurations.latestIndex = snapshot.ConfigurationIndex
		} else {
			configuration := decodePeers(snapshot.Peers, r.trans)
			r.configurations.committed = configuration
			r.configurations.committedIndex = snapshot.Index
			r.configurations.latest = configuration
			r.configurations.latestIndex = snapshot.Index
		}

		// Success!
		return nil
	}

	// If we had snapshots and failed to load them, its an error
	if len(snapshots) > 0 {
		return fmt.Errorf("failed to load any existing snapshots")
	}
	return nil
}
func ( r * Raft ) restoreSnapshot ( ) error { snapshots , err := r . snapshots . List ( ) if err != nil { r . logger . Error ( fmt . Sprintf ( " " , err ) ) return err } // Try to load in order of newest to oldest for _ , snapshot := range snapshots { _ , source , err := r . snapshots . Open ( snapshot . ID ) if err != nil { r . logger . Error ( fmt . Sprintf ( " " , snapshot . ID , err ) ) continue } defer source . Close ( ) if err := r . fsm . Restore ( source ) ; err != nil { r . logger . Error ( fmt . Sprintf ( " " , snapshot . ID , err ) ) continue } // Log success r . logger . Info ( fmt . Sprintf ( " " , snapshot . ID ) ) // Update the lastApplied so we don't replay old logs r . setLastApplied ( snapshot . Index ) // Update the last stable snapshot info r . setLastSnapshot ( snapshot . Index , snapshot . Term ) // Update the configuration if snapshot . Version > 0 { r . configurations . committed = snapshot . Configuration r . configurations . committedIndex = snapshot . ConfigurationIndex r . configurations . latest = snapshot . Configuration r . configurations . latestIndex = snapshot . ConfigurationIndex } else { configuration := decodePeers ( snapshot . Peers , r . trans ) r . configurations . committed = configuration r . configurations . committedIndex = snapshot . Index r . configurations . latest = configuration r . configurations . latestIndex = snapshot . Index } // Success! return nil } // If we had snapshots and failed to load them, its an error if len ( snapshots ) > 0 { return fmt . Errorf ( " " ) } return nil }
// restoreSnapshot attempts to restore the latest snapshots, and fails if none
// of them can be restored. This is called at initialization time, and is
// completely unsafe to call at any other time.
restoreSnapshot attempts to restore the latest snapshots and fails if none of them can be restored . This is called at initialization time and is completely unsafe to call at any other time .