-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisk_activity.go
More file actions
67 lines (54 loc) · 1.31 KB
/
disk_activity.go
File metadata and controls
67 lines (54 loc) · 1.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main
import (
"time"
"github.com/donomii/clusterF/types"
)
const diskActiveWindow = 10 * time.Minute
type diskMetricsSnapshot struct {
bytesStored int64
diskSize int64
diskFree int64
updatedAt time.Time
}
func (c *Cluster) RecordDiskActivity(level types.DiskActivityLevel) {
if level == types.DiskActivityEssential {
c.markDiskActive()
}
}
func (c *Cluster) CanRunNonEssentialDiskOp() bool {
return c.DiskIsActive()
}
func (c *Cluster) DiskIsActive() bool {
expiresAt := time.Unix(0, c.diskActiveUntil.Load())
return time.Now().Before(expiresAt)
}
func (c *Cluster) markDiskActive() {
now := time.Now()
newExpiry := now.Add(diskActiveWindow).UnixNano()
for {
current := c.diskActiveUntil.Load()
if current >= newExpiry {
return
}
if c.diskActiveUntil.CompareAndSwap(current, newExpiry) {
return
}
}
}
func (c *Cluster) recordDiskMetrics(bytesStored, diskSize, diskFree int64) {
snapshot := diskMetricsSnapshot{
bytesStored: bytesStored,
diskSize: diskSize,
diskFree: diskFree,
updatedAt: time.Now(),
}
c.lastDiskMetrics.Store(snapshot)
}
func (c *Cluster) loadDiskMetrics() diskMetricsSnapshot {
if value := c.lastDiskMetrics.Load(); value != nil {
if snapshot, ok := value.(diskMetricsSnapshot); ok {
return snapshot
}
}
return diskMetricsSnapshot{}
}