Skip to content

Commit 3e6eede

Browse files
authored
[client] Fix elapsed time calculation when machine is in sleep mode (#4140)
1 parent a76c8ea commit 3e6eede

File tree

15 files changed

+62
-42
lines changed

15 files changed

+62
-42
lines changed

client/iface/bind/activity.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ func NewActivityRecorder() *ActivityRecorder {
3434
}
3535

3636
// GetLastActivities returns a snapshot of peer last activity
37-
func (r *ActivityRecorder) GetLastActivities() map[string]time.Time {
37+
func (r *ActivityRecorder) GetLastActivities() map[string]monotime.Time {
3838
r.mu.RLock()
3939
defer r.mu.RUnlock()
4040

41-
activities := make(map[string]time.Time, len(r.peers))
41+
activities := make(map[string]monotime.Time, len(r.peers))
4242
for key, record := range r.peers {
43-
unixNano := record.LastActivity.Load()
44-
activities[key] = time.Unix(0, unixNano)
43+
monoTime := record.LastActivity.Load()
44+
activities[key] = monotime.Time(monoTime)
4545
}
4646
return activities
4747
}
@@ -51,18 +51,20 @@ func (r *ActivityRecorder) UpsertAddress(publicKey string, address netip.AddrPor
5151
r.mu.Lock()
5252
defer r.mu.Unlock()
5353

54-
if pr, exists := r.peers[publicKey]; exists {
55-
delete(r.addrToPeer, pr.Address)
56-
pr.Address = address
54+
var record *PeerRecord
55+
record, exists := r.peers[publicKey]
56+
if exists {
57+
delete(r.addrToPeer, record.Address)
58+
record.Address = address
5759
} else {
58-
record := &PeerRecord{
60+
record = &PeerRecord{
5961
Address: address,
6062
}
61-
record.LastActivity.Store(monotime.Now())
63+
record.LastActivity.Store(int64(monotime.Now()))
6264
r.peers[publicKey] = record
6365
}
6466

65-
r.addrToPeer[address] = r.peers[publicKey]
67+
r.addrToPeer[address] = record
6668
}
6769

6870
func (r *ActivityRecorder) Remove(publicKey string) {
@@ -84,7 +86,7 @@ func (r *ActivityRecorder) record(address netip.AddrPort) {
8486
return
8587
}
8688

87-
now := monotime.Now()
89+
now := int64(monotime.Now())
8890
last := record.LastActivity.Load()
8991
if now-last < saveFrequency {
9092
return

client/iface/bind/activity_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"net/netip"
55
"testing"
66
"time"
7+
8+
"github.com/netbirdio/netbird/monotime"
79
)
810

911
func TestActivityRecorder_GetLastActivities(t *testing.T) {
@@ -17,11 +19,7 @@ func TestActivityRecorder_GetLastActivities(t *testing.T) {
1719
t.Fatalf("Expected activity for peer %s, but got none", peer)
1820
}
1921

20-
if p.IsZero() {
21-
t.Fatalf("Expected activity for peer %s, but got zero", peer)
22-
}
23-
24-
if p.Before(time.Now().Add(-2 * time.Minute)) {
22+
if monotime.Since(p) > 5*time.Second {
2523
t.Fatalf("Expected activity for peer %s to be recent, but got %v", peer, p)
2624
}
2725
}

client/iface/configurer/kernel_unix.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
log "github.com/sirupsen/logrus"
1212
"golang.zx2c4.com/wireguard/wgctrl"
1313
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
14+
15+
"github.com/netbirdio/netbird/monotime"
1416
)
1517

1618
var zeroKey wgtypes.Key
@@ -277,6 +279,6 @@ func (c *KernelConfigurer) GetStats() (map[string]WGStats, error) {
277279
return stats, nil
278280
}
279281

280-
func (c *KernelConfigurer) LastActivities() map[string]time.Time {
282+
func (c *KernelConfigurer) LastActivities() map[string]monotime.Time {
281283
return nil
282284
}

client/iface/configurer/usp.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
1818

1919
"github.com/netbirdio/netbird/client/iface/bind"
20+
"github.com/netbirdio/netbird/monotime"
2021
nbnet "github.com/netbirdio/netbird/util/net"
2122
)
2223

@@ -223,7 +224,7 @@ func (c *WGUSPConfigurer) FullStats() (*Stats, error) {
223224
return parseStatus(c.deviceName, ipcStr)
224225
}
225226

226-
func (c *WGUSPConfigurer) LastActivities() map[string]time.Time {
227+
func (c *WGUSPConfigurer) LastActivities() map[string]monotime.Time {
227228
return c.activityRecorder.GetLastActivities()
228229
}
229230

client/iface/device/interface.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
99

1010
"github.com/netbirdio/netbird/client/iface/configurer"
11+
"github.com/netbirdio/netbird/monotime"
1112
)
1213

1314
type WGConfigurer interface {
@@ -19,5 +20,5 @@ type WGConfigurer interface {
1920
Close()
2021
GetStats() (map[string]configurer.WGStats, error)
2122
FullStats() (*configurer.Stats, error)
22-
LastActivities() map[string]time.Time
23+
LastActivities() map[string]monotime.Time
2324
}

client/iface/iface.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/netbirdio/netbird/client/iface/device"
2222
"github.com/netbirdio/netbird/client/iface/wgaddr"
2323
"github.com/netbirdio/netbird/client/iface/wgproxy"
24+
"github.com/netbirdio/netbird/monotime"
2425
)
2526

2627
const (
@@ -237,7 +238,7 @@ func (w *WGIface) GetStats() (map[string]configurer.WGStats, error) {
237238
return w.configurer.GetStats()
238239
}
239240

240-
func (w *WGIface) LastActivities() map[string]time.Time {
241+
func (w *WGIface) LastActivities() map[string]monotime.Time {
241242
w.mu.Lock()
242243
defer w.mu.Unlock()
243244

client/internal/conn_mgr.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,6 @@ func (e *ConnMgr) ActivatePeer(ctx context.Context, conn *peer.Conn) {
226226
}
227227

228228
if found := e.lazyConnMgr.ActivatePeer(conn.GetKey()); found {
229-
conn.Log.Infof("activated peer from inactive state")
230229
if err := conn.Open(ctx); err != nil {
231230
conn.Log.Errorf("failed to open connection: %v", err)
232231
}

client/internal/engine_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import (
5252
"github.com/netbirdio/netbird/management/server/store"
5353
"github.com/netbirdio/netbird/management/server/telemetry"
5454
"github.com/netbirdio/netbird/management/server/types"
55+
"github.com/netbirdio/netbird/monotime"
5556
relayClient "github.com/netbirdio/netbird/relay/client"
5657
"github.com/netbirdio/netbird/route"
5758
signal "github.com/netbirdio/netbird/signal/client"
@@ -96,7 +97,7 @@ type MockWGIface struct {
9697
GetInterfaceGUIDStringFunc func() (string, error)
9798
GetProxyFunc func() wgproxy.Proxy
9899
GetNetFunc func() *netstack.Net
99-
LastActivitiesFunc func() map[string]time.Time
100+
LastActivitiesFunc func() map[string]monotime.Time
100101
}
101102

102103
func (m *MockWGIface) FullStats() (*configurer.Stats, error) {
@@ -187,7 +188,7 @@ func (m *MockWGIface) GetNet() *netstack.Net {
187188
return m.GetNetFunc()
188189
}
189190

190-
func (m *MockWGIface) LastActivities() map[string]time.Time {
191+
func (m *MockWGIface) LastActivities() map[string]monotime.Time {
191192
if m.LastActivitiesFunc != nil {
192193
return m.LastActivitiesFunc()
193194
}

client/internal/iface_common.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/netbirdio/netbird/client/iface/device"
1515
"github.com/netbirdio/netbird/client/iface/wgaddr"
1616
"github.com/netbirdio/netbird/client/iface/wgproxy"
17+
"github.com/netbirdio/netbird/monotime"
1718
)
1819

1920
type wgIfaceBase interface {
@@ -38,5 +39,5 @@ type wgIfaceBase interface {
3839
GetStats() (map[string]configurer.WGStats, error)
3940
GetNet() *netstack.Net
4041
FullStats() (*configurer.Stats, error)
41-
LastActivities() map[string]time.Time
42+
LastActivities() map[string]monotime.Time
4243
}

client/internal/lazyconn/activity/listener.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (d *Listener) ReadPackets() {
4848
n, remoteAddr, err := d.conn.ReadFromUDP(make([]byte, 1))
4949
if err != nil {
5050
if d.isClosed.Load() {
51-
d.peerCfg.Log.Debugf("exit from activity listener")
51+
d.peerCfg.Log.Infof("exit from activity listener")
5252
} else {
5353
d.peerCfg.Log.Errorf("failed to read from activity listener: %s", err)
5454
}
@@ -59,9 +59,11 @@ func (d *Listener) ReadPackets() {
5959
d.peerCfg.Log.Warnf("received %d bytes from %s, too short", n, remoteAddr)
6060
continue
6161
}
62+
d.peerCfg.Log.Infof("activity detected")
6263
break
6364
}
6465

66+
d.peerCfg.Log.Debugf("removing lazy endpoint: %s", d.endpoint.String())
6567
if err := d.removeEndpoint(); err != nil {
6668
d.peerCfg.Log.Errorf("failed to remove endpoint: %s", err)
6769
}
@@ -71,7 +73,7 @@ func (d *Listener) ReadPackets() {
7173
}
7274

7375
func (d *Listener) Close() {
74-
d.peerCfg.Log.Infof("closing listener: %s", d.conn.LocalAddr().String())
76+
d.peerCfg.Log.Infof("closing activity listener: %s", d.conn.LocalAddr().String())
7577
d.isClosed.Store(true)
7678

7779
if err := d.conn.Close(); err != nil {
@@ -81,7 +83,6 @@ func (d *Listener) Close() {
8183
}
8284

8385
func (d *Listener) removeEndpoint() error {
84-
d.peerCfg.Log.Debugf("removing lazy endpoint: %s", d.endpoint.String())
8586
return d.wgIface.RemovePeer(d.peerCfg.PublicKey)
8687
}
8788

0 commit comments

Comments
 (0)