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  }