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.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							96 lines
						
					
					
						
							2.9 KiB
						
					
					
				| package storage | |
| 
 | |
| import ( | |
| 	"testing" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/super_block" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/types" | |
| 	"github.com/stretchr/testify/assert" | |
| ) | |
| 
 | |
| func TestReadNeedMetaWithWritesAndUpdates(t *testing.T) { | |
| 	dir := t.TempDir() | |
| 
 | |
| 	v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, 0, 0) | |
| 	if err != nil { | |
| 		t.Fatalf("volume creation: %v", err) | |
| 	} | |
| 	type WriteInfo struct { | |
| 		offset int64 | |
| 		size   int32 | |
| 	} | |
| 	writeInfos := make([]WriteInfo, 30) | |
| 	mockLastUpdateTime := uint64(1000000000000) | |
| 	// initialize 20 needles then update first 10 needles | |
| 	for i := 1; i <= 30; i++ { | |
| 		n := newRandomNeedle(uint64(i % 20)) | |
| 		n.Flags = 0x08 | |
| 		n.LastModified = mockLastUpdateTime | |
| 		mockLastUpdateTime += 2000 | |
| 		offset, _, _, err := v.writeNeedle2(n, true, false) | |
| 		if err != nil { | |
| 			t.Fatalf("write needle %d: %v", i, err) | |
| 		} | |
| 		writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(n.Size)} | |
| 	} | |
| 	expectedLastUpdateTime := uint64(1000000000000) | |
| 	for i := 0; i < 30; i++ { | |
| 		testNeedle := new(needle.Needle) | |
| 		testNeedle.Id = types.Uint64ToNeedleId(uint64(i + 1%20)) | |
| 		testNeedle.Flags = 0x08 | |
| 		v.readNeedleMetaAt(testNeedle, writeInfos[i].offset, writeInfos[i].size) | |
| 		actualLastModifiedTime := testNeedle.LastModified | |
| 		if writeInfos[i].size != 0 { | |
| 			assert.Equal(t, expectedLastUpdateTime, actualLastModifiedTime, "The two words should be the same.") | |
| 		} | |
| 		expectedLastUpdateTime += 2000 | |
| 	} | |
| } | |
| 
 | |
| func TestReadNeedMetaWithDeletesThenWrites(t *testing.T) { | |
| 	dir := t.TempDir() | |
| 
 | |
| 	v, err := NewVolume(dir, dir, "", 1, NeedleMapInMemory, &super_block.ReplicaPlacement{}, &needle.TTL{}, 0, 0, 0) | |
| 	if err != nil { | |
| 		t.Fatalf("volume creation: %v", err) | |
| 	} | |
| 	type WriteInfo struct { | |
| 		offset int64 | |
| 		size   int32 | |
| 	} | |
| 	writeInfos := make([]WriteInfo, 10) | |
| 	mockLastUpdateTime := uint64(1000000000000) | |
| 	for i := 1; i <= 10; i++ { | |
| 		n := newRandomNeedle(uint64(i % 5)) | |
| 		n.Flags = 0x08 | |
| 		n.LastModified = mockLastUpdateTime | |
| 		mockLastUpdateTime += 2000 | |
| 		offset, _, _, err := v.writeNeedle2(n, true, false) | |
| 		if err != nil { | |
| 			t.Fatalf("write needle %d: %v", i, err) | |
| 		} | |
| 		if i < 5 { | |
| 			size, err := v.deleteNeedle2(n) | |
| 			if err != nil { | |
| 				t.Fatalf("delete needle %d: %v", i, err) | |
| 			} | |
| 			writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(size)} | |
| 		} else { | |
| 			writeInfos[i-1] = WriteInfo{offset: int64(offset), size: int32(n.Size)} | |
| 		} | |
| 	} | |
| 
 | |
| 	expectedLastUpdateTime := uint64(1000000000000) | |
| 	for i := 0; i < 10; i++ { | |
| 		testNeedle := new(needle.Needle) | |
| 		testNeedle.Id = types.Uint64ToNeedleId(uint64(i + 1%5)) | |
| 		testNeedle.Flags = 0x08 | |
| 		v.readNeedleMetaAt(testNeedle, writeInfos[i].offset, writeInfos[i].size) | |
| 		actualLastModifiedTime := testNeedle.LastModified | |
| 		if writeInfos[i].size != 0 { | |
| 			assert.Equal(t, expectedLastUpdateTime, actualLastModifiedTime, "The two words should be the same.") | |
| 		} | |
| 		expectedLastUpdateTime += 2000 | |
| 	} | |
| }
 |