diff --git a/common/pkgs/storage/local/shard_store.go b/common/pkgs/storage/local/shard_store.go index baa2cc9..6e82244 100644 --- a/common/pkgs/storage/local/shard_store.go +++ b/common/pkgs/storage/local/shard_store.go @@ -83,7 +83,7 @@ func (s *ShardStore) Open(opt types.OpenOption) (io.ReadCloser, error) { return nil, fmt.Errorf("invalid file name") } - filePath := filepath.Join(s.cfg.Root, BlocksDir, fileName[:2], fileName) + filePath := s.getFilePathFromHash(cdssdk.FileHash(fileName)) file, err := os.Open(filePath) if err != nil { return nil, err @@ -104,6 +104,23 @@ func (s *ShardStore) Open(opt types.OpenOption) (io.ReadCloser, error) { return file, nil } +func (s *ShardStore) Info(hash cdssdk.FileHash) (types.FileInfo, error) { + s.lock.Lock() + defer s.lock.Unlock() + + filePath := s.getFilePathFromHash(hash) + info, err := os.Stat(filePath) + if err != nil { + return types.FileInfo{}, err + } + + return types.FileInfo{ + Hash: hash, + Size: info.Size(), + Description: filePath, + }, nil +} + func (s *ShardStore) ListAll() ([]types.FileInfo, error) { s.lock.Lock() defer s.lock.Unlock() @@ -187,7 +204,7 @@ func (s *ShardStore) onWritterFinish(w *ShardWriter, hash cdssdk.FileHash) (type log.Debugf("write file %v finished, size: %v, hash: %v", w.path, w.size, hash) - blockDir := filepath.Join(s.cfg.Root, BlocksDir, string(hash)[:2]) + blockDir := s.getFileDirFromHash(hash) err := os.MkdirAll(blockDir, 0755) if err != nil { s.removeTempFile(w.path) @@ -228,3 +245,11 @@ func (s *ShardStore) removeTempFile(path string) { func (s *ShardStore) getLogger() logger.Logger { return logger.WithField("S", SvcName).WithField("Storage", s.stg.String()) } + +func (s *ShardStore) getFileDirFromHash(hash cdssdk.FileHash) string { + return filepath.Join(s.cfg.Root, BlocksDir, string(hash)[:2]) +} + +func (s *ShardStore) getFilePathFromHash(hash cdssdk.FileHash) string { + return filepath.Join(s.cfg.Root, BlocksDir, string(hash)[:2], string(hash)) +} diff --git a/common/pkgs/storage/types/shard_store.go b/common/pkgs/storage/types/shard_store.go index a80ad01..a9c438f 100644 --- a/common/pkgs/storage/types/shard_store.go +++ b/common/pkgs/storage/types/shard_store.go @@ -28,6 +28,8 @@ type ShardStore interface { New() ShardWriter // 使用F函数创建Option对象 Open(opt OpenOption) (io.ReadCloser, error) + // 获得指定文件信息 + Info(fileHash cdssdk.FileHash) (FileInfo, error) // 获取所有文件信息,尽量保证操作是原子的 ListAll() ([]FileInfo, error) // 删除指定的文件