mirror of
https://github.com/tailscale/tailscale.git
synced 2025-06-28 02:58:39 +00:00
only move
This commit is contained in:
parent
2a132cf5bd
commit
6cfb025714
@ -86,56 +86,6 @@ func (ipp *ConsensusIPPool) retryDomainLookup(from tailcfg.NodeID, addr netip.Ad
|
|||||||
return ipp.retryDomainLookup(from, addr, n+1)
|
return ipp.retryDomainLookup(from, addr, n+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
type markLastUsedArgs struct {
|
|
||||||
NodeID tailcfg.NodeID
|
|
||||||
Addr netip.Addr
|
|
||||||
Domain string
|
|
||||||
UpdatedAt time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
// executeMarkLastUsed parses a markLastUsed log entry and applies it.
|
|
||||||
func (ipp *ConsensusIPPool) executeMarkLastUsed(bs []byte) tsconsensus.CommandResult {
|
|
||||||
var args markLastUsedArgs
|
|
||||||
err := json.Unmarshal(bs, &args)
|
|
||||||
if err != nil {
|
|
||||||
return tsconsensus.CommandResult{Err: err}
|
|
||||||
}
|
|
||||||
err = ipp.applyMarkLastUsed(args.NodeID, args.Addr, args.Domain, args.UpdatedAt)
|
|
||||||
if err != nil {
|
|
||||||
return tsconsensus.CommandResult{Err: err}
|
|
||||||
}
|
|
||||||
return tsconsensus.CommandResult{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// applyMarkLastUsed applies the arguments from the log entry to the state. It updates an entry in the AddrToDomain
|
|
||||||
// map with a new LastUsed timestamp.
|
|
||||||
// applyMarkLastUsed is not safe for concurrent access. It's only called from raft which will
|
|
||||||
// not call it concurrently.
|
|
||||||
func (ipp *ConsensusIPPool) applyMarkLastUsed(from tailcfg.NodeID, addr netip.Addr, domain string, updatedAt time.Time) error {
|
|
||||||
ps, ok := ipp.perPeerMap.Load(from)
|
|
||||||
if !ok {
|
|
||||||
// There's nothing to mark. But this is unexpected, because we mark last used after we do things with peer state.
|
|
||||||
log.Printf("applyMarkLastUsed: could not find peer state, nodeID: %s", from)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ww, ok := ps.addrToDomain.Lookup(addr)
|
|
||||||
if !ok {
|
|
||||||
// The peer state didn't have an entry for the IP address (possibly it expired), so there's nothing to mark.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if ww.Domain != domain {
|
|
||||||
// The IP address expired and was reused for a new domain. Don't mark.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if ww.LastUsed.After(updatedAt) {
|
|
||||||
// This has been marked more recently. Don't mark.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ww.LastUsed = updatedAt
|
|
||||||
ps.addrToDomain.Insert(netip.PrefixFrom(addr, addr.BitLen()), ww)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartConsensus is part of the IPPool interface. It starts the raft background routines that handle consensus.
|
// StartConsensus is part of the IPPool interface. It starts the raft background routines that handle consensus.
|
||||||
func (ipp *ConsensusIPPool) StartConsensus(ctx context.Context, ts *tsnet.Server, clusterTag string) error {
|
func (ipp *ConsensusIPPool) StartConsensus(ctx context.Context, ts *tsnet.Server, clusterTag string) error {
|
||||||
cfg := tsconsensus.DefaultConfig()
|
cfg := tsconsensus.DefaultConfig()
|
||||||
@ -224,6 +174,56 @@ func (ipp *ConsensusIPPool) IPForDomain(nid tailcfg.NodeID, domain string) (neti
|
|||||||
return addr, err
|
return addr, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type markLastUsedArgs struct {
|
||||||
|
NodeID tailcfg.NodeID
|
||||||
|
Addr netip.Addr
|
||||||
|
Domain string
|
||||||
|
UpdatedAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
// executeMarkLastUsed parses a markLastUsed log entry and applies it.
|
||||||
|
func (ipp *ConsensusIPPool) executeMarkLastUsed(bs []byte) tsconsensus.CommandResult {
|
||||||
|
var args markLastUsedArgs
|
||||||
|
err := json.Unmarshal(bs, &args)
|
||||||
|
if err != nil {
|
||||||
|
return tsconsensus.CommandResult{Err: err}
|
||||||
|
}
|
||||||
|
err = ipp.applyMarkLastUsed(args.NodeID, args.Addr, args.Domain, args.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
return tsconsensus.CommandResult{Err: err}
|
||||||
|
}
|
||||||
|
return tsconsensus.CommandResult{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// applyMarkLastUsed applies the arguments from the log entry to the state. It updates an entry in the AddrToDomain
|
||||||
|
// map with a new LastUsed timestamp.
|
||||||
|
// applyMarkLastUsed is not safe for concurrent access. It's only called from raft which will
|
||||||
|
// not call it concurrently.
|
||||||
|
func (ipp *ConsensusIPPool) applyMarkLastUsed(from tailcfg.NodeID, addr netip.Addr, domain string, updatedAt time.Time) error {
|
||||||
|
ps, ok := ipp.perPeerMap.Load(from)
|
||||||
|
if !ok {
|
||||||
|
// There's nothing to mark. But this is unexpected, because we mark last used after we do things with peer state.
|
||||||
|
log.Printf("applyMarkLastUsed: could not find peer state, nodeID: %s", from)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ww, ok := ps.addrToDomain.Lookup(addr)
|
||||||
|
if !ok {
|
||||||
|
// The peer state didn't have an entry for the IP address (possibly it expired), so there's nothing to mark.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if ww.Domain != domain {
|
||||||
|
// The IP address expired and was reused for a new domain. Don't mark.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if ww.LastUsed.After(updatedAt) {
|
||||||
|
// This has been marked more recently. Don't mark.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ww.LastUsed = updatedAt
|
||||||
|
ps.addrToDomain.Insert(netip.PrefixFrom(addr, addr.BitLen()), ww)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// markLastUsed executes a markLastUsed command on the leader with raft.
|
// markLastUsed executes a markLastUsed command on the leader with raft.
|
||||||
func (ipp *ConsensusIPPool) markLastUsed(nid tailcfg.NodeID, addr netip.Addr, domain string, lastUsed time.Time) error {
|
func (ipp *ConsensusIPPool) markLastUsed(nid tailcfg.NodeID, addr netip.Addr, domain string, lastUsed time.Time) error {
|
||||||
args := markLastUsedArgs{
|
args := markLastUsedArgs{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user