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.
		
		
		
		
		
			
		
			
				
					
					
						
							280 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							280 lines
						
					
					
						
							5.8 KiB
						
					
					
				| package filer | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" | |
| 	"math" | |
| 	"math/rand" | |
| 	"testing" | |
| ) | |
| 
 | |
| func TestReadResolvedChunks(t *testing.T) { | |
| 
 | |
| 	chunks := []*filer_pb.FileChunk{ | |
| 		{ | |
| 			FileId:       "a", | |
| 			Offset:       0, | |
| 			Size:         100, | |
| 			ModifiedTsNs: 1, | |
| 		}, | |
| 		{ | |
| 			FileId:       "b", | |
| 			Offset:       50, | |
| 			Size:         100, | |
| 			ModifiedTsNs: 2, | |
| 		}, | |
| 		{ | |
| 			FileId:       "c", | |
| 			Offset:       200, | |
| 			Size:         50, | |
| 			ModifiedTsNs: 3, | |
| 		}, | |
| 		{ | |
| 			FileId:       "d", | |
| 			Offset:       250, | |
| 			Size:         50, | |
| 			ModifiedTsNs: 4, | |
| 		}, | |
| 		{ | |
| 			FileId:       "e", | |
| 			Offset:       175, | |
| 			Size:         100, | |
| 			ModifiedTsNs: 5, | |
| 		}, | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	fmt.Printf("resolved to %d visible intervales\n", visibles.Len()) | |
| 	for x := visibles.Front(); x != nil; x = x.Next { | |
| 		visible := x.Value | |
| 		fmt.Printf("[%d,%d) %s %d\n", visible.start, visible.stop, visible.fileId, visible.modifiedTsNs) | |
| 	} | |
| 
 | |
| } | |
| 
 | |
| func TestReadResolvedChunks2(t *testing.T) { | |
| 
 | |
| 	chunks := []*filer_pb.FileChunk{ | |
| 		{ | |
| 			FileId:       "c", | |
| 			Offset:       200, | |
| 			Size:         50, | |
| 			ModifiedTsNs: 3, | |
| 		}, | |
| 		{ | |
| 			FileId:       "e", | |
| 			Offset:       200, | |
| 			Size:         25, | |
| 			ModifiedTsNs: 5, | |
| 		}, | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	fmt.Printf("resolved to %d visible intervales\n", visibles.Len()) | |
| 	for x := visibles.Front(); x != nil; x = x.Next { | |
| 		visible := x.Value | |
| 		fmt.Printf("[%d,%d) %s %d\n", visible.start, visible.stop, visible.fileId, visible.modifiedTsNs) | |
| 	} | |
| 
 | |
| } | |
| 
 | |
| func TestRandomizedReadResolvedChunks(t *testing.T) { | |
| 
 | |
| 	var limit int64 = 1024 * 1024 | |
| 	array := make([]int64, limit) | |
| 	var chunks []*filer_pb.FileChunk | |
| 	for ts := int64(0); ts < 1024; ts++ { | |
| 		x := rand.Int63n(limit) | |
| 		y := rand.Int63n(limit) | |
| 		size := x - y | |
| 		if size < 0 { | |
| 			size = -size | |
| 		} | |
| 		if size > 1024 { | |
| 			size = 1024 | |
| 		} | |
| 		start := x | |
| 		if start > y { | |
| 			start = y | |
| 		} | |
| 		chunks = append(chunks, randomWrite(array, start, size, ts)) | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	for x := visibles.Front(); x != nil; x = x.Next { | |
| 		visible := x.Value | |
| 		for i := visible.start; i < visible.stop; i++ { | |
| 			if array[i] != visible.modifiedTsNs { | |
| 				t.Errorf("position %d expected ts %d actual ts %d", i, array[i], visible.modifiedTsNs) | |
| 			} | |
| 		} | |
| 	} | |
| 
 | |
| 	// fmt.Printf("visibles %d", len(visibles)) | |
|  | |
| } | |
| 
 | |
| func randomWrite(array []int64, start int64, size int64, ts int64) *filer_pb.FileChunk { | |
| 	for i := start; i < start+size; i++ { | |
| 		array[i] = ts | |
| 	} | |
| 	// fmt.Printf("write [%d,%d) %d\n", start, start+size, ts) | |
| 	return &filer_pb.FileChunk{ | |
| 		FileId:       "", | |
| 		Offset:       start, | |
| 		Size:         uint64(size), | |
| 		ModifiedTsNs: ts, | |
| 	} | |
| } | |
| 
 | |
| func TestSequentialReadResolvedChunks(t *testing.T) { | |
| 
 | |
| 	var chunkSize int64 = 1024 * 1024 * 2 | |
| 	var chunks []*filer_pb.FileChunk | |
| 	for ts := int64(0); ts < 13; ts++ { | |
| 		chunks = append(chunks, &filer_pb.FileChunk{ | |
| 			FileId:       "", | |
| 			Offset:       chunkSize * ts, | |
| 			Size:         uint64(chunkSize), | |
| 			ModifiedTsNs: 1, | |
| 		}) | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	fmt.Printf("visibles %d", visibles.Len()) | |
| 
 | |
| } | |
| 
 | |
| func TestActualReadResolvedChunks(t *testing.T) { | |
| 
 | |
| 	chunks := []*filer_pb.FileChunk{ | |
| 		{ | |
| 			FileId:       "5,e7b96fef48", | |
| 			Offset:       0, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595823000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "5,e5562640b9", | |
| 			Offset:       2097152, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595826000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "5,df033e0fe4", | |
| 			Offset:       4194304, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595827000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "7,eb08148a9b", | |
| 			Offset:       6291456, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595827000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "7,e0f92d1604", | |
| 			Offset:       8388608, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595828000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "7,e33cb63262", | |
| 			Offset:       10485760, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595828000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "5,ea98e40e93", | |
| 			Offset:       12582912, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595829000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "5,e165661172", | |
| 			Offset:       14680064, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595829000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "3,e692097486", | |
| 			Offset:       16777216, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595830000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "3,e28e2e3cbd", | |
| 			Offset:       18874368, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595830000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "3,e443974d4e", | |
| 			Offset:       20971520, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595830000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "2,e815bed597", | |
| 			Offset:       23068672, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 1634447487595831000, | |
| 		}, | |
| 		{ | |
| 			FileId:       "5,e94715199e", | |
| 			Offset:       25165824, | |
| 			Size:         1974736, | |
| 			ModifiedTsNs: 1634447487595832000, | |
| 		}, | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	for x := visibles.Front(); x != nil; x = x.Next { | |
| 		visible := x.Value | |
| 		fmt.Printf("[%d,%d) %s %d\n", visible.start, visible.stop, visible.fileId, visible.modifiedTsNs) | |
| 	} | |
| 
 | |
| } | |
| 
 | |
| func TestActualReadResolvedChunks2(t *testing.T) { | |
| 
 | |
| 	chunks := []*filer_pb.FileChunk{ | |
| 		{ | |
| 			FileId:       "1,e7b96fef48", | |
| 			Offset:       0, | |
| 			Size:         184320, | |
| 			ModifiedTsNs: 1, | |
| 		}, | |
| 		{ | |
| 			FileId:       "2,22562640b9", | |
| 			Offset:       184320, | |
| 			Size:         4096, | |
| 			ModifiedTsNs: 2, | |
| 		}, | |
| 		{ | |
| 			FileId:       "2,33562640b9", | |
| 			Offset:       184320, | |
| 			Size:         4096, | |
| 			ModifiedTsNs: 4, | |
| 		}, | |
| 		{ | |
| 			FileId:       "4,df033e0fe4", | |
| 			Offset:       188416, | |
| 			Size:         2097152, | |
| 			ModifiedTsNs: 3, | |
| 		}, | |
| 	} | |
| 
 | |
| 	visibles := readResolvedChunks(chunks, 0, math.MaxInt64) | |
| 
 | |
| 	for x := visibles.Front(); x != nil; x = x.Next { | |
| 		visible := x.Value | |
| 		fmt.Printf("[%d,%d) %s %d\n", visible.start, visible.stop, visible.fileId, visible.modifiedTsNs) | |
| 	} | |
| 
 | |
| }
 |