github.com/0chain/gosdk@v1.17.11/zboxcore/sdk/playlist_consensus.go (about) 1 package sdk 2 3 import ( 4 "encoding/json" 5 "sort" 6 "sync" 7 ) 8 9 type playlistConsensus struct { 10 files map[string]PlaylistFile 11 consensuses map[string]*Consensus 12 13 threshConsensus int 14 fullConsensus int 15 } 16 17 func createPlaylistConsensus(fullConsensus, threshConsensus int) *playlistConsensus { 18 return &playlistConsensus{ 19 files: make(map[string]PlaylistFile), 20 consensuses: make(map[string]*Consensus), 21 threshConsensus: threshConsensus, 22 fullConsensus: fullConsensus, 23 } 24 } 25 26 func (c *playlistConsensus) AddFile(body []byte) error { 27 file := PlaylistFile{} 28 29 if err := json.Unmarshal([]byte(body), &file); err != nil { 30 return err 31 } 32 33 _, ok := c.files[file.LookupHash] 34 35 if ok { 36 c.consensuses[file.LookupHash].Done() 37 } else { 38 cons := &Consensus{RWMutex: &sync.RWMutex{}} 39 40 cons.Init(c.threshConsensus, c.fullConsensus) 41 cons.Done() 42 43 c.consensuses[file.LookupHash] = cons 44 c.files[file.LookupHash] = file 45 } 46 47 return nil 48 } 49 50 func (c *playlistConsensus) AddFiles(body []byte) error { 51 var files []PlaylistFile 52 53 if err := json.Unmarshal([]byte(body), &files); err != nil { 54 return err 55 } 56 57 for _, f := range files { 58 _, ok := c.files[f.LookupHash] 59 60 if ok { 61 c.consensuses[f.LookupHash].Done() 62 } else { 63 cons := &Consensus{RWMutex: &sync.RWMutex{}} 64 65 cons.Init(c.threshConsensus, c.fullConsensus) 66 cons.Done() 67 68 c.consensuses[f.LookupHash] = cons 69 c.files[f.LookupHash] = f 70 } 71 72 } 73 74 return nil 75 76 } 77 78 func (c *playlistConsensus) GetConsensusResult() []PlaylistFile { 79 80 files := make([]PlaylistFile, 0, len(c.files)) 81 82 for _, file := range c.files { 83 cons := c.consensuses[file.LookupHash] 84 85 if cons.isConsensusOk() { 86 files = append(files, file) 87 } 88 } 89 90 sort.Slice(files, func(i, j int) bool { 91 l := files[i] 92 r := files[j] 93 94 if len(l.Name) < len(r.Name) { 95 return true 96 } 97 98 if len(l.Name) > len(r.Name) { 99 return false 100 } 101 102 return l.Name < r.Name 103 }) 104 105 return files 106 }