types/structs: add structs.Incomparable annotation, use it where applicable

Shotizam before and output queries:

sqlite> select sum(size) from bin where func like 'type..%';
129067
=>
120216
This commit is contained in:
Brad Fitzpatrick 2020-05-03 13:58:39 -07:00
parent 7b901fdbbc
commit fefd7e10dc
12 changed files with 49 additions and 5 deletions

View File

@ -22,6 +22,7 @@
"tailscale.com/tailcfg"
"tailscale.com/types/empty"
"tailscale.com/types/logger"
"tailscale.com/types/structs"
)
// TODO(apenwarr): eliminate the 'state' variable, as it's now obsolete.
@ -61,6 +62,7 @@ func (s state) String() string {
}
type Status struct {
_ structs.Incomparable
LoginFinished *empty.Message
Err string
URL string
@ -94,6 +96,7 @@ func (s Status) String() string {
}
type LoginGoal struct {
_ structs.Incomparable
wantLoggedIn bool // true if we *want* to be logged in
token *oauth2.Token // oauth token to use when logging in
flags LoginFlags // flags to use when logging in

View File

@ -13,7 +13,9 @@
func fieldsOf(t reflect.Type) (fields []string) {
for i := 0; i < t.NumField(); i++ {
fields = append(fields, t.Field(i).Name)
if name := t.Field(i).Name; name != "_" {
fields = append(fields, name)
}
}
return
}

View File

@ -30,10 +30,12 @@
"tailscale.com/net/tlsdial"
"tailscale.com/tailcfg"
"tailscale.com/types/logger"
"tailscale.com/types/structs"
"tailscale.com/version"
)
type Persist struct {
_ structs.Incomparable
PrivateMachineKey wgcfg.PrivateKey
PrivateNodeKey wgcfg.PrivateKey
OldPrivateNodeKey wgcfg.PrivateKey // needed to request key rotation

View File

@ -7,6 +7,8 @@
import (
"fmt"
"tailscale.com/types/structs"
)
// World is a set of DERP server.
@ -109,6 +111,8 @@ func init() {
// Server is configuration for a DERP server.
type Server struct {
_ structs.Incomparable
ID int
// HostHTTPS is the HTTPS hostname.

View File

@ -11,6 +11,7 @@
"tailscale.com/ipn/ipnstate"
"tailscale.com/tailcfg"
"tailscale.com/types/empty"
"tailscale.com/types/structs"
"tailscale.com/wgengine"
)
@ -46,6 +47,7 @@ type EngineStatus struct {
// that they have not changed.
// They are JSON-encoded on the wire, despite the lack of struct tags.
type Notify struct {
_ structs.Incomparable
Version string // version number of IPN backend
ErrMessage *string // critical error message, if any
LoginFinished *empty.Message // event: non-nil when login process succeeded

View File

@ -14,6 +14,7 @@
"time"
"tailscale.com/types/logger"
"tailscale.com/types/structs"
"tailscale.com/version"
)
@ -34,6 +35,7 @@ type FakeExpireAfterArgs struct {
// Command is a command message that is JSON encoded and sent by a
// frontend to a backend.
type Command struct {
_ structs.Incomparable
Version string
// Exactly one of the following must be non-nil.

View File

@ -7,9 +7,12 @@
import (
"sync"
"time"
"tailscale.com/types/structs"
)
type Bucket struct {
_ structs.Incomparable
mu sync.Mutex
FillInterval time.Duration
Burst int

View File

@ -17,6 +17,7 @@
"tailscale.com/net/dnscache"
"tailscale.com/stun"
"tailscale.com/types/structs"
)
// Stunner sends a STUN request to several servers and handles a response.
@ -86,6 +87,7 @@ func (s *Stunner) removeTX(tx stun.TxID) (request, bool) {
}
type request struct {
_ structs.Incomparable
sent time.Time
server string
}

View File

@ -15,6 +15,7 @@
"github.com/tailscale/wireguard-go/wgcfg"
"golang.org/x/oauth2"
"tailscale.com/types/opt"
"tailscale.com/types/structs"
)
type ID int64
@ -99,6 +100,7 @@ func (u *User) Clone() *User {
}
type Login struct {
_ structs.Incomparable
ID LoginID
Provider string
LoginName string
@ -253,6 +255,7 @@ func CheckTag(tag string) error {
)
type Service struct {
_ structs.Incomparable
Proto ServiceProto // TCP or UDP
Port uint16 // port number service is listening on
Description string // text description of service
@ -386,10 +389,12 @@ func (h *Hostinfo) Equal(h2 *Hostinfo) bool {
// using the local machine key, and sent to:
// https://login.tailscale.com/machine/<mkey hex>
type RegisterRequest struct {
_ structs.Incomparable
Version int // currently 1
NodeKey NodeKey
OldNodeKey NodeKey
Auth struct {
_ structs.Incomparable
// One of Provider/LoginName, Oauth2Token, or AuthKey is set.
Provider, LoginName string
Oauth2Token *oauth2.Token
@ -452,6 +457,7 @@ type PortRange struct {
// NetPortRange represents a single subnet:portrange.
type NetPortRange struct {
_ structs.Incomparable
IP string
Bits *int // backward compatibility: if missing, means "all" bits
Ports PortRange

View File

@ -157,13 +157,13 @@ func TestHostinfoEqual(t *testing.T) {
},
{
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
&Hostinfo{Services: []Service{Service{UDP, 2345, "bar"}}},
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
&Hostinfo{Services: []Service{Service{Proto: UDP, Port: 2345, Description: "bar"}}},
false,
},
{
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
&Hostinfo{Services: []Service{Service{TCP, 1234, "foo"}}},
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
&Hostinfo{Services: []Service{Service{Proto: TCP, Port: 1234, Description: "foo"}}},
true,
},
}

16
types/structs/structs.go Normal file
View File

@ -0,0 +1,16 @@
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package structs contains the Incomparable type.
package structs
// Incomparable is a zero-width incomparable type. If added as the
// first field in a struct, it marks that struct as not comparable
// (can't do == or be a map key) and usually doesn't add any width to
// the struct (unless the struct has only small fields).
//
// Be making a struct incomparable, you can prevent misuse (prevent
// people from using ==), but also you can shrink generated binaries,
// as the compiler can omit equality funcs from the binary.
type Incomparable [0]func()

View File

@ -43,6 +43,7 @@
"tailscale.com/tailcfg"
"tailscale.com/types/key"
"tailscale.com/types/logger"
"tailscale.com/types/structs"
"tailscale.com/version"
)
@ -1072,6 +1073,7 @@ func (c *Conn) findAddrSet(addr *net.UDPAddr) *AddrSet {
}
type udpReadResult struct {
_ structs.Incomparable
n int
err error
addr *net.UDPAddr