cmd/tailscale, wgengine, tailcfg: don't assume LastSeen is present [mapver 20]

Updates #2107

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
crawshaw/magicdnsalways
Brad Fitzpatrick 3 years ago
parent 8b2b899989
commit 80a4052593

@ -97,14 +97,12 @@ func runCp(ctx context.Context, args []string) error {
return err return err
} }
peerAPIBase, lastSeen, isOffline, err := discoverPeerAPIBase(ctx, ip) peerAPIBase, isOffline, err := discoverPeerAPIBase(ctx, ip)
if err != nil { if err != nil {
return fmt.Errorf("can't send to %s: %v", target, err) return fmt.Errorf("can't send to %s: %v", target, err)
} }
if isOffline { if isOffline {
fmt.Fprintf(os.Stderr, "# warning: %s is offline\n", target) fmt.Fprintf(os.Stderr, "# warning: %s is offline\n", target)
} else if !lastSeen.IsZero() && time.Since(lastSeen) > lastSeenOld {
fmt.Fprintf(os.Stderr, "# warning: %s last seen %v ago\n", target, time.Since(lastSeen).Round(time.Minute))
} }
if len(files) > 1 { if len(files) > 1 {
@ -182,14 +180,14 @@ func runCp(ctx context.Context, args []string) error {
return nil return nil
} }
func discoverPeerAPIBase(ctx context.Context, ipStr string) (base string, lastSeen time.Time, isOffline bool, err error) { func discoverPeerAPIBase(ctx context.Context, ipStr string) (base string, isOffline bool, err error) {
ip, err := netaddr.ParseIP(ipStr) ip, err := netaddr.ParseIP(ipStr)
if err != nil { if err != nil {
return "", time.Time{}, false, err return "", false, err
} }
fts, err := tailscale.FileTargets(ctx) fts, err := tailscale.FileTargets(ctx)
if err != nil { if err != nil {
return "", time.Time{}, false, err return "", false, err
} }
for _, ft := range fts { for _, ft := range fts {
n := ft.Node n := ft.Node
@ -197,14 +195,11 @@ func discoverPeerAPIBase(ctx context.Context, ipStr string) (base string, lastSe
if a.IP() != ip { if a.IP() != ip {
continue continue
} }
if n.LastSeen != nil {
lastSeen = *n.LastSeen
}
isOffline = n.Online != nil && !*n.Online isOffline = n.Online != nil && !*n.Online
return ft.PeerAPIURL, lastSeen, isOffline, nil return ft.PeerAPIURL, isOffline, nil
} }
} }
return "", time.Time{}, false, fileTargetErrorDetail(ctx, ip) return "", false, fileTargetErrorDetail(ctx, ip)
} }
// fileTargetErrorDetail returns a non-nil error saying why ip is an // fileTargetErrorDetail returns a non-nil error saying why ip is an
@ -274,8 +269,6 @@ func (r *slowReader) Read(p []byte) (n int, err error) {
return return
} }
const lastSeenOld = 20 * time.Minute
func runCpTargets(ctx context.Context, args []string) error { func runCpTargets(ctx context.Context, args []string) error {
if len(args) > 0 { if len(args) > 0 {
return errors.New("invalid arguments with --targets") return errors.New("invalid arguments with --targets")

@ -42,7 +42,8 @@ import (
// 17: 2021-04-18: MapResponse.Domain empty means unchanged // 17: 2021-04-18: MapResponse.Domain empty means unchanged
// 18: 2021-04-19: MapResponse.Node nil means unchanged (all fields now omitempty) // 18: 2021-04-19: MapResponse.Node nil means unchanged (all fields now omitempty)
// 19: 2021-04-21: MapResponse.Debug.SleepSeconds // 19: 2021-04-21: MapResponse.Debug.SleepSeconds
const CurrentMapRequestVersion = 19 // 20: 2021-06-11: MapResponse.LastSeen used even less (https://github.com/tailscale/tailscale/issues/2107)
const CurrentMapRequestVersion = 20
type StableID string type StableID string

@ -5,6 +5,7 @@
package wgengine package wgengine
import ( import (
"fmt"
"os" "os"
"runtime" "runtime"
"strconv" "strconv"
@ -173,10 +174,6 @@ func (e *userspaceEngine) onOpenTimeout(flow flowtrack.Tuple) {
e.logf("open-conn-track: timeout opening %v; peer node %v not connected to any DERP relay", flow, n.Key.ShortString()) e.logf("open-conn-track: timeout opening %v; peer node %v not connected to any DERP relay", flow, n.Key.ShortString())
return return
} }
var lastSeen time.Time
if n.LastSeen != nil {
lastSeen = *n.LastSeen
}
var ps *ipnstate.PeerStatusLite var ps *ipnstate.PeerStatusLite
if st, err := e.getStatus(); err == nil { if st, err := e.getStatus(); err == nil {
@ -228,9 +225,11 @@ func (e *userspaceEngine) onOpenTimeout(flow flowtrack.Tuple) {
online = "no" online = "no"
} }
} }
e.logf("open-conn-track: timeout opening %v to node %v; lastSeen=%v, online=%v, lastRecv=%v", if n.LastSeen != nil && online != "yes" {
online += fmt.Sprintf(", lastseen=%v", durFmt(*n.LastSeen))
}
e.logf("open-conn-track: timeout opening %v to node %v; online=%v, lastRecv=%v",
flow, n.Key.ShortString(), flow, n.Key.ShortString(),
durFmt(lastSeen),
online, online,
durFmt(e.magicConn.LastRecvActivityOfDisco(n.DiscoKey))) durFmt(e.magicConn.LastRecvActivityOfDisco(n.DiscoKey)))
} }

Loading…
Cancel
Save