mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-08 15:41:15 +02:00
The master decodes a TTL per volume in every heartbeat and keeps it for the volume's lifetime, so a cluster using TTLs carries one two-byte object per volume replica where at most 256 counts times 7 units exist. Share them, and decode the uint32 form directly instead of staging it through a byte slice. Clusters that set no TTL are unaffected; that path already returned the shared EMPTY_TTL. BenchmarkSyncDataNodeRegistration/100000Volumes, volumes carrying a ttl 600600 allocs/op -> 500597 allocs/op
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package needle
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestTTLReadWrite(t *testing.T) {
|
|
ttl, _ := ReadTTL("")
|
|
if ttl.Minutes() != 0 {
|
|
t.Errorf("empty ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("9")
|
|
if ttl.Minutes() != 9 {
|
|
t.Errorf("9 ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("8m")
|
|
if ttl.Minutes() != 8 {
|
|
t.Errorf("8m ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("5h")
|
|
if ttl.Minutes() != 300 {
|
|
t.Errorf("5h ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("5d")
|
|
if ttl.Minutes() != 5*24*60 {
|
|
t.Errorf("5d ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("50d")
|
|
if ttl.Minutes() != 50*24*60 {
|
|
t.Errorf("50d ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("365d")
|
|
if ttl.Minutes() != 365*24*60 {
|
|
t.Errorf("365d ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("730d")
|
|
if ttl.Minutes() != 730*24*60 {
|
|
t.Errorf("730d ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("5w")
|
|
if ttl.Minutes() != 5*7*24*60 {
|
|
t.Errorf("5w ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("5M")
|
|
if ttl.Minutes() != 5*30*24*60 {
|
|
t.Errorf("5M ttl:%v", ttl)
|
|
}
|
|
|
|
ttl, _ = ReadTTL("5y")
|
|
if ttl.Minutes() != 5*365*24*60 {
|
|
t.Errorf("5y ttl:%v", ttl)
|
|
}
|
|
|
|
output := make([]byte, 2)
|
|
ttl.ToBytes(output)
|
|
ttl2 := LoadTTLFromBytes(output)
|
|
if ttl.Minutes() != ttl2.Minutes() {
|
|
t.Errorf("ttl:%v ttl2:%v", ttl, ttl2)
|
|
}
|
|
|
|
ttl3 := LoadTTLFromUint32(ttl.ToUint32())
|
|
if ttl.Minutes() != ttl3.Minutes() {
|
|
t.Errorf("ttl:%v ttl3:%v", ttl, ttl3)
|
|
}
|
|
|
|
}
|
|
|
|
func TestLoadTTLIsInterned(t *testing.T) {
|
|
for count := 0; count < 256; count++ {
|
|
for unit := 0; unit < 256; unit++ {
|
|
got := LoadTTLFromBytes([]byte{byte(count), byte(unit)})
|
|
if got.Count != byte(count) || got.Unit != byte(unit) {
|
|
if count == 0 && unit == 0 {
|
|
continue
|
|
}
|
|
t.Fatalf("count %d unit %d: got %+v", count, unit, got)
|
|
}
|
|
if fromUint32 := LoadTTLFromUint32(got.ToUint32()); count != 0 && *fromUint32 != *got {
|
|
t.Fatalf("count %d unit %d: uint32 round trip gave %+v", count, unit, fromUint32)
|
|
}
|
|
}
|
|
}
|
|
if LoadTTLFromBytes([]byte{3, Day}) != LoadTTLFromBytes([]byte{3, Day}) {
|
|
t.Error("expected repeated loads of the same stored ttl to share one value")
|
|
}
|
|
if LoadTTLFromBytes([]byte{0, 0}) != EMPTY_TTL {
|
|
t.Error("expected a zero ttl to stay EMPTY_TTL")
|
|
}
|
|
}
|