Browse Source

更新文件同步模块中的方法

reghao 3 years ago
parent
commit
8b8153ed66

+ 21 - 0
src/main/java/cn/reghao/dfs/store/model/dto/SyncFile.java

@@ -0,0 +1,21 @@
+package cn.reghao.dfs.store.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2022-08-19 17:10:22
+ */
+@AllArgsConstructor
+@Getter
+public class SyncFile implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String fileId;
+    private String sha256sum;
+    private Long fileSize;
+    private String filename;
+}

+ 22 - 0
src/main/java/cn/reghao/dfs/store/service/FileStoreService.java

@@ -53,4 +53,26 @@ public class FileStoreService {
         fos.write(bytes);
         fos.close();
     }
+
+    public void saveFile(String absolutePath, InputStream in) throws IOException {
+        File file = new File(absolutePath);
+        if (file.exists()) {
+            return;
+        }
+
+        File parentDir = file.getParentFile();
+        if (!parentDir.exists()) {
+            FileUtils.forceMkdir(parentDir);
+        }
+
+        FileOutputStream fos = new FileOutputStream(file);
+        // 1MiB
+        int len = 1024*1024;
+        byte[] buf = new byte[len];
+        int readLen;
+        while ((readLen = in.read(buf, 0, len)) != -1) {
+            fos.write(buf, 0, readLen);
+        }
+        fos.close();
+    }
 }

+ 5 - 0
src/main/java/cn/reghao/dfs/store/service/FileUrlService.java

@@ -57,6 +57,11 @@ public class FileUrlService {
         return new PathUrl(filePath, url, path);
     }
 
+    public StoreDir getStoreDir(String sha256sum, long fileSize) {
+        //StoreDir storeDir = loadBalancer.getStoreDir(fileSize, sha256sum);
+        return loadBalancer.getStoreDir(fileSize);
+    }
+
     public PathUrl getPathUrl(String uploadId) {
         return fileUrlMapper.findPathUrl(uploadId, group, node);
     }

+ 25 - 8
src/main/java/cn/reghao/dfs/store/sync/FileSync.java

@@ -1,33 +1,50 @@
 package cn.reghao.dfs.store.sync;
 
+import cn.reghao.dfs.store.config.DfsProperties;
+import cn.reghao.dfs.store.db.mapper.FilePathMapper;
+import cn.reghao.dfs.store.model.dto.SyncFile;
 import cn.reghao.dfs.store.model.po.FilePath;
-import cn.reghao.dfs.store.model.po.FileUrl;
 import cn.reghao.dfs.store.service.FileStoreService;
 import cn.reghao.dfs.store.service.FileUrlService;
+import cn.reghao.dfs.store.util.store.StoreDir;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 /**
+ * 节点间的文件同步
+ *
  * @author reghao
  * @date 2022-08-16 20:15:13
  */
 @Service
 public class FileSync {
-    private FileUrlService fileUrlService;
-    private FileStoreService fileStoreService;
-
-    public FileSync(FileUrlService fileUrlService, FileStoreService fileStoreService) {
+    private final int group;
+    private final int node;
+    private final FileUrlService fileUrlService;
+    private final FileStoreService fileStoreService;
+    private final FilePathMapper filePathMapper;
+
+    public FileSync(DfsProperties dfsProperties, FileUrlService fileUrlService, FileStoreService fileStoreService,
+                    FilePathMapper filePathMapper) {
+        this.group = dfsProperties.getGroup();
+        this.node = dfsProperties.getNode();
         this.fileUrlService = fileUrlService;
         this.fileStoreService = fileStoreService;
+        this.filePathMapper = filePathMapper;
     }
 
     public void send(String fileId, String absolutePath) {
-
     }
 
-    public void receive(String fileId, InputStream inputStream) {
+    public void receive(SyncFile syncFile, InputStream inputStream) throws IOException {
+        StoreDir storeDir = fileUrlService.getStoreDir(syncFile.getSha256sum(), syncFile.getFileSize());
+        String dir = storeDir.getAbsoluteDirPath();
+        String absolutePath = String.format("%s/%s", dir, syncFile.getFilename());
+        fileStoreService.saveFile(absolutePath, inputStream);
 
-        FilePath filePath = new FilePath();
+        FilePath filePath = new FilePath(syncFile.getFileId(), storeDir.getBlockId(), absolutePath, group, node);
+        filePathMapper.save(filePath);
     }
 }