github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/bucket.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:43</date>
    10  //</624450114177470464>
    11  
    12  
    13  package simulation
    14  
    15  import "github.com/ethereum/go-ethereum/p2p/enode"
    16  
    17  //BucketKey是模拟存储桶中的键应该使用的类型。
    18  type BucketKey string
    19  
    20  //nodeItem返回在servicefunc函数中为特定节点设置的项。
    21  func (s *Simulation) NodeItem(id enode.ID, key interface{}) (value interface{}, ok bool) {
    22  	s.mu.Lock()
    23  	defer s.mu.Unlock()
    24  
    25  	if _, ok := s.buckets[id]; !ok {
    26  		return nil, false
    27  	}
    28  	return s.buckets[id].Load(key)
    29  }
    30  
    31  //setnodeitem设置与提供了nodeid的节点关联的新项。
    32  //应使用存储桶来避免管理单独的模拟全局状态。
    33  func (s *Simulation) SetNodeItem(id enode.ID, key interface{}, value interface{}) {
    34  	s.mu.Lock()
    35  	defer s.mu.Unlock()
    36  
    37  	s.buckets[id].Store(key, value)
    38  }
    39  
    40  //nodes items返回在
    41  //同样的BucketKey。
    42  func (s *Simulation) NodesItems(key interface{}) (values map[enode.ID]interface{}) {
    43  	s.mu.RLock()
    44  	defer s.mu.RUnlock()
    45  
    46  	ids := s.NodeIDs()
    47  	values = make(map[enode.ID]interface{}, len(ids))
    48  	for _, id := range ids {
    49  		if _, ok := s.buckets[id]; !ok {
    50  			continue
    51  		}
    52  		if v, ok := s.buckets[id].Load(key); ok {
    53  			values[id] = v
    54  		}
    55  	}
    56  	return values
    57  }
    58  
    59  //up nodes items从所有向上的节点返回具有相同bucketkey的项的映射。
    60  func (s *Simulation) UpNodesItems(key interface{}) (values map[enode.ID]interface{}) {
    61  	s.mu.RLock()
    62  	defer s.mu.RUnlock()
    63  
    64  	ids := s.UpNodeIDs()
    65  	values = make(map[enode.ID]interface{})
    66  	for _, id := range ids {
    67  		if _, ok := s.buckets[id]; !ok {
    68  			continue
    69  		}
    70  		if v, ok := s.buckets[id].Load(key); ok {
    71  			values[id] = v
    72  		}
    73  	}
    74  	return values
    75  }
    76