本文整理汇总了Golang中goshawkdb/io/common.RMId函数的典型用法代码示例。如果您正苦于以下问题:Golang RMId函数的具体用法?Golang RMId怎么用?Golang RMId使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RMId函数的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: start
func (aalc *acceptorAwaitLocallyComplete) start() {
if aalc.twoBSender != nil {
aalc.acceptorManager.ConnectionManager.RemoveSenderSync(aalc.twoBSender)
aalc.twoBSender = nil
}
// If our outcome changes, it may look here like we're throwing
// away TLCs received from proposers/learners. However,
// proposers/learners wait until all acceptors have given the same
// answer before issuing any TLCs, so if we are here, we cannot
// have received any TLCs from anyone... unless we're a retry! If
// the txn is a retry then proposers start as soon as they have any
// ballot, and the ballot accumulator will return a result
// immediately. However, other ballots can continue to arrive even
// after a proposer has received F+1 equal outcomes from
// acceptors. In that case, the acceptor can be here, waiting for
// TLCs, and can even have received some TLCs when it now receives
// another ballot. It cannot ignore that ballot because to do so
// opens the possibility that the acceptors do not arrive at the
// same outcome and the txn will block.
allocs := aalc.ballotAccumulator.Txn.Allocations()
aalc.pendingTLC = make(map[common.RMId]server.EmptyStruct, allocs.Len())
aalc.tgcRecipients = make([]common.RMId, 0, allocs.Len())
twoBRecipients := make([]common.RMId, 0, allocs.Len())
aborted := (*msgs.Outcome)(aalc.outcomeOnDisk).Which() == msgs.OUTCOME_ABORT
for idx, l := 0, allocs.Len(); idx < l; idx++ {
alloc := allocs.At(idx)
active := alloc.Active() != 0
rmId := common.RMId(alloc.RmId())
if aalc.sendToAllOnDisk || active {
twoBRecipients = append(twoBRecipients, rmId)
if _, found := aalc.tlcsReceived[rmId]; !found {
aalc.pendingTLC[rmId] = server.EmptyStructVal
}
}
if !aborted || active {
aalc.tgcRecipients = append(aalc.tgcRecipients, rmId)
}
}
if len(aalc.pendingTLC) == 0 && aalc.tscReceived {
aalc.maybeDelete()
} else {
server.Log(aalc.txnId, "Adding sender for 2B")
submitter := common.RMId(aalc.ballotAccumulator.Txn.Submitter())
aalc.twoBSender = newTwoBTxnVotesSender((*msgs.Outcome)(aalc.outcomeOnDisk), aalc.txnId, submitter, twoBRecipients...)
aalc.acceptorManager.ConnectionManager.AddSender(aalc.twoBSender)
}
}
示例2: start
func (cash *connectionAwaitServerHandshake) start() (bool, error) {
topology := cash.connectionManager.Topology()
helloFromServer := cash.makeHelloFromServer(topology)
if err := cash.send(server.SegToBytes(helloFromServer)); err != nil {
return cash.connectionAwaitHandshake.maybeRestartConnection(err)
}
if seg, err := cash.readAndDecryptOne(); err == nil {
hello := msgs.ReadRootHelloFromServer(seg)
if verified, remoteTopology := cash.verifyTopology(topology, &hello); verified {
cash.Lock()
cash.established = true
cash.remoteHost = hello.LocalHost()
ns := hello.Namespace()
cash.remoteBootCount = binary.BigEndian.Uint32(ns[4:8])
cash.remoteRMId = common.RMId(binary.BigEndian.Uint32(ns[8:12]))
cash.combinedTieBreak = cash.combinedTieBreak ^ hello.TieBreak()
cash.remoteTopology = remoteTopology
cash.Unlock()
cash.nextState(nil)
return false, nil
} else {
return cash.connectionAwaitHandshake.maybeRestartConnection(fmt.Errorf("Unequal remote topology"))
}
} else {
return cash.connectionAwaitHandshake.maybeRestartConnection(err)
}
}
示例3: OneATxnVotesReceived
func (am *AcceptorManager) OneATxnVotesReceived(sender common.RMId, txnId *common.TxnId, oneATxnVotes *msgs.OneATxnVotes) {
instanceRMId := common.RMId(oneATxnVotes.RmId())
server.Log(txnId, "1A received from", sender, "; instance:", instanceRMId)
instId := instanceId([instanceIdLen]byte{})
instIdSlice := instId[:]
copy(instIdSlice, txnId[:])
binary.BigEndian.PutUint32(instIdSlice[common.KeyLen:], uint32(instanceRMId))
replySeg := capn.NewBuffer(nil)
msg := msgs.NewRootMessage(replySeg)
oneBTxnVotes := msgs.NewOneBTxnVotes(replySeg)
msg.SetOneBTxnVotes(oneBTxnVotes)
oneBTxnVotes.SetRmId(oneATxnVotes.RmId())
oneBTxnVotes.SetTxnId(oneATxnVotes.TxnId())
proposals := oneATxnVotes.Proposals()
promises := msgs.NewTxnVotePromiseList(replySeg, proposals.Len())
oneBTxnVotes.SetPromises(promises)
for idx, l := 0, proposals.Len(); idx < l; idx++ {
proposal := proposals.At(idx)
vUUId := common.MakeVarUUId(proposal.VarId())
copy(instIdSlice[common.KeyLen+4:], vUUId[:])
promise := promises.At(idx)
promise.SetVarId(vUUId[:])
am.ensureInstance(txnId, &instId, vUUId).OneATxnVotesReceived(&proposal, &promise)
}
NewOneShotSender(server.SegToBytes(replySeg), am.ConnectionManager, sender)
}
示例4: TopologyFromCap
func TopologyFromCap(txnId *common.TxnId, root *msgs.VarIdPos, topology *msgs.Topology) *Topology {
t := &Topology{Configuration: &configuration.Configuration{}}
t.ClusterId = topology.ClusterId()
t.Version = topology.Version()
t.Hosts = topology.Hosts().ToArray()
t.F = topology.F()
t.FInc = t.F + 1
t.TwoFInc = (2 * uint16(t.F)) + 1
t.MaxRMCount = topology.MaxRMCount()
t.AsyncFlush = topology.AsyncFlush()
rms := topology.Rms()
t.AllRMs = make([]common.RMId, rms.Len())
for idx := range t.AllRMs {
t.AllRMs[idx] = common.RMId(rms.At(idx))
}
t.DBVersion = txnId
if root != nil && len(root.Id()) == common.KeyLen {
t.RootVarUUId = common.MakeVarUUId(root.Id())
pos := common.Positions(root.Positions())
t.RootPositions = &pos
}
accounts := topology.Accounts()
t.Accounts = make(map[string]string, accounts.Len())
for idx, l := 0, accounts.Len(); idx < l; idx++ {
account := accounts.At(idx)
t.Accounts[account.Username()] = account.Password()
}
return t
}
示例5: ProposerFromData
func ProposerFromData(pm *ProposerManager, txnId *common.TxnId, data []byte) *Proposer {
seg, _, err := capn.ReadFromMemoryZeroCopy(data)
if err != nil {
log.Println("Unable to decode proposer state", data)
}
// If we were on disk, then that means we must be locally complete
// and just need to send out TLCs.
state := msgs.ReadRootProposerState(seg)
acceptorsCap := state.Acceptors()
acceptors := make([]common.RMId, acceptorsCap.Len())
for idx := range acceptors {
acceptors[idx] = common.RMId(acceptorsCap.At(idx))
}
// We were on disk. Thus we received outcomes from all
// acceptors. So we don't need to worry about the outcome
// accumulator's fInc, hence just use -1 here.
p := &Proposer{
proposerManager: pm,
mode: proposerTLCSender,
txnId: txnId,
acceptors: acceptors,
fInc: -1,
}
p.init()
p.allAcceptorsAgreed = true
return p
}
示例6: start
func (pab *proposerAwaitBallots) start() {
pab.txn.Start(true)
pab.submitter = common.RMId(pab.txn.TxnCap.Submitter())
pab.submitterBootCount = pab.txn.TxnCap.SubmitterBootCount()
if pab.txn.Retry {
pab.proposerManager.ConnectionManager.AddSender(pab)
}
}
示例7: AllocForRMId
func AllocForRMId(txn *msgs.Txn, rmId common.RMId) *msgs.Allocation {
allocs := txn.Allocations()
for idx, l := 0, allocs.Len(); idx < l; idx++ {
alloc := allocs.At(idx)
if common.RMId(alloc.RmId()) == rmId {
return &alloc
}
}
return nil
}
示例8: GetAcceptorsFromTxn
func GetAcceptorsFromTxn(txnCap *msgs.Txn) common.RMIds {
fInc := int(txnCap.FInc())
twoFInc := fInc + fInc - 1
acceptors := make([]common.RMId, twoFInc)
allocations := txnCap.Allocations()
idx := 0
for l := allocations.Len(); idx < l && idx < twoFInc; idx++ {
alloc := allocations.At(idx)
acceptors[idx] = common.RMId(alloc.RmId())
}
// Danger! For the initial topology txns, there are _not_ twoFInc acceptors
return acceptors[:idx]
}
示例9: OneBTxnVotesReceived
// from network
func (pm *ProposerManager) OneBTxnVotesReceived(sender common.RMId, txnId *common.TxnId, oneBTxnVotes *msgs.OneBTxnVotes) {
server.Log(txnId, "1B received from", sender, "; instance:", common.RMId(oneBTxnVotes.RmId()))
instId := instanceIdPrefix([instanceIdPrefixLen]byte{})
instIdSlice := instId[:]
copy(instIdSlice, txnId[:])
binary.BigEndian.PutUint32(instIdSlice[common.KeyLen:], oneBTxnVotes.RmId())
if prop, found := pm.proposals[instId]; found {
prop.OneBTxnVotesReceived(sender, oneBTxnVotes)
}
// If not found, it should be safe to ignore - it's just a delayed
// 1B that we clearly don't need to complete the paxos instances
// anyway.
}
示例10: String
func (id *outcomeEqualId) String() string {
idList := (*msgs.Outcome)(id).Id()
buf := "OutcomeId["
for idx, l := 0, idList.Len(); idx < l; idx++ {
outId := idList.At(idx)
buf += fmt.Sprintf("%v{", common.MakeVarUUId(outId.VarId()))
instList := outId.AcceptedInstances()
for idy, m := 0, instList.Len(); idy < m; idy++ {
inst := instList.At(idy)
buf += fmt.Sprintf("(instance %v: vote %v)", common.RMId(inst.RmId()), inst.Vote())
}
buf += "} "
}
buf += "]"
return buf
}
示例11: start
func (cash *connectionAwaitServerHandshake) start() (bool, error) {
seg := capn.NewBuffer(nil)
hello := msgs.NewRootHelloFromClient(seg)
hello.SetUsername(cash.username)
hello.SetPassword(cash.password)
cash.username = ""
cash.password = nil
buf := new(bytes.Buffer)
if _, err := seg.WriteTo(buf); err != nil {
return false, err
}
if err := cash.send(buf.Bytes()); err != nil {
return false, err
}
if seg, err := cash.readAndDecryptOne(); err == nil {
server := msgs.ReadRootHelloFromServer(seg)
root := server.Root()
if len(root.Id()) != common.KeyLen {
return false, fmt.Errorf("Root object VarUUId is of wrong length!")
}
cash.lock.Lock()
cash.rootVUUId = common.MakeVarUUId(root.Id())
cash.namespace = make([]byte, common.KeyLen)
copy(cash.namespace[8:], server.Namespace())
cash.serverHost = server.LocalHost()
cash.rmId = common.RMId(binary.BigEndian.Uint32(cash.namespace[16:20]))
cash.lock.Unlock()
cash.nextState()
return false, nil
} else {
return false, err
}
}
示例12: String
func (rn paxosNumber) String() string {
top := uint32(rn >> 32)
rmId := common.RMId(uint32(rn))
return fmt.Sprintf("%v|%v", top, rmId)
}
示例13: TestMain
func TestMain(m *testing.M) {
hashcodes = []common.RMId{
common.RMId(1), common.RMId(2), common.RMId(3), common.RMId(4), common.RMId(5), common.RMId(6), common.RMId(7), common.RMId(8),
common.RMId(9), common.RMId(10), common.RMId(11), common.RMId(12), common.RMId(13), common.RMId(14), common.RMId(15), common.RMId(16),
common.RMId(17), common.RMId(18), common.RMId(19), common.RMId(20), common.RMId(21), common.RMId(22), common.RMId(23), common.RMId(24),
common.RMId(25), common.RMId(26), common.RMId(27), common.RMId(28), common.RMId(29), common.RMId(30), common.RMId(31), common.RMId(32),
}
randomPositions = make([][]uint8, positionsCount)
for idx := range randomPositions {
positions := make([]uint8, len(hashcodes))
randomPositions[idx] = positions
for idy := range positions {
if idy == 0 {
positions[idy] = uint8(idy)
} else {
positions[idy] = uint8(rand.Intn(idy))
}
}
}
os.Exit(m.Run())
}
示例14: TwoBTxnVotesReceived
// from network
func (pm *ProposerManager) TwoBTxnVotesReceived(sender common.RMId, txnId *common.TxnId, twoBTxnVotes *msgs.TwoBTxnVotes) {
instId := instanceIdPrefix([instanceIdPrefixLen]byte{})
instIdSlice := instId[:]
copy(instIdSlice, txnId[:])
switch twoBTxnVotes.Which() {
case msgs.TWOBTXNVOTES_FAILURES:
failures := twoBTxnVotes.Failures()
server.Log(txnId, "2B received from", sender, "; instance:", common.RMId(failures.RmId()))
binary.BigEndian.PutUint32(instIdSlice[common.KeyLen:], failures.RmId())
if prop, found := pm.proposals[instId]; found {
prop.TwoBFailuresReceived(sender, &failures)
}
case msgs.TWOBTXNVOTES_OUTCOME:
binary.BigEndian.PutUint32(instIdSlice[common.KeyLen:], uint32(pm.RMId))
outcome := twoBTxnVotes.Outcome()
if proposer, found := pm.proposers[*txnId]; found {
server.Log(txnId, "2B outcome received from", sender, "(known active)")
proposer.BallotOutcomeReceived(sender, &outcome)
return
}
txnCap := outcome.Txn()
alloc := AllocForRMId(&txnCap, pm.RMId)
if alloc.Active() != 0 {
// We have no record of this, but we were active - we must
// have died and recovered (or we may have never received
// this yet - see above - if we were down, other proposers
// may have started abort proposers). Thus this could be
// abort (abort proposers out there) or commit (we previously
// voted, and that vote got recorded, but we have since died
// and restarted).
server.Log(txnId, "2B outcome received from", sender, "(unknown active)")
// There's a possibility the acceptor that sent us this 2B is
// one of only a few acceptors that got enough 2As to
// determine the outcome. We must set up new paxos instances
// to ensure the result is propogated to all. All we need to
// do is to start a proposal for our own vars. The proposal
// itself will detect any further absences and take care of
// them.
acceptors := GetAcceptorsFromTxn(&txnCap)
server.Log(txnId, "Starting abort proposals with acceptors", acceptors)
fInc := int(txnCap.FInc())
ballots := MakeAbortBallots(&txnCap, alloc)
pm.NewPaxosProposals(txnId, &txnCap, fInc, ballots, acceptors, pm.RMId, false)
proposer := NewProposer(pm, txnId, &txnCap, ProposerActiveLearner)
pm.proposers[*txnId] = proposer
proposer.Start()
proposer.BallotOutcomeReceived(sender, &outcome)
} else {
// Not active, so we are a learner
if outcome.Which() == msgs.OUTCOME_COMMIT {
server.Log(txnId, "2B outcome received from", sender, "(unknown learner)")
// we must be a learner.
proposer := NewProposer(pm, txnId, &txnCap, ProposerPassiveLearner)
pm.proposers[*txnId] = proposer
proposer.Start()
proposer.BallotOutcomeReceived(sender, &outcome)
} else {
// Whilst it's an abort now, at some point in the past it
// was a commit and as such we received that
// outcome. However, we must have since died and so lost
// that state/proposer. We should now immediately reply
// with a TLC.
server.Log(txnId, "Sending immediate TLC for unknown abort learner")
NewOneShotSender(MakeTxnLocallyCompleteMsg(txnId), pm.ConnectionManager, sender)
}
}
default:
panic(fmt.Sprintf("Unexpected 2BVotes type: %v", twoBTxnVotes.Which()))
}
}