github.com/qiniu/go-sdk/v7@v7.27.0/internal/freezer/freezer.go (about) 1 package freezer 2 3 import ( 4 "sync" 5 "time" 6 ) 7 8 type Freezer interface { 9 Available(itemId string) bool 10 Freeze(itemId string, duration time.Duration) error 11 Unfreeze(itemId string) error 12 } 13 14 func New() Freezer { 15 return &freezer{ 16 freezerItems: &sync.Map{}, 17 } 18 } 19 20 type freezer struct { 21 freezerItems *sync.Map 22 } 23 24 func (i *freezer) Available(itemId string) bool { 25 unfreezeTime, ok := i.freezerItems.Load(itemId) 26 if !ok { 27 return true 28 } 29 30 unfreezeTimeInt64, ok := unfreezeTime.(int64) 31 if !ok { 32 return false 33 } 34 35 timestamp := time.Now().Unix() 36 return timestamp > unfreezeTimeInt64 37 } 38 39 func (i *freezer) Freeze(itemId string, duration time.Duration) error { 40 timestamp := time.Now().Unix() 41 i.freezerItems.Store(itemId, timestamp+int64(duration/time.Second)) 42 return nil 43 } 44 45 func (i *freezer) Unfreeze(itemId string) error { 46 i.freezerItems.Delete(itemId) 47 return nil 48 }