Bläddra i källkod

调整磁盘数据模型和相应接口

reghao 1 år sedan
förälder
incheckning
99715eaffb
23 ändrade filer med 460 tillägg och 87 borttagningar
  1. 1 1
      README.md
  2. 0 27
      oss-api/src/main/java/cn/reghao/oss/api/dto/StoreDiskDto.java
  3. 0 19
      oss-api/src/main/java/cn/reghao/oss/api/dto/StoreInfo.java
  4. 2 1
      oss-api/src/main/java/cn/reghao/oss/api/dto/StoreNodeDto.java
  5. 22 0
      oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskPartition.java
  6. 22 0
      oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskStore.java
  7. 44 0
      oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskVolume.java
  8. 2 2
      oss-api/src/main/java/cn/reghao/oss/api/iface/StoreService.java
  9. 5 3
      oss-api/src/main/java/cn/reghao/oss/api/iface/StoreServiceWrapper.java
  10. 1 1
      oss-media/src/main/resources/mapper/DataBlockMapper.xml
  11. 1 1
      oss-store/bin/oss.yml
  12. 6 0
      oss-store/pom.xml
  13. 10 16
      oss-store/src/main/java/cn/reghao/oss/store/config/SpringLifecycle.java
  14. 1 1
      oss-store/src/main/java/cn/reghao/oss/store/config/props/OssProperties.java
  15. 17 0
      oss-store/src/main/java/cn/reghao/oss/store/disk/LoadBalancer.java
  16. 72 0
      oss-store/src/main/java/cn/reghao/oss/store/disk/LocalStore.java
  17. 83 0
      oss-store/src/main/java/cn/reghao/oss/store/disk/LocalStores.java
  18. 37 0
      oss-store/src/main/java/cn/reghao/oss/store/disk/StoreDir.java
  19. 26 0
      oss-store/src/main/java/cn/reghao/oss/store/disk/SubDirCount.java
  20. 33 6
      oss-store/src/main/java/cn/reghao/oss/store/rpc/StoreServiceImpl.java
  21. 66 0
      oss-store/src/main/java/cn/reghao/oss/store/service/DiskService.java
  22. 8 8
      oss-store/src/main/java/cn/reghao/oss/store/service/FileStoreService.java
  23. 1 1
      oss-store/src/main/resources/mapper/DataBlockMapper.xml

+ 1 - 1
README.md

@@ -68,7 +68,7 @@ oss-store 应用强依赖 oss-console, 必须先启动 oss-console 后再启动
 > oss.storeHost
 > > oss-store 所部署机器的 IP 地址
 > 
-> oss.diskDirs
+> oss.storeDirs
 > > 存储文件使用的位置, 每个位置都必须是一块独立的磁盘, 推荐将单块磁盘挂载到此位置
 > >
 > 

+ 0 - 27
oss-api/src/main/java/cn/reghao/oss/api/dto/StoreDiskDto.java

@@ -1,27 +0,0 @@
-package cn.reghao.oss.api.dto;
-
-import cn.reghao.jutil.jdk.store.LocalStore;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2024-03-04 17:12:21
- */
-@NoArgsConstructor
-@Getter
-public class StoreDiskDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String diskDir;
-    private Long total;
-    private Long avail;
-
-    public StoreDiskDto(LocalStore localStore) {
-        this.diskDir = localStore.getDiskDir();
-        this.total = localStore.getTotal();
-        this.avail = localStore.getAvailable();
-    }
-}

+ 0 - 19
oss-api/src/main/java/cn/reghao/oss/api/dto/StoreInfo.java

@@ -1,19 +0,0 @@
-package cn.reghao.oss.api.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2024-03-07 14:00:22
- */
-@AllArgsConstructor
-@Getter
-public class StoreInfo implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private List<StoreDiskDto> storeDisks;
-}

+ 2 - 1
oss-api/src/main/java/cn/reghao/oss/api/dto/StoreNodeDto.java

@@ -1,5 +1,6 @@
 package cn.reghao.oss.api.dto;
 
+import cn.reghao.oss.api.dto.disk.DiskVolume;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -22,5 +23,5 @@ public class StoreNodeDto implements Serializable {
     private String nodeAddr;
     private Integer httpPort;
     private Integer rpcPort;
-    private List<StoreDiskDto> diskDtoList;
+    private List<DiskVolume> diskVolumes;
 }

+ 22 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskPartition.java

@@ -0,0 +1,22 @@
+package cn.reghao.oss.api.dto.disk;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2024-10-21 09:50:10
+ */
+@AllArgsConstructor
+@Getter
+public class DiskPartition implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String partitionName;
+    private String mountPoint;
+    private String blockId;
+    private String fsType;
+    private long partitionSize;
+}

+ 22 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskStore.java

@@ -0,0 +1,22 @@
+package cn.reghao.oss.api.dto.disk;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-10-21 09:50:23
+ */
+@AllArgsConstructor
+@Getter
+public class DiskStore implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String model;
+    private String name;
+    private long size;
+    private List<DiskPartition> partitions;
+}

+ 44 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/disk/DiskVolume.java

@@ -0,0 +1,44 @@
+package cn.reghao.oss.api.dto.disk;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2024-10-21 11:29:28
+ */
+@AllArgsConstructor
+@Getter
+public class DiskVolume implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String name;
+    private String volume;
+    private String mountPoint;
+    private String fsType;
+    private String blockId;
+    private long totalSpace;
+    private long availSpace;
+    private long totalInode;
+    private long availInode;
+    private String storeDir;
+
+    public DiskVolume(String name, String volume, String mountPoint, String fsType, String blockId,
+                      long totalSpace, long availSpace, long totalInode, long availInode) {
+        this.name = name;
+        this.volume = volume;
+        this.mountPoint = mountPoint;
+        this.fsType = fsType;
+        this.blockId = blockId;
+        this.totalSpace = totalSpace;
+        this.availSpace = availSpace;
+        this.totalInode = totalInode;
+        this.availInode = availInode;
+    }
+
+    public void setStoreDir(String storeDir) {
+        this.storeDir = storeDir;
+    }
+}

+ 2 - 2
oss-api/src/main/java/cn/reghao/oss/api/iface/StoreService.java

@@ -2,7 +2,7 @@ package cn.reghao.oss.api.iface;
 
 import cn.reghao.oss.api.dto.FileInfo;
 import cn.reghao.oss.api.dto.ObjectInfo;
-import cn.reghao.oss.api.dto.StoreInfo;
+import cn.reghao.oss.api.dto.disk.DiskVolume;
 import cn.reghao.oss.api.dto.media.AudioInfo;
 import cn.reghao.oss.api.dto.media.ConvertedImageInfo;
 import cn.reghao.oss.api.dto.media.ImageInfo;
@@ -19,7 +19,7 @@ import java.util.List;
  */
 public interface StoreService {
     void createChannel(String channelPrefix);
-    StoreInfo getStoreInfo();
+    List<DiskVolume> getDiskVolumes();
     String getUploadToken(int channelId, int loginUser, int expire);
 
     void setObjectScope(String objectId, int scope);

+ 5 - 3
oss-api/src/main/java/cn/reghao/oss/api/iface/StoreServiceWrapper.java

@@ -1,12 +1,14 @@
 package cn.reghao.oss.api.iface;
 
 import cn.reghao.oss.api.dto.ObjectInfo;
-import cn.reghao.oss.api.dto.StoreInfo;
+import cn.reghao.oss.api.dto.disk.DiskVolume;
 import cn.reghao.oss.api.dto.media.AudioInfo;
 import cn.reghao.oss.api.dto.media.ConvertedImageInfo;
 import cn.reghao.oss.api.dto.media.ImageInfo;
 import cn.reghao.oss.api.dto.media.VideoInfo;
 
+import java.util.List;
+
 /**
  * 对 oss-store 进行操作
  * 第三方通过 oss-console 调用
@@ -15,10 +17,10 @@ import cn.reghao.oss.api.dto.media.VideoInfo;
  * @date 2024-04-23 15:14:06
  */
 public interface StoreServiceWrapper {
+    Integer getChannelScope(int channelId);
     void createChannel(int channelId, String channelPrefix);
-    StoreInfo getStoreInfo(int channelId);
+    List<DiskVolume> getDiskVolumes(int channelId);
 
-    Integer getChannelScope(int channelId);
     void setObjectScope(int channelId, String objectId, int scope);
     void deleteByObjectId(int channelId, String objectId);
     void deleteByObjectUrl(String objectUrl);

+ 1 - 1
oss-media/src/main/resources/mapper/DataBlockMapper.xml

@@ -34,7 +34,7 @@
         from data_block
         where content_id=#{contentId}
     </select>
-    <select id="findSubDirCount" resultType="cn.reghao.jutil.jdk.store.SubDirCount">
+    <select id="findSubDirCount" resultType="cn.reghao.oss.store.disk.SubDirCount">
         select relative_dir,count(*) as total
         from data_block
         group by relative_dir

+ 1 - 1
oss-store/bin/oss.yml

@@ -8,6 +8,6 @@ spring:
     password: Dev@123456
 oss:
   storeHost: 127.0.0.1
-  diskDirs:
+  storeDirs:
     - /opt/disk/13f654c8-af87-4710-aac9-7aa086c99aec/
   consoleHost: 127.0.0.1

+ 6 - 0
oss-store/pom.xml

@@ -131,6 +131,12 @@
             <version>2.9.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.oshi</groupId>
+            <artifactId>oshi-core</artifactId>
+            <version>6.6.3</version>
+        </dependency>
+
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>

+ 10 - 16
oss-store/src/main/java/cn/reghao/oss/store/config/SpringLifecycle.java

@@ -1,10 +1,9 @@
 package cn.reghao.oss.store.config;
 
-import cn.reghao.oss.store.config.props.DubboProperties;
-import cn.reghao.oss.api.dto.StoreDiskDto;
 import cn.reghao.oss.api.dto.StoreNodeDto;
+import cn.reghao.oss.api.dto.disk.DiskVolume;
+import cn.reghao.oss.api.iface.StoreService;
 import cn.reghao.oss.store.config.props.SpringProperties;
-import cn.reghao.oss.store.service.FileStoreService;
 import cn.reghao.oss.store.service.StoreLocalService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
@@ -13,7 +12,6 @@ import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -23,32 +21,28 @@ import java.util.stream.Collectors;
 @Component
 public class SpringLifecycle implements ApplicationRunner, DisposableBean {
     private final SpringProperties springProperties;
-    private final FileStoreService fileStoreService;
+    private final StoreService storeService;
     private final StoreLocalService storeLocalService;
 
-    public SpringLifecycle(SpringProperties springProperties, DubboProperties dubboProperties, FileStoreService fileStoreService,
+    public SpringLifecycle(SpringProperties springProperties, StoreService storeService,
                            StoreLocalService storeLocalService) {
         this.springProperties = springProperties;
-        this.fileStoreService = fileStoreService;
+        this.storeService = storeService;
         this.storeLocalService = storeLocalService;
     }
 
     @Override
-    public void run(ApplicationArguments args) throws Exception {
-        initStoreNode();
-        log.info("执行文件任务...");
-        log.info("文件任务执行完成...");
+    public void run(ApplicationArguments args) {
+        registerStoreNode();
     }
 
-    private void initStoreNode() throws Exception {
+    private void registerStoreNode() {
         // 注册 oss-store 到 oss-console
         String nodeAddr = springProperties.getNodeAddress();
         int httpPort = springProperties.getHttpPort();
         int rpcPort = springProperties.getRpcPort();
-        List<StoreDiskDto> list = fileStoreService.getStoreDisks().stream()
-                .map(StoreDiskDto::new)
-                .collect(Collectors.toList());
-        StoreNodeDto storeNodeDto = new StoreNodeDto(nodeAddr, httpPort, rpcPort, list);
+        List<DiskVolume> diskVolumeList = storeService.getDiskVolumes();
+        StoreNodeDto storeNodeDto = new StoreNodeDto(nodeAddr, httpPort, rpcPort, diskVolumeList);
         storeLocalService.register(storeNodeDto);
         log.info("StoreNode 已注册到 oss-console...");
     }

+ 1 - 1
oss-store/src/main/java/cn/reghao/oss/store/config/props/OssProperties.java

@@ -17,6 +17,6 @@ import java.util.List;
 @ConfigurationProperties(prefix = "oss")
 public class OssProperties {
     private String storeHost;
-    private List<String> diskDirs;
+    private List<String> storeDirs;
     private String consoleHost;
 }

+ 17 - 0
oss-store/src/main/java/cn/reghao/oss/store/disk/LoadBalancer.java

@@ -0,0 +1,17 @@
+package cn.reghao.oss.store.disk;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2022-03-22 13:53:08
+ */
+public class LoadBalancer {
+    public StoreDir getStoreDir(long fileSize) {
+        LocalStore localStore = LocalStores.getMaxStore(fileSize);
+        List<StoreDir> subDirs = LocalStores.getSubDirs(localStore.getStoreDir());
+        subDirs.sort(Comparator.comparingInt(StoreDir::getTotal));
+        return subDirs.get(0);
+    }
+}

+ 72 - 0
oss-store/src/main/java/cn/reghao/oss/store/disk/LocalStore.java

@@ -0,0 +1,72 @@
+package cn.reghao.oss.store.disk;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author reghao
+ * @date 2022-05-23 15:00:59
+ */
+public class LocalStore {
+    // 表示一个磁盘分区
+    private final String diskVolume;
+    // 磁盘分区上文件存储的目录
+    private final String storeDir;
+    // 磁盘分区总容量
+    private final long totalSpace;
+    // 磁盘分区可用容量
+    private final AtomicLong availSpace;
+    private final long max;
+
+    public LocalStore(String diskVolume, String storeDir, long totalSpace, long availSpace, double maxPercent) {
+        this.diskVolume = diskVolume;
+        this.storeDir = storeDir;
+        this.totalSpace = totalSpace;
+        this.availSpace = new AtomicLong(availSpace);
+        BigDecimal bigDecimal1 = new BigDecimal(totalSpace*10);
+        BigDecimal bigDecimal2 = new BigDecimal(maxPercent*10);
+        this.max = bigDecimal1.divide(bigDecimal2, RoundingMode.DOWN).longValue();
+    }
+
+    public String getDiskVolume() {
+        return diskVolume;
+    }
+
+    public String getStoreDir() {
+        return storeDir;
+    }
+
+    public long getTotalSpace() {
+        return totalSpace;
+    }
+
+    public long getAvailSpace() {
+        return availSpace.get();
+    }
+
+    public void setCurrentAvailSpace(long currentAvailable) {
+        availSpace.getAndSet(currentAvailable);
+    }
+    
+    @Override
+    public int hashCode() {
+        int result = 17;
+        result = result * 31 + diskVolume.hashCode();
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) {
+            return true;
+        }
+
+        if (other instanceof LocalStore) {
+            LocalStore o = (LocalStore) other;
+            return o.diskVolume.equals(diskVolume);
+        } else {
+            return false;
+        }
+    }
+}

+ 83 - 0
oss-store/src/main/java/cn/reghao/oss/store/disk/LocalStores.java

@@ -0,0 +1,83 @@
+package cn.reghao.oss.store.disk;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+
+/**
+ * @author reghao
+ * @date 2022-05-23 18:21:22
+ */
+public class LocalStores {
+    private static final Map<String, LocalStore> storeMap = new HashMap<>();
+    private static final Map<String, Map<String, StoreDir>> storeDirMap = new HashMap<>();
+
+    public static void init(List<String> storeDirs) throws IOException {
+        Map<String, String> map = new HashMap<>();
+        for (String storeDir : storeDirs) {
+            FileStore fileStore = Files.getFileStore(Path.of(storeDir));
+            String logicalDisk = fileStore.name();
+            String prevValue = map.putIfAbsent(logicalDisk, storeDir);
+            if (prevValue == null) {
+                long total = fileStore.getTotalSpace();
+                long available = fileStore.getUsableSpace();
+                LocalStore localStore = new LocalStore(logicalDisk, storeDir, total, available, 0.9);
+                storeMap.put(storeDir, localStore);
+                storeDirMap.computeIfAbsent(storeDir, k -> new HashMap<>());
+                createSubDirs(storeDir);
+            } else {
+                String msg = String.format("%s's mounted directory %s has already associated with %s", logicalDisk, storeDir, prevValue);
+                System.out.println(msg);
+            }
+        }
+    }
+
+    private static void createSubDirs(String storeDir) throws IOException {
+        int total = 128;
+        for (int i = 0; i < total; i++) {
+            for (int j = 0; j < total; j++) {
+                String baseDir = String.format("%s/%s/%s/", storeDir, i, j);
+                File dir = new File(baseDir);
+                if (!dir.exists() && !dir.mkdirs()) {
+                    String msg = String.format("create %s failed", dir);
+                    throw new IOException(msg);
+                }
+
+                storeDirMap.get(storeDir).put(baseDir, new StoreDir(baseDir));
+            }
+        }
+    }
+
+    // TODO 优化算法, 处理异常
+    public static LocalStore getMaxStore(long size) {
+        Map<String, Long> map = new HashMap<>();
+        for (Map.Entry<String, LocalStore> entry : storeMap.entrySet()) {
+            String storeDir = entry.getKey();
+            LocalStore localStore = entry.getValue();
+            long currentAvailable = localStore.getAvailSpace() - size;
+            map.put(storeDir, currentAvailable);
+        }
+
+        List<String> storeDirs = new ArrayList<>();
+        // storeDirs 中的元素升序排列
+        map.entrySet().stream()
+                .sorted(Map.Entry.comparingByValue())
+                .forEachOrdered(b -> storeDirs.add(b.getKey()));
+
+        String maxDisk = storeDirs.get(storeDirs.size()-1);
+        LocalStore localStore = storeMap.get(maxDisk);
+        localStore.setCurrentAvailSpace(map.get(maxDisk));
+        return localStore;
+    }
+    
+    public static List<StoreDir> getSubDirs(String storeDir) {
+        return new ArrayList<>(storeDirMap.get(storeDir).values());
+    }
+
+    public static List<LocalStore> getLocalStores() {
+        return new ArrayList<>(storeMap.values());
+    }
+}

+ 37 - 0
oss-store/src/main/java/cn/reghao/oss/store/disk/StoreDir.java

@@ -0,0 +1,37 @@
+package cn.reghao.oss.store.disk;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author reghao
+ * @date 2022-05-23 23:31:21
+ */
+public class StoreDir {
+    private final String baseDir;
+    private final AtomicInteger total;
+
+    public StoreDir(String baseDir) {
+        this.baseDir = baseDir;
+        this.total = new AtomicInteger(0);
+    }
+
+    public String getBaseDir() {
+        return baseDir;
+    }
+
+    public void setTotal(int total) {
+        this.total.setPlain(total);
+    }
+
+    public int getTotal() {
+        return total.get();
+    }
+
+    public void incr() {
+        this.total.incrementAndGet();
+    }
+
+    public void decr() {
+        this.total.decrementAndGet();
+    }
+}

+ 26 - 0
oss-store/src/main/java/cn/reghao/oss/store/disk/SubDirCount.java

@@ -0,0 +1,26 @@
+package cn.reghao.oss.store.disk;
+
+/**
+ * @author reghao
+ * @date 2023-11-01 21:38:59
+ */
+public class SubDirCount {
+    private String relativeDir;
+    private int total;
+
+    public void setRelativeDir(String relativeDir) {
+        this.relativeDir = relativeDir;
+    }
+
+    public String getRelativeDir() {
+        return relativeDir;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+}

+ 33 - 6
oss-store/src/main/java/cn/reghao/oss/store/rpc/StoreServiceImpl.java

@@ -4,6 +4,7 @@ import cn.reghao.jutil.jdk.security.RandomString;
 import cn.reghao.oss.api.constant.ChannelAction;
 import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.dto.*;
+import cn.reghao.oss.api.dto.disk.DiskVolume;
 import cn.reghao.oss.api.dto.media.AudioInfo;
 import cn.reghao.oss.api.dto.media.ConvertedImageInfo;
 import cn.reghao.oss.api.dto.media.ImageInfo;
@@ -11,6 +12,7 @@ import cn.reghao.oss.api.dto.media.VideoInfo;
 import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.FileMeta;
+import cn.reghao.oss.store.service.DiskService;
 import cn.reghao.oss.store.service.FileStoreService;
 import cn.reghao.oss.store.service.ObjectNameService;
 import cn.reghao.oss.api.iface.StoreService;
@@ -21,7 +23,9 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -42,16 +46,19 @@ public class StoreServiceImpl implements StoreService {
     private final SignService signService;
     private final MediaFileProcessor mediaFileProcessor;
     private final Cache<String, String> cache;
+    private final DiskService diskService;
 
     public StoreServiceImpl(ObjectNameService objectNameService, FileStoreService fileStoreService,
                             ObjectRepository objectRepository, SignService signService,
-                            MediaFileProcessor mediaFileProcessor, Cache<String, String> cache) {
+                            MediaFileProcessor mediaFileProcessor, Cache<String, String> cache,
+                            DiskService diskService) {
         this.objectNameService = objectNameService;
         this.fileStoreService = fileStoreService;
         this.objectRepository = objectRepository;
         this.signService = signService;
         this.mediaFileProcessor = mediaFileProcessor;
         this.cache = cache;
+        this.diskService = diskService;
     }
 
     @Override
@@ -60,11 +67,19 @@ public class StoreServiceImpl implements StoreService {
     }
 
     @Override
-    public StoreInfo getStoreInfo() {
-        List<StoreDiskDto> diskDtos = fileStoreService.getStoreDisks().stream()
-                .map(StoreDiskDto::new)
+    public List<DiskVolume> getDiskVolumes() {
+        Map<String, DiskVolume> map = diskService.getFileStore().stream()
+                .collect(Collectors.toMap(DiskVolume::getVolume, k -> k));
+        List<DiskVolume> list = fileStoreService.getStoreDisks().stream()
+                .map(localStore -> {
+                    String volume = localStore.getDiskVolume();
+                    String storeDir = localStore.getStoreDir();
+                    DiskVolume diskVolume = map.get(volume);
+                    diskVolume.setStoreDir(storeDir);
+                    return diskVolume;
+                })
                 .collect(Collectors.toList());
-        return new StoreInfo(diskDtos);
+        return list;
     }
 
     @Override
@@ -167,6 +182,18 @@ public class StoreServiceImpl implements StoreService {
 
     @Override
     public List<FileInfo> getFiles(String pid, int pageSize, String nextObjectId) {
-        return objectRepository.getFiles(pid, pageSize, nextObjectId);
+        String objectId = pid;
+        if (!objectId.isBlank()) {
+            FileMeta fileMeta = objectRepository.getByObjectName(pid);
+            int fileType = fileMeta.getFileType();
+            if (fileType != 1000) {
+                return Collections.emptyList();
+            }
+            objectId = fileMeta.getObjectId();
+        } else {
+            objectId = "0";
+        }
+
+        return objectRepository.getFiles(objectId, pageSize, nextObjectId);
     }
 }

+ 66 - 0
oss-store/src/main/java/cn/reghao/oss/store/service/DiskService.java

@@ -0,0 +1,66 @@
+package cn.reghao.oss.store.service;
+
+import cn.reghao.oss.api.dto.disk.DiskPartition;
+import cn.reghao.oss.api.dto.disk.DiskStore;
+import cn.reghao.oss.api.dto.disk.DiskVolume;
+import org.springframework.stereotype.Service;
+import oshi.SystemInfo;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.software.os.FileSystem;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2024-10-21 09:57:18
+ */
+@Service
+public class DiskService {
+    private final HardwareAbstractionLayer hal;
+    private final FileSystem fs;
+
+    public DiskService() {
+        SystemInfo si = new oshi.SystemInfo();
+        this.hal = si.getHardware();
+        this.fs = si.getOperatingSystem().getFileSystem();
+    }
+
+    public List<DiskVolume> getFileStore() {
+        List<DiskVolume> list = fs.getFileStores().stream()
+                .filter(osFileStore -> !osFileStore.getUUID().isBlank())
+                .map(osFileStore -> {
+                    String name = osFileStore.getName();
+                    String volume = osFileStore.getVolume();
+                    String mountPoint = osFileStore.getMount();
+                    String blockId = osFileStore.getUUID();
+                    String fsType = osFileStore.getType();
+                    long totalSpace = osFileStore.getTotalSpace();
+                    long usableSpace = osFileStore.getUsableSpace();
+                    long freeSpace = osFileStore.getFreeSpace();
+                    long totalInodes = osFileStore.getTotalInodes();
+                    long freeInodes = osFileStore.getFreeInodes();
+                    return new DiskVolume(name, volume, mountPoint, fsType, blockId,
+                            totalSpace, usableSpace, totalInodes, freeInodes);
+                }).collect(Collectors.toList());
+        return list;
+    }
+
+    public List<DiskStore> getDiskStore() {
+        List<DiskStore> diskStores = hal.getDiskStores().stream().map(hwDiskStore -> {
+            String model = hwDiskStore.getModel();
+            String name = hwDiskStore.getName();
+            long size = hwDiskStore.getSize();
+            List<DiskPartition> partitions = hwDiskStore.getPartitions().stream().map(hwPartition -> {
+                String partitionName = hwPartition.getIdentification();
+                String mountPoint = hwPartition.getMountPoint();
+                String blockId = hwPartition.getUuid();
+                String fsType = hwPartition.getType();
+                long partitionSize = hwPartition.getSize();
+                return new DiskPartition(partitionName, mountPoint, blockId, fsType, partitionSize);
+            }).collect(Collectors.toList());
+            return new DiskStore(model, name, size, partitions);
+        }).collect(Collectors.toList());
+        return diskStores;
+    }
+}

+ 8 - 8
oss-store/src/main/java/cn/reghao/oss/store/service/FileStoreService.java

@@ -1,9 +1,9 @@
 package cn.reghao.oss.store.service;
 
-import cn.reghao.jutil.jdk.store.LoadBalancer;
-import cn.reghao.jutil.jdk.store.LocalStore;
-import cn.reghao.jutil.jdk.store.LocalStores;
-import cn.reghao.jutil.jdk.store.StoreDir;
+import cn.reghao.oss.store.disk.LoadBalancer;
+import cn.reghao.oss.store.disk.LocalStore;
+import cn.reghao.oss.store.disk.LocalStores;
+import cn.reghao.oss.store.disk.StoreDir;
 import cn.reghao.oss.store.config.props.OssProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
@@ -37,14 +37,14 @@ public class FileStoreService {
     @PostConstruct
     public void initLocalStore() throws IOException {
         log.info("初始化本地磁盘...");
-        List<String> diskDirs = ossProperties.getDiskDirs();
-        for (String diskDir : diskDirs) {
-            File dir = new File(diskDir);
+        List<String> storeDirs = ossProperties.getStoreDirs();
+        for (String storeDir : storeDirs) {
+            File dir = new File(storeDir);
             if (!dir.exists()) {
                 dir.mkdirs();
             }
         }
-        LocalStores.init(diskDirs);
+        LocalStores.init(storeDirs);
 
         /*for (String diskDir : diskDirs) {
             Map<String, Integer> map = new HashMap<>();

+ 1 - 1
oss-store/src/main/resources/mapper/DataBlockMapper.xml

@@ -34,7 +34,7 @@
         from data_block
         where content_id=#{contentId}
     </select>
-    <select id="findSubDirCount" resultType="cn.reghao.jutil.jdk.store.SubDirCount">
+    <select id="findSubDirCount" resultType="cn.reghao.oss.store.disk.SubDirCount">
         select relative_dir,count(*) as total
         from data_block
         group by relative_dir