mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
fix(blobnode): fix disk meta info crc not match for fallback last version
with: #1000887229 Signed-off-by: JasonHu520 <huzongchao@oppo.com>
This commit is contained in:
parent
32fa5e55b1
commit
16b5d3e6f1
@ -290,8 +290,8 @@ func (ds *DiskStorage) Close(ctx context.Context) {
|
||||
span := trace.SpanFromContextSafe(ctx)
|
||||
|
||||
const isClosed = int32(1)
|
||||
if atomic.LoadInt32(&ds.closed) == isClosed {
|
||||
span.Panicf("can not happened. diskId:%v", ds.DiskID)
|
||||
if !atomic.CompareAndSwapInt32(&ds.closed, 0, isClosed) {
|
||||
span.Warnf("disk already closed, diskId:%v", ds.DiskID)
|
||||
return
|
||||
}
|
||||
|
||||
@ -314,7 +314,6 @@ func (ds *DiskStorage) Close(ctx context.Context) {
|
||||
|
||||
span.Warnf("== closing diskID:%d == [DONE]", ds.DiskID)
|
||||
ds.onClosed()
|
||||
atomic.StoreInt32(&ds.closed, isClosed)
|
||||
}()
|
||||
|
||||
for _, pool := range ds.ioPools {
|
||||
|
||||
@ -240,12 +240,17 @@ func (fi *FormatInfo) VerifyV1() error {
|
||||
}
|
||||
|
||||
func (fi *FormatInfo) CalCheckSum() error {
|
||||
checkSum, err := fi.calCheckSumV2()
|
||||
checkSumV1, err := fi.calCheckSumV1()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fi.CheckSum = checkSumV1
|
||||
|
||||
fi.CheckSumV2 = checkSum
|
||||
checkSumV2, err := fi.calCheckSumV2()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fi.CheckSumV2 = checkSumV2
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@ -146,3 +146,107 @@ func TestOldVersionFomatInfo(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint32(1501699157), infoV1.CheckSum)
|
||||
}
|
||||
|
||||
// TestCalCheckSumSetsBothV1AndV2 verifies that CalCheckSum populates both checksum
|
||||
// fields. check_sum (v1) is required by 1.5.0 on downgrade; check_sum_v2 is used
|
||||
// by 1.5.2+ on normal startup.
|
||||
func TestCalCheckSumSetsBothV1AndV2(t *testing.T) {
|
||||
info := &FormatInfo{}
|
||||
info.FormatInfoProtectedField = FormatInfoProtectedField{
|
||||
DiskID: proto.DiskID(42),
|
||||
Version: 1,
|
||||
Format: FormatMetaTypeV1,
|
||||
Ctime: time.Now().UnixNano(),
|
||||
}
|
||||
info.NodeID = proto.NodeID(7)
|
||||
info.NodeCtime = time.Now().UnixNano()
|
||||
|
||||
err := info.CalCheckSum()
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotZero(t, info.CheckSum, "v1 checksum must be set; 1.5.0 verifies this on downgrade")
|
||||
require.NotZero(t, info.CheckSumV2, "v2 checksum must be set")
|
||||
|
||||
require.NoError(t, info.Verify())
|
||||
require.NoError(t, info.VerifyV1())
|
||||
}
|
||||
|
||||
// TestUpgradeV1ToV2PreservesDowngradeCompatibility verifies the v1→v2 upgrade path:
|
||||
// after CalCheckSum is called, the saved file has a valid v1 checksum that 1.5.0
|
||||
// can verify when downgrading back.
|
||||
func TestUpgradeV1ToV2PreservesDowngradeCompatibility(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
diskPath, err := os.MkdirTemp(os.TempDir(), "BlobNodeTestUpgradeDowngrade")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(diskPath)
|
||||
|
||||
sysPath := filepath.Join(diskPath, ".sys")
|
||||
err = os.MkdirAll(sysPath, 0o755)
|
||||
require.NoError(t, err)
|
||||
|
||||
// A v1 format file as written by 1.5.0.
|
||||
v1Content := `{"diskid":4,"version":1,"ctime":1766558856695434352,"format":"fs","check_sum":1501699157}`
|
||||
formatFile := filepath.Join(sysPath, ".format.json")
|
||||
err = os.WriteFile(formatFile, []byte(v1Content), 0o644)
|
||||
require.NoError(t, err)
|
||||
|
||||
// startup.go upgrade path: read triggers ErrFormatV2CrcIsEmpty, then CalCheckSum + save.
|
||||
info, err := ReadFormatInfo(ctx, diskPath)
|
||||
require.ErrorIs(t, err, ErrFormatV2CrcIsEmpty)
|
||||
require.NotNil(t, info)
|
||||
|
||||
info.NodeID = proto.NodeID(3)
|
||||
info.NodeCtime = time.Now().UnixNano()
|
||||
err = info.CalCheckSum()
|
||||
require.NoError(t, err)
|
||||
err = SaveDiskFormatInfo(ctx, diskPath, info)
|
||||
require.NoError(t, err)
|
||||
|
||||
// 1.5.2 normal read must succeed.
|
||||
upgraded, err := ReadFormatInfo(ctx, diskPath)
|
||||
require.NoError(t, err)
|
||||
|
||||
// VerifyV1 simulates what 1.5.0 does on startup after downgrade.
|
||||
require.NoError(t, upgraded.VerifyV1(), "v1 checksum must remain valid after upgrade for 1.5.0 downgrade")
|
||||
require.NotZero(t, upgraded.CheckSum)
|
||||
}
|
||||
|
||||
// TestNewDiskOnV2HasValidV1Checksum verifies that a disk first registered on 1.5.2
|
||||
// (never went through v1→v2 upgrade) also carries a valid v1 checksum, so that
|
||||
// downgrading to 1.5.0 at any point does not fail the checksum check.
|
||||
func TestNewDiskOnV2HasValidV1Checksum(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
diskPath, err := os.MkdirTemp(os.TempDir(), "BlobNodeTestNewDiskV2")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(diskPath)
|
||||
|
||||
sysPath := filepath.Join(diskPath, ".sys")
|
||||
err = os.MkdirAll(sysPath, 0o755)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Simulate disk registration on 1.5.2 (disk/disk.go new-disk path).
|
||||
info := &FormatInfo{}
|
||||
info.FormatInfoProtectedField = FormatInfoProtectedField{
|
||||
DiskID: proto.DiskID(100),
|
||||
Version: 1,
|
||||
Format: FormatMetaTypeV1,
|
||||
Ctime: time.Now().UnixNano(),
|
||||
}
|
||||
info.NodeID = proto.NodeID(5)
|
||||
info.NodeCtime = time.Now().UnixNano()
|
||||
|
||||
err = info.CalCheckSum()
|
||||
require.NoError(t, err)
|
||||
err = SaveDiskFormatInfo(ctx, diskPath, info)
|
||||
require.NoError(t, err)
|
||||
|
||||
// 1.5.2 normal read must succeed.
|
||||
loaded, err := ReadFormatInfo(ctx, diskPath)
|
||||
require.NoError(t, err)
|
||||
|
||||
// VerifyV1 simulates what 1.5.0 does on startup after downgrade.
|
||||
require.NotZero(t, loaded.CheckSum)
|
||||
require.NoError(t, loaded.VerifyV1(), "disk created on 1.5.2 must be readable by 1.5.0 after downgrade")
|
||||
}
|
||||
|
||||
@ -383,7 +383,7 @@ func readFormatInfo(ctx context.Context, diskRootPath string, nodeID proto.NodeI
|
||||
// case: format.info v1 upgrade to v2
|
||||
if err == core.ErrFormatV2CrcIsEmpty {
|
||||
if err = formatInfo.VerifyV1(); err != nil {
|
||||
span.Errorf("Failed verify disk[%s] v1 format info, err:%+v", diskRootPath, err)
|
||||
span.Fatalf("Failed verify disk[%s] v1 format info, err:%+v", diskRootPath, err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user