gitlab.com/jokerrs1/Sia@v1.3.2/modules/miner/persist.go (about)

     1  package miner
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"time"
     7  
     8  	"github.com/NebulousLabs/Sia/modules"
     9  	"github.com/NebulousLabs/Sia/persist"
    10  	"github.com/NebulousLabs/Sia/types"
    11  )
    12  
    13  const (
    14  	logFile        = modules.MinerDir + ".log"
    15  	saveLoopPeriod = time.Minute * 2
    16  	settingsFile   = modules.MinerDir + ".json"
    17  )
    18  
    19  var (
    20  	settingsMetadata = persist.Metadata{
    21  		Header:  "Miner Settings",
    22  		Version: "0.5.0",
    23  	}
    24  )
    25  
    26  type (
    27  	// persist contains all of the persistent miner data.
    28  	persistence struct {
    29  		RecentChange  modules.ConsensusChangeID
    30  		Height        types.BlockHeight
    31  		Target        types.Target
    32  		Address       types.UnlockHash
    33  		BlocksFound   []types.BlockID
    34  		UnsolvedBlock types.Block
    35  	}
    36  )
    37  
    38  // initSettings loads the settings file if it exists and creates it if it
    39  // doesn't.
    40  func (m *Miner) initSettings() error {
    41  	filename := filepath.Join(m.persistDir, settingsFile)
    42  	_, err := os.Stat(filename)
    43  	if os.IsNotExist(err) {
    44  		return m.saveSync()
    45  	} else if err != nil {
    46  		return err
    47  	}
    48  	return m.load()
    49  }
    50  
    51  // initPersist initializes the persistence of the miner.
    52  func (m *Miner) initPersist() error {
    53  	// Create the miner directory.
    54  	err := os.MkdirAll(m.persistDir, 0700)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	// Add a logger.
    60  	m.log, err = persist.NewFileLogger(filepath.Join(m.persistDir, logFile))
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	return m.initSettings()
    66  }
    67  
    68  // load loads the miner persistence from disk.
    69  func (m *Miner) load() error {
    70  	return persist.LoadJSON(settingsMetadata, &m.persist, filepath.Join(m.persistDir, settingsFile))
    71  }
    72  
    73  // saveSync saves the miner persistence to disk, and then syncs to disk.
    74  func (m *Miner) saveSync() error {
    75  	return persist.SaveJSON(settingsMetadata, m.persist, filepath.Join(m.persistDir, settingsFile))
    76  }
    77  
    78  // threadedSaveLoop periodically saves the miner persist.
    79  func (m *Miner) threadedSaveLoop() {
    80  	for {
    81  		select {
    82  		case <-m.tg.StopChan():
    83  			return
    84  		case <-time.After(saveLoopPeriod):
    85  		}
    86  
    87  		func() {
    88  			err := m.tg.Add()
    89  			if err != nil {
    90  				return
    91  			}
    92  			defer m.tg.Done()
    93  
    94  			m.mu.Lock()
    95  			err = m.saveSync()
    96  			m.mu.Unlock()
    97  			if err != nil {
    98  				m.log.Println("ERROR: Unable to save miner persist:", err)
    99  			}
   100  		}()
   101  	}
   102  }