github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/renter/renter.go (about)

     1  package renter
     2  
     3  import (
     4  	"github.com/NebulousLabs/Sia/modules"
     5  	"github.com/NebulousLabs/Sia/modules/renter/contractor"
     6  	"github.com/NebulousLabs/Sia/modules/renter/hostdb"
     7  	"github.com/NebulousLabs/Sia/persist"
     8  	"github.com/NebulousLabs/Sia/sync"
     9  	"github.com/NebulousLabs/Sia/types"
    10  )
    11  
    12  // A hostDB is a database of hosts that the renter can use for figuring out who
    13  // to upload to, and download from.
    14  type hostDB interface {
    15  	// ActiveHosts returns the list of hosts that are actively being selected
    16  	// from.
    17  	ActiveHosts() []modules.HostDBEntry
    18  
    19  	// AllHosts returns the full list of hosts known to the hostdb.
    20  	AllHosts() []modules.HostDBEntry
    21  
    22  	// AveragePrice returns the average price of a host.
    23  	AveragePrice() types.Currency
    24  
    25  	// Close closes the hostdb.
    26  	Close() error
    27  
    28  	// IsOffline reports whether a host is consider offline.
    29  	IsOffline(modules.NetAddress) bool
    30  }
    31  
    32  // A hostContractor negotiates, revises, renews, and provides access to file
    33  // contracts.
    34  type hostContractor interface {
    35  	// SetAllowance sets the amount of money the contractor is allowed to
    36  	// spend on contracts over a given time period, divided among the number
    37  	// of hosts specified. Note that contractor can start forming contracts as
    38  	// soon as SetAllowance is called; that is, it may block.
    39  	SetAllowance(modules.Allowance) error
    40  
    41  	// Allowance returns the current allowance
    42  	Allowance() modules.Allowance
    43  
    44  	// Contracts returns the contracts formed by the contractor.
    45  	Contracts() []modules.RenterContract
    46  
    47  	// Editor creates an Editor from the specified contract, allowing it to be
    48  	// modified.
    49  	Editor(modules.RenterContract) (contractor.Editor, error)
    50  
    51  	// FinancialMetrics returns the financial metrics of the contractor.
    52  	FinancialMetrics() modules.RenterFinancialMetrics
    53  
    54  	// Downloader creates a Downloader from the specified contract, allowing
    55  	// the retrieval of sectors.
    56  	Downloader(modules.RenterContract) (contractor.Downloader, error)
    57  }
    58  
    59  // A trackedFile contains metadata about files being tracked by the Renter.
    60  // Tracked files are actively repaired by the Renter. By default, files
    61  // uploaded by the user are tracked, and files that are added (via loading a
    62  // .sia file) are not.
    63  type trackedFile struct {
    64  	// location of original file on disk
    65  	RepairPath string
    66  }
    67  
    68  // A Renter is responsible for tracking all of the files that a user has
    69  // uploaded to Sia, as well as the locations and health of these files.
    70  type Renter struct {
    71  	// modules
    72  	cs     modules.ConsensusSet
    73  	wallet modules.Wallet
    74  
    75  	// resources
    76  	hostDB         hostDB
    77  	hostContractor hostContractor
    78  	log            *persist.Logger
    79  
    80  	// variables
    81  	files         map[string]*file
    82  	tracking      map[string]trackedFile // map from nickname to metadata
    83  	downloadQueue []*download
    84  
    85  	// constants
    86  	persistDir string
    87  
    88  	mu *sync.RWMutex
    89  }
    90  
    91  // New returns an empty renter.
    92  func New(cs modules.ConsensusSet, wallet modules.Wallet, tpool modules.TransactionPool, persistDir string) (*Renter, error) {
    93  	hdb, err := hostdb.New(cs, persistDir)
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  	hc, err := contractor.New(cs, wallet, tpool, hdb, persistDir)
    98  	if err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	r := &Renter{
   103  		cs:             cs,
   104  		wallet:         wallet,
   105  		hostDB:         hdb,
   106  		hostContractor: hc,
   107  
   108  		files:    make(map[string]*file),
   109  		tracking: make(map[string]trackedFile),
   110  
   111  		persistDir: persistDir,
   112  		mu:         sync.New(modules.SafeMutexDelay, 1),
   113  	}
   114  	err = r.initPersist()
   115  	if err != nil {
   116  		return nil, err
   117  	}
   118  
   119  	go r.threadedRepairLoop()
   120  
   121  	return r, nil
   122  }
   123  
   124  // Close closes the Renter and its dependencies
   125  func (r *Renter) Close() error {
   126  	return r.hostDB.Close()
   127  }
   128  
   129  // hostdb passthroughs
   130  func (r *Renter) ActiveHosts() []modules.HostDBEntry { return r.hostDB.ActiveHosts() }
   131  func (r *Renter) AllHosts() []modules.HostDBEntry    { return r.hostDB.AllHosts() }
   132  
   133  // contractor passthroughs
   134  func (r *Renter) Allowance() modules.Allowance           { return r.hostContractor.Allowance() }
   135  func (r *Renter) Contracts() []modules.RenterContract    { return r.hostContractor.Contracts() }
   136  func (r *Renter) SetAllowance(a modules.Allowance) error { return r.hostContractor.SetAllowance(a) }
   137  func (r *Renter) FinancialMetrics() modules.RenterFinancialMetrics {
   138  	return r.hostContractor.FinancialMetrics()
   139  }
   140  
   141  // enforce that Renter satisfies the modules.Renter interface
   142  var _ modules.Renter = (*Renter)(nil)