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 }