mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-22 21:08:38 +00:00
control/controlclient: fix panic regression from earlier load balancer hint header
In the recent 20e9f3369 we made HealthChangeRequest machine requests include a NodeKey, as it was the oddball machine request that didn't include one. Unfortunately, that code was sometimes being called (at least in some of our integration tests) without a node key due to its registration with health.RegisterWatcher(direct.ReportHealthChange). Fortunately tests in corp caught this before we cut a release. It's possible this only affects this particular integration test's environment, but still worth fixing. Updates tailscale/corp#1297 Change-Id: I84046779955105763dc1be5121c69fec3c138672 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com> (cherry picked from commit 8444937c89eb08e41359da38921f90fcae823336)
This commit is contained in:
parent
f9cdd9d488
commit
7074c49db8
@ -1719,7 +1719,10 @@ func (c *Direct) ReportHealthChange(sys health.Subsystem, sysErr error) {
|
|||||||
// Don't report errors to control if the server doesn't support noise.
|
// Don't report errors to control if the server doesn't support noise.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
nodeKey := c.GetPersist().PublicNodeKey()
|
nodeKey, ok := c.GetPersist().PublicNodeKeyOK()
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
req := &tailcfg.HealthChangeRequest{
|
req := &tailcfg.HealthChangeRequest{
|
||||||
Subsys: string(sys),
|
Subsys: string(sys),
|
||||||
NodeKey: nodeKey,
|
NodeKey: nodeKey,
|
||||||
|
@ -51,11 +51,32 @@ func (p *Persist) PublicNodeKey() key.NodePublic {
|
|||||||
return p.PrivateNodeKey.Public()
|
return p.PrivateNodeKey.Public()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PublicNodeKeyOK returns the public key for the node key.
|
||||||
|
//
|
||||||
|
// Unlike PublicNodeKey, it returns ok=false if there is no node private key
|
||||||
|
// instead of panicking.
|
||||||
|
func (p *Persist) PublicNodeKeyOK() (pub key.NodePublic, ok bool) {
|
||||||
|
if p.PrivateNodeKey.IsZero() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return p.PrivateNodeKey.Public(), true
|
||||||
|
}
|
||||||
|
|
||||||
// PublicNodeKey returns the public key for the node key.
|
// PublicNodeKey returns the public key for the node key.
|
||||||
|
//
|
||||||
|
// It panics if there is no node private key. See PublicNodeKeyOK.
|
||||||
func (p PersistView) PublicNodeKey() key.NodePublic {
|
func (p PersistView) PublicNodeKey() key.NodePublic {
|
||||||
return p.ж.PublicNodeKey()
|
return p.ж.PublicNodeKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PublicNodeKeyOK returns the public key for the node key.
|
||||||
|
//
|
||||||
|
// Unlike PublicNodeKey, it returns ok=false if there is no node private key
|
||||||
|
// instead of panicking.
|
||||||
|
func (p PersistView) PublicNodeKeyOK() (_ key.NodePublic, ok bool) {
|
||||||
|
return p.ж.PublicNodeKeyOK()
|
||||||
|
}
|
||||||
|
|
||||||
func (p PersistView) Equals(p2 PersistView) bool {
|
func (p PersistView) Equals(p2 PersistView) bool {
|
||||||
return p.ж.Equals(p2.ж)
|
return p.ж.Equals(p2.ж)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user