本文整理匯總了Golang中github.com/NebulousLabs/Sia/build.Critical函數的典型用法代碼示例。如果您正苦於以下問題:Golang Critical函數的具體用法?Golang Critical怎麽用?Golang Critical使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了Critical函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: threadedScan
// threadedScan is an ongoing function which will query the full set of hosts
// every few hours to see who is online and available for uploading.
func (hdb *HostDB) threadedScan() {
for {
// Determine who to scan. At most 'MaxActiveHosts' will be scanned,
// starting with the active hosts followed by a random selection of the
// inactive hosts.
func() {
hdb.mu.Lock()
defer hdb.mu.Unlock()
// Scan all active hosts.
for _, host := range hdb.activeHosts {
hdb.scanHostEntry(host.hostEntry)
}
// Assemble all of the inactive hosts into a single array.
var entries []*hostEntry
for _, entry := range hdb.allHosts {
entry2, exists := hdb.activeHosts[entry.NetAddress]
if !exists {
entries = append(entries, entry)
} else if entry2.hostEntry != entry {
build.Critical("allHosts + activeHosts mismatch!")
}
}
// Generate a random ordering of up to InactiveHostCheckupQuantity
// hosts.
n := InactiveHostCheckupQuantity
if n > len(entries) {
n = len(entries)
}
hostOrder, err := crypto.Perm(n)
if err != nil {
hdb.log.Println("ERR: could not generate random permutation:", err)
}
// Scan each host.
for _, randIndex := range hostOrder {
hdb.scanHostEntry(entries[randIndex])
}
}()
// Sleep for a random amount of time before doing another round of
// scanning. The minimums and maximums keep the scan time reasonable,
// while the randomness prevents the scanning from always happening at
// the same time of day or week.
maxBig := big.NewInt(int64(MaxScanSleep))
minBig := big.NewInt(int64(MinScanSleep))
randSleep, err := rand.Int(rand.Reader, maxBig.Sub(maxBig, minBig))
if err != nil {
build.Critical(err)
// If there's an error, sleep for the default amount of time.
defaultBig := big.NewInt(int64(DefaultScanSleep))
randSleep = defaultBig.Sub(defaultBig, minBig)
}
hdb.sleeper.Sleep(time.Duration(randSleep.Int64()) + MinScanSleep) // this means the MaxScanSleep is actual Max+Min.
}
}
示例2: RandomHosts
// RandomHosts will pull up to 'n' random hosts from the hostdb. There will be
// no repeats, but the length of the slice returned may be less than 'n', and
// may even be 0. The hosts that get returned first have the higher priority.
// Hosts specified in 'ignore' will not be considered; pass 'nil' if no
// blacklist is desired.
func (hdb *HostDB) RandomHosts(n int, ignore []modules.NetAddress) (hosts []modules.HostDBEntry) {
hdb.mu.Lock()
defer hdb.mu.Unlock()
if hdb.isEmpty() {
return
}
// These will be restored after selection is finished.
var removedEntries []*hostEntry
// Remove hosts that we want to ignore.
for _, addr := range ignore {
node, exists := hdb.activeHosts[addr]
if !exists {
continue
}
node.removeNode()
delete(hdb.activeHosts, addr)
removedEntries = append(removedEntries, node.hostEntry)
}
// Pick a host, remove it from the tree, and repeat until we have n hosts
// or the tree is empty.
for len(hosts) < n && !hdb.isEmpty() {
randWeight, err := rand.Int(rand.Reader, hdb.hostTree.weight.Big())
if err != nil {
build.Critical("rand.Int is returning an error:", err)
break
}
node, err := hdb.hostTree.nodeAtWeight(types.NewCurrency(randWeight))
if err != nil {
build.Critical("nodeAtWeight is returning and error:", err)
break
}
// Only return the host if they are accepting contracts.
if node.hostEntry.HostDBEntry.AcceptingContracts {
hosts = append(hosts, node.hostEntry.HostDBEntry)
}
removedEntries = append(removedEntries, node.hostEntry)
node.removeNode()
delete(hdb.activeHosts, node.hostEntry.NetAddress)
}
// Add back all of the entries that got removed.
for i := range removedEntries {
hdb.insertNode(removedEntries[i])
}
return hosts
}
示例3: Write
// Write takes the input data and writes it to the file.
func (cf *closeableFile) Write(b []byte) (int, error) {
// Sanity check - close should not have been called yet.
if cf.closed {
build.Critical("cannot write to the file after it has been closed")
}
return cf.File.Write(b)
}
示例4: nodeAtWeight
// nodeAtWeight grabs an element in the tree that appears at the given weight.
// Though the tree has an arbitrary sorting, a sufficiently random weight will
// pull a random element. The tree is searched through in a post-ordered way.
func (hn *hostNode) nodeAtWeight(weight types.Currency) (*hostNode, error) {
// Sanity check - weight must be less than the total weight of the tree.
if weight.Cmp(hn.weight) > 0 {
return nil, errOverweight
}
// Check if the left or right child should be returned.
if hn.left != nil {
if weight.Cmp(hn.left.weight) < 0 {
return hn.left.nodeAtWeight(weight)
}
weight = weight.Sub(hn.left.weight) // Search from 0th index of right side.
}
if hn.right != nil && weight.Cmp(hn.right.weight) < 0 {
return hn.right.nodeAtWeight(weight)
}
// Sanity check
if build.DEBUG && !hn.taken {
build.Critical("nodeAtWeight should not be returning a nil entry")
}
// Return the root entry.
return hn, nil
}
示例5: redundancy
// redundancy returns the redundancy of the least redundant chunk. A file
// becomes available when this redundancy is >= 1. Assumes that every piece is
// unique within a file contract. -1 is returned if the file has size 0.
func (f *file) redundancy() float64 {
if f.size == 0 {
return math.NaN()
}
piecesPerChunk := make([]int, f.numChunks())
// If the file has non-0 size then the number of chunks should also be
// non-0. Therefore the f.size == 0 conditional block above must appear
// before this check.
if len(piecesPerChunk) == 0 {
build.Critical("cannot get redundancy of a file with 0 chunks")
return math.NaN()
}
for _, fc := range f.contracts {
for _, p := range fc.Pieces {
piecesPerChunk[p.Chunk]++
}
}
minPieces := piecesPerChunk[0]
for _, numPieces := range piecesPerChunk {
if numPieces < minPieces {
minPieces = numPieces
}
}
return float64(minPieces) / float64(f.erasureCode.MinPieces())
}
示例6: isSane
// isSane checks that required assumptions about the storage obligation are
// correct.
func (so storageObligation) isSane() error {
// There should be an origin transaction set.
if len(so.OriginTransactionSet) == 0 {
build.Critical("origin transaction set is empty")
return errInsaneOriginSetSize
}
// The final transaction of the origin transaction set should have one file
// contract.
final := len(so.OriginTransactionSet) - 1
fcCount := len(so.OriginTransactionSet[final].FileContracts)
if fcCount != 1 {
build.Critical("wrong number of file contracts associated with storage obligation:", fcCount)
return errInsaneOriginSetFileContract
}
// The file contract in the final transaction of the origin transaction set
// should have two valid proof outputs and two missed proof outputs.
lenVPOs := len(so.OriginTransactionSet[final].FileContracts[0].ValidProofOutputs)
lenMPOs := len(so.OriginTransactionSet[final].FileContracts[0].MissedProofOutputs)
if lenVPOs != 2 || lenMPOs != 2 {
build.Critical("file contract has wrong number of VPOs and MPOs, expecting 2 each:", lenVPOs, lenMPOs)
return errInsaneFileContractOutputCounts
}
// If there is a revision transaction set, there should be one file
// contract revision in the final transaction.
if len(so.RevisionTransactionSet) > 0 {
final = len(so.OriginTransactionSet) - 1
fcrCount := len(so.OriginTransactionSet[final].FileContractRevisions)
if fcrCount != 1 {
build.Critical("wrong number of file contract revisions in final transaction of revision transaction set:", fcrCount)
return errInsaneRevisionSetRevisionCount
}
// The file contract revision in the final transaction of the revision
// transaction set should have two valid proof outputs and two missed
// proof outputs.
lenVPOs = len(so.RevisionTransactionSet[final].FileContractRevisions[0].NewValidProofOutputs)
lenMPOs = len(so.RevisionTransactionSet[final].FileContractRevisions[0].NewMissedProofOutputs)
if lenVPOs != 2 || lenMPOs != 2 {
build.Critical("file contract has wrong number of VPOs and MPOs, expecting 2 each:", lenVPOs, lenMPOs)
return errInsaneFileContractRevisionOutputCounts
}
}
return nil
}
示例7: threadedScan
// threadedScan is an ongoing function which will query the full set of hosts
// every few hours to see who is online and available for uploading.
func (hdb *HostDB) threadedScan() {
defer hdb.threadGroup.Done()
for {
// Determine who to scan. At most 'maxActiveHosts' will be scanned,
// starting with the active hosts followed by a random selection of the
// inactive hosts.
func() {
hdb.mu.Lock()
defer hdb.mu.Unlock()
// Scan all active hosts.
for _, host := range hdb.activeHosts {
hdb.scanHostEntry(host.hostEntry)
}
// Assemble all of the inactive hosts into a single array.
var entries []*hostEntry
for _, entry := range hdb.allHosts {
_, exists := hdb.activeHosts[entry.NetAddress]
if !exists {
entries = append(entries, entry)
}
}
// Generate a random ordering of up to inactiveHostCheckupQuantity
// hosts.
hostOrder, err := crypto.Perm(len(entries))
if err != nil {
hdb.log.Println("ERR: could not generate random permutation:", err)
}
// Scan each host.
for i := 0; i < len(hostOrder) && i < inactiveHostCheckupQuantity; i++ {
hdb.scanHostEntry(entries[hostOrder[i]])
}
}()
// Sleep for a random amount of time before doing another round of
// scanning. The minimums and maximums keep the scan time reasonable,
// while the randomness prevents the scanning from always happening at
// the same time of day or week.
maxBig := big.NewInt(int64(maxScanSleep))
minBig := big.NewInt(int64(minScanSleep))
randSleep, err := rand.Int(rand.Reader, maxBig.Sub(maxBig, minBig))
if err != nil {
build.Critical(err)
// If there's an error, sleep for the default amount of time.
defaultBig := big.NewInt(int64(defaultScanSleep))
randSleep = defaultBig.Sub(defaultBig, minBig)
}
select {
// awaken and exit if hostdb is closing
case <-hdb.closeChan:
return
case <-time.After(time.Duration(randSleep.Int64()) + minScanSleep):
}
}
}
示例8: NewCurrency
// NewCurrency creates a Currency value from a big.Int. Undefined behavior
// occurs if a negative input is used.
func NewCurrency(b *big.Int) (c Currency) {
if b.Sign() < 0 {
build.Critical(ErrNegativeCurrency)
} else {
c.i = *b
}
return
}
示例9: RegisterConnectCall
// RegisterConnectCall registers a name and RPCFunc to be called on a peer
// upon connecting.
func (g *Gateway) RegisterConnectCall(name string, fn modules.RPCFunc) {
g.mu.Lock()
defer g.mu.Unlock()
if _, ok := g.initRPCs[name]; ok {
build.Critical("ConnectCall already registered: " + name)
}
g.initRPCs[name] = fn
}
示例10: UnregisterRPC
// UnregisterRPC unregisters an RPC and removes the corresponding RPCFunc from
// g.handlers. Future calls to the RPC by peers will fail.
func (g *Gateway) UnregisterRPC(name string) {
g.mu.Lock()
defer g.mu.Unlock()
if _, ok := g.handlers[handlerName(name)]; !ok {
build.Critical("RPC not registered: " + name)
}
delete(g.handlers, handlerName(name))
}
示例11: RegisterRPC
// RegisterRPC registers an RPCFunc as a handler for a given identifier. To
// call an RPC, use gateway.RPC, supplying the same identifier given to
// RegisterRPC. Identifiers should always use PascalCase. The first 8
// characters of an identifier should be unique, as the identifier used
// internally is truncated to 8 bytes.
func (g *Gateway) RegisterRPC(name string, fn modules.RPCFunc) {
g.mu.Lock()
defer g.mu.Unlock()
if _, ok := g.handlers[handlerName(name)]; ok {
build.Critical("RPC already registered: " + name)
}
g.handlers[handlerName(name)] = fn
}
示例12: UnregisterConnectCall
// UnregisterConnectCall unregisters an on-connect call and removes the
// corresponding RPCFunc from g.initRPCs. Future connections to peers will not
// trigger the RPC to be called on them.
func (g *Gateway) UnregisterConnectCall(name string) {
g.mu.Lock()
defer g.mu.Unlock()
if _, ok := g.initRPCs[name]; !ok {
build.Critical("ConnectCall not registered: " + name)
}
delete(g.initRPCs, name)
}
示例13: init
// init runs a series of sanity checks to verify that the constants have sane
// values.
func init() {
// The revision submission buffer should be greater than the resubmission
// timeout, because there should be time to perform resubmission if the
// first attempt to submit the revision fails.
if revisionSubmissionBuffer < resubmissionTimeout {
build.Critical("revision submission buffer needs to be larger than or equal to the resubmission timeout")
}
}
示例14: Sub
// Sub returns a new Currency value c = x - y. Behavior is undefined when
// x < y.
func (x Currency) Sub(y Currency) (c Currency) {
if x.Cmp(y) < 0 {
c = x
build.Critical(ErrNegativeCurrency)
} else {
c.i.Sub(&x.i, &y.i)
}
return
}
示例15: MulRat
// MulRat returns a new Currency value c = x * y, where y is a big.Rat.
func (x Currency) MulRat(y *big.Rat) (c Currency) {
if y.Sign() < 0 {
build.Critical(ErrNegativeCurrency)
} else {
c.i.Mul(&x.i, y.Num())
c.i.Div(&c.i, y.Denom())
}
return
}