diff --git a/weed/storage/needle/volume_ttl.go b/weed/storage/needle/volume_ttl.go index 0561b736f..104efd2c4 100644 --- a/weed/storage/needle/volume_ttl.go +++ b/weed/storage/needle/volume_ttl.go @@ -44,7 +44,48 @@ func ReadTTL(ttlString string) (*TTL, error) { } count, err := strconv.Atoi(string(countBytes)) unit := toStoredByte(unitByte) - return &TTL{Count: byte(count), Unit: unit}, err + return fitTtlCount(count, unit), err +} + +func fitTtlCount(count int, unit byte) *TTL { + seconds := ToSeconds(count, unit) + if seconds == 0 { + return EMPTY_TTL + } + if seconds%(3600*24*365) == 0 && seconds/(3600*24*365) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 365)), Unit: Year} + } + if seconds%(3600*24*30) == 0 && seconds/(3600*24*30) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 30)), Unit: Month} + } + if seconds%(3600*24*7) == 0 && seconds/(3600*24*7) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 7)), Unit: Week} + } + if seconds%(3600*24) == 0 && seconds/(3600*24) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24)), Unit: Day} + } + if seconds%(3600) == 0 && seconds/(3600) < 256 { + return &TTL{Count: byte(seconds / (3600)), Unit: Hour} + } + if seconds/60 < 256 { + return &TTL{Count: byte(seconds / 60), Unit: Minute} + } + if seconds/(3600) < 256 { + return &TTL{Count: byte(seconds / (3600)), Unit: Hour} + } + if seconds/(3600*24) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24)), Unit: Day} + } + if seconds/(3600*24*7) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 7)), Unit: Week} + } + if seconds/(3600*24*30) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 30)), Unit: Month} + } + if seconds/(3600*24*365) < 256 { + return &TTL{Count: byte(seconds / (3600 * 24 * 365)), Unit: Year} + } + return EMPTY_TTL } // read stored bytes to a ttl @@ -104,21 +145,25 @@ func (t *TTL) String() string { } func (t *TTL) ToSeconds() uint64 { - switch t.Unit { + return ToSeconds(int(t.Count), t.Unit) +} + +func ToSeconds(count int, unit byte) uint64 { + switch unit { case Empty: return 0 case Minute: - return uint64(t.Count) * 60 + return uint64(count) * 60 case Hour: - return uint64(t.Count) * 60 * 60 + return uint64(count) * 60 * 60 case Day: - return uint64(t.Count) * 60 * 24 * 60 + return uint64(count) * 60 * 24 * 60 case Week: - return uint64(t.Count) * 60 * 24 * 7 * 60 + return uint64(count) * 60 * 24 * 7 * 60 case Month: - return uint64(t.Count) * 60 * 24 * 30 * 60 + return uint64(count) * 60 * 24 * 30 * 60 case Year: - return uint64(t.Count) * 60 * 24 * 365 * 60 + return uint64(count) * 60 * 24 * 365 * 60 } return 0 } diff --git a/weed/storage/needle/volume_ttl_test.go b/weed/storage/needle/volume_ttl_test.go index 150d06e6e..bfa97924c 100644 --- a/weed/storage/needle/volume_ttl_test.go +++ b/weed/storage/needle/volume_ttl_test.go @@ -35,6 +35,16 @@ func TestTTLReadWrite(t *testing.T) { 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)