github.com/johnathanhowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/consensus/persist.go (about)

     1  package consensus
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/NebulousLabs/Sia/build"
     9  	"github.com/NebulousLabs/Sia/modules"
    10  	"github.com/NebulousLabs/Sia/persist"
    11  
    12  	"github.com/NebulousLabs/bolt"
    13  )
    14  
    15  const (
    16  	// DatabaseFilename contains the filename of the database that will be used
    17  	// when managing consensus.
    18  	DatabaseFilename = modules.ConsensusDir + ".db"
    19  	logFile          = modules.ConsensusDir + ".log"
    20  )
    21  
    22  // loadDB pulls all the blocks that have been saved to disk into memory, using
    23  // them to fill out the ConsensusSet.
    24  func (cs *ConsensusSet) loadDB() error {
    25  	// Open the database - a new bolt database will be created if none exists.
    26  	err := cs.openDB(filepath.Join(cs.persistDir, DatabaseFilename))
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	// Walk through initialization for Sia.
    32  	return cs.db.Update(func(tx *bolt.Tx) error {
    33  		// Check if the database has been initialized.
    34  		if !dbInitialized(tx) {
    35  			return cs.initDB(tx)
    36  		}
    37  
    38  		// Check that inconsistencies have not been detected in the database.
    39  		if inconsistencyDetected(tx) {
    40  			return errors.New("database contains inconsistencies")
    41  		}
    42  
    43  		// Check that the genesis block is correct - typically only incorrect
    44  		// in the event of developer binaries vs. release binaires.
    45  		genesisID, err := getPath(tx, 0)
    46  		if build.DEBUG && err != nil {
    47  			panic(err)
    48  		}
    49  		if genesisID != cs.blockRoot.Block.ID() {
    50  			return errors.New("Blockchain has wrong genesis block, exiting.")
    51  		}
    52  		return nil
    53  	})
    54  }
    55  
    56  // initPersist initializes the persistence structures of the consensus set, in
    57  // particular loading the database and preparing to manage subscribers.
    58  func (cs *ConsensusSet) initPersist() error {
    59  	// Create the consensus directory.
    60  	err := os.MkdirAll(cs.persistDir, 0700)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	// Initialize the logger.
    66  	cs.log, err = persist.NewFileLogger(filepath.Join(cs.persistDir, logFile))
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	// Try to load an existing database from disk - a new one will be created
    72  	// if one does not exist.
    73  	err = cs.loadDB()
    74  	if err != nil {
    75  		return err
    76  	}
    77  	return nil
    78  }