You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							71 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							71 lines
						
					
					
						
							1.7 KiB
						
					
					
				
								package skiplist
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/glog"
							 | 
						|
									"google.golang.org/protobuf/proto"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func LoadNameList(data []byte, store ListStore, batchSize int) *NameList {
							 | 
						|
								
							 | 
						|
									nl := &NameList{
							 | 
						|
										skipList:  New(store),
							 | 
						|
										batchSize: batchSize,
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if len(data) == 0 {
							 | 
						|
										return nl
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									message := &SkipListProto{}
							 | 
						|
									if err := proto.Unmarshal(data, message); err != nil {
							 | 
						|
										glog.Errorf("loading skiplist: %v", err)
							 | 
						|
									}
							 | 
						|
									nl.skipList.MaxNewLevel = int(message.MaxNewLevel)
							 | 
						|
									nl.skipList.MaxLevel = int(message.MaxLevel)
							 | 
						|
									for i, ref := range message.StartLevels {
							 | 
						|
										nl.skipList.StartLevels[i] = &SkipListElementReference{
							 | 
						|
											ElementPointer: ref.ElementPointer,
							 | 
						|
											Key:            ref.Key,
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									for i, ref := range message.EndLevels {
							 | 
						|
										nl.skipList.EndLevels[i] = &SkipListElementReference{
							 | 
						|
											ElementPointer: ref.ElementPointer,
							 | 
						|
											Key:            ref.Key,
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return nl
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (nl *NameList) HasChanges() bool {
							 | 
						|
									return nl.skipList.HasChanges
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (nl *NameList) ToBytes() []byte {
							 | 
						|
									message := &SkipListProto{}
							 | 
						|
									message.MaxNewLevel = int32(nl.skipList.MaxNewLevel)
							 | 
						|
									message.MaxLevel = int32(nl.skipList.MaxLevel)
							 | 
						|
									for _, ref := range nl.skipList.StartLevels {
							 | 
						|
										if ref == nil {
							 | 
						|
											break
							 | 
						|
										}
							 | 
						|
										message.StartLevels = append(message.StartLevels, &SkipListElementReference{
							 | 
						|
											ElementPointer: ref.ElementPointer,
							 | 
						|
											Key:            ref.Key,
							 | 
						|
										})
							 | 
						|
									}
							 | 
						|
									for _, ref := range nl.skipList.EndLevels {
							 | 
						|
										if ref == nil {
							 | 
						|
											break
							 | 
						|
										}
							 | 
						|
										message.EndLevels = append(message.EndLevels, &SkipListElementReference{
							 | 
						|
											ElementPointer: ref.ElementPointer,
							 | 
						|
											Key:            ref.Key,
							 | 
						|
										})
							 | 
						|
									}
							 | 
						|
									data, err := proto.Marshal(message)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("marshal skiplist: %v", err)
							 | 
						|
									}
							 | 
						|
									return data
							 | 
						|
								}
							 |