From 26a9fd2ac797e7e647877f82ab9a612407c524ec Mon Sep 17 00:00:00 2001 From: mawei029 Date: Fri, 30 Aug 2024 16:16:29 +0800 Subject: [PATCH] refactor(tools): drop disk stat, open rocksdb read only without depend on LOCK remove duplicate disk path @formatter:off Signed-off-by: mawei029 --- blobstore/cli/blobnode/disk.go | 33 ++++++++++++++++++++++++++++++--- blobstore/common/kvstore/db.go | 25 +++++++++++++++++++------ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/blobstore/cli/blobnode/disk.go b/blobstore/cli/blobnode/disk.go index 778bf1949..398f52527 100644 --- a/blobstore/cli/blobnode/disk.go +++ b/blobstore/cli/blobnode/disk.go @@ -214,6 +214,11 @@ func walkSingleDisk(ctx context.Context, cmCli *clustermgr.Client, dh *clustermg } } } + defer func() { + if db != nil { + db.Close() + } + }() vuidCnt := 0 for _, file := range files { @@ -313,6 +318,7 @@ func parseAllLocalDiskIdsByCm(c *grumble.Context) (diskInfos []*clustermgr.BlobN cmCli := newCmClient(c) marker := proto.DiskID(0) ret := clustermgr.ListDiskRet{} + allDisk := make(map[proto.DiskID]*clustermgr.BlobNodeDiskInfo) for { ret, err = cmCli.ListDisk(context.Background(), &clustermgr.ListOptionArgs{Host: prefix + host, Count: maxCnt, Marker: marker}) @@ -320,9 +326,9 @@ func parseAllLocalDiskIdsByCm(c *grumble.Context) (diskInfos []*clustermgr.BlobN return nil, err } - diskInfos = append(diskInfos, ret.Disks...) - if len(diskInfos) == 0 { - return nil, fmt.Errorf("error: empty, invalid disk ids") + // there may be previously expired diskID + for _, disk := range ret.Disks { + allDisk[disk.DiskID] = disk } if ret.Marker == proto.InvalidDiskID { @@ -331,9 +337,30 @@ func parseAllLocalDiskIdsByCm(c *grumble.Context) (diskInfos []*clustermgr.BlobN marker = ret.Marker } + diskInfos = removeRedundantDiskID(allDisk) + if len(diskInfos) == 0 { + return nil, fmt.Errorf("error: empty, invalid disk ids") + } return diskInfos, nil } +func removeRedundantDiskID(allDisks map[proto.DiskID]*clustermgr.BlobNodeDiskInfo) []*clustermgr.BlobNodeDiskInfo { + uniq := make(map[string]proto.DiskID) + for _, disk := range allDisks { + id, exist := uniq[disk.Path] + // this id is monotonically increasing, so we take the latest(maximum) diskID in the same path + if !exist || id < disk.DiskID { + uniq[disk.Path] = disk.DiskID + } + } + + disks := make([]*clustermgr.BlobNodeDiskInfo, 0, len(uniq)) + for _, id := range uniq { + disks = append(disks, allDisks[id]) + } + return disks +} + func printDiskID(dInfos []*clustermgr.BlobNodeDiskInfo) { diskIDs := make([]proto.DiskID, len(dInfos)) for i, dInfo := range dInfos { diff --git a/blobstore/common/kvstore/db.go b/blobstore/common/kvstore/db.go index e7209a780..ebec108c2 100644 --- a/blobstore/common/kvstore/db.go +++ b/blobstore/common/kvstore/db.go @@ -293,15 +293,28 @@ func OpenDB(path string, dbOpts ...DbOptions) (KVStore, error) { if path == "" { return nil, &os.PathError{Op: "open", Path: path, Err: syscall.ENOENT} } - err := os.MkdirAll(path, 0o755) - if err != nil { - panic(err) - } + dbOpt := defaultRocksDBOption dbOpt.applyOpts(dbOpts) - opts := genRocksdbOpts(&dbOpt) - db, err := rdb.OpenDb(opts, path) + + var db *rdb.DB + var err error + if dbOpt.readOnly { + _, err = os.Stat(path) + if err != nil { + panic(err) + } + + db, err = rdb.OpenDbForReadOnly(opts, path, false) + } else { + err = os.MkdirAll(path, 0o755) + if err != nil { + panic(err) + } + + db, err = rdb.OpenDb(opts, path) + } if err != nil { opts.Destroy() if strings.HasSuffix(err.Error(), "does not exist (create_if_missing is false)") {