From 504465f8e2922c473076ece934af358947b10f99 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:31:11 +0100 Subject: [PATCH] xftp: add 64kb file chunk (#842) * xftp: add 64kb file chunk * disable chunk size 64kb in the agent * revert rename --- simplexmq.cabal | 1 + src/Simplex/FileTransfer/Chunks.hs | 35 +++++++++++++++++++++++++ src/Simplex/FileTransfer/Client/Main.hs | 19 +++++--------- src/Simplex/FileTransfer/Description.hs | 13 +-------- src/Simplex/FileTransfer/Server/Main.hs | 5 ++-- 5 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 src/Simplex/FileTransfer/Chunks.hs diff --git a/simplexmq.cabal b/simplexmq.cabal index 7850890bc..ef75bdec0 100644 --- a/simplexmq.cabal +++ b/simplexmq.cabal @@ -35,6 +35,7 @@ flag swift library exposed-modules: Simplex.FileTransfer.Agent + Simplex.FileTransfer.Chunks Simplex.FileTransfer.Client Simplex.FileTransfer.Client.Agent Simplex.FileTransfer.Client.Main diff --git a/src/Simplex/FileTransfer/Chunks.hs b/src/Simplex/FileTransfer/Chunks.hs new file mode 100644 index 000000000..0b35649c5 --- /dev/null +++ b/src/Simplex/FileTransfer/Chunks.hs @@ -0,0 +1,35 @@ +module Simplex.FileTransfer.Chunks where + +import Data.Word (Word32) + +serverChunkSizes :: [Word32] +serverChunkSizes = [chunkSize0, chunkSize1, chunkSize2, chunkSize3] +{-# INLINE serverChunkSizes #-} + +chunkSize0 :: Word32 +chunkSize0 = kb 64 +{-# INLINE chunkSize0 #-} + +chunkSize1 :: Word32 +chunkSize1 = kb 256 +{-# INLINE chunkSize1 #-} + +chunkSize2 :: Word32 +chunkSize2 = mb 1 +{-# INLINE chunkSize2 #-} + +chunkSize3 :: Word32 +chunkSize3 = mb 4 +{-# INLINE chunkSize3 #-} + +kb :: Integral a => a -> a +kb n = 1024 * n +{-# INLINE kb #-} + +mb :: Integral a => a -> a +mb n = 1024 * kb n +{-# INLINE mb #-} + +gb :: Integral a => a -> a +gb n = 1024 * mb n +{-# INLINE gb #-} diff --git a/src/Simplex/FileTransfer/Client/Main.hs b/src/Simplex/FileTransfer/Client/Main.hs index b40169def..65de06ed4 100644 --- a/src/Simplex/FileTransfer/Client/Main.hs +++ b/src/Simplex/FileTransfer/Client/Main.hs @@ -17,9 +17,6 @@ module Simplex.FileTransfer.Client.Main cliSendFileOpts, prepareChunkSizes, prepareChunkSpecs, - chunkSize1, - chunkSize2, - chunkSize3, maxFileSize, fileSizeLen, getChunkDigest, @@ -49,6 +46,7 @@ import qualified Data.Text as T import Data.Word (Word32) import GHC.Records (HasField (getField)) import Options.Applicative +import Simplex.FileTransfer.Chunks import Simplex.FileTransfer.Client import Simplex.FileTransfer.Client.Agent import Simplex.FileTransfer.Client.Presets @@ -78,15 +76,6 @@ import UnliftIO.Directory xftpClientVersion :: String xftpClientVersion = "1.0.1" -chunkSize1 :: Word32 -chunkSize1 = kb 256 - -chunkSize2 :: Word32 -chunkSize2 = mb 1 - -chunkSize3 :: Word32 -chunkSize3 = mb 4 - maxFileSize :: Int64 maxFileSize = gb 1 @@ -533,7 +522,11 @@ getFileDescription' path = prepareChunkSizes :: Int64 -> [Word32] prepareChunkSizes size' = prepareSizes size' where - (smallSize, bigSize) = if size' > size34 chunkSize3 then (chunkSize2, chunkSize3) else (chunkSize1, chunkSize2) + (smallSize, bigSize) + | size' > size34 chunkSize3 = (chunkSize2, chunkSize3) + | otherwise = (chunkSize1, chunkSize2) + -- | size' > size34 chunkSize2 = (chunkSize1, chunkSize2) + -- | otherwise = (chunkSize0, chunkSize1) size34 sz = (fromIntegral sz * 3) `div` 4 prepareSizes 0 = [] prepareSizes size diff --git a/src/Simplex/FileTransfer/Description.hs b/src/Simplex/FileTransfer/Description.hs index 0fa99e372..a28b3ae13 100644 --- a/src/Simplex/FileTransfer/Description.hs +++ b/src/Simplex/FileTransfer/Description.hs @@ -53,6 +53,7 @@ import qualified Data.Yaml as Y import Database.SQLite.Simple.FromField (FromField (..)) import Database.SQLite.Simple.ToField (ToField (..)) import GHC.Generics (Generic) +import Simplex.FileTransfer.Chunks import Simplex.FileTransfer.Protocol import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Encoding.String @@ -236,18 +237,6 @@ instance (Integral a, Show a) => StrEncoding (FileSize a) where A.decimal ] -kb :: Integral a => a -> a -kb n = 1024 * n -{-# INLINE kb #-} - -mb :: Integral a => a -> a -mb n = 1024 * kb n -{-# INLINE mb #-} - -gb :: Integral a => a -> a -gb n = 1024 * mb n -{-# INLINE gb #-} - instance (Integral a, Show a) => IsString (FileSize a) where fromString = either error id . strDecode . B.pack diff --git a/src/Simplex/FileTransfer/Server/Main.hs b/src/Simplex/FileTransfer/Server/Main.hs index 5da183437..50f7c97c8 100644 --- a/src/Simplex/FileTransfer/Server/Main.hs +++ b/src/Simplex/FileTransfer/Server/Main.hs @@ -16,7 +16,8 @@ import Data.Maybe (fromMaybe) import qualified Data.Text as T import Network.Socket (HostName) import Options.Applicative -import Simplex.FileTransfer.Description (FileSize (..), kb, mb) +import Simplex.FileTransfer.Chunks +import Simplex.FileTransfer.Description (FileSize (..)) import Simplex.FileTransfer.Server (runXFTPServer) import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..), defaultFileExpiration, defFileExpirationHours) import qualified Simplex.Messaging.Crypto as C @@ -138,7 +139,7 @@ xftpServerCLI cfgPath logPath = do storeLogFile = enableStoreLog $> storeLogFilePath, filesPath = T.unpack $ strictIni "FILES" "path" ini, fileSizeQuota = either error unFileSize <$> strDecodeIni "FILES" "storage_quota" ini, - allowedChunkSizes = [kb 256, mb 1, mb 4], + allowedChunkSizes = serverChunkSizes, allowNewFiles = fromMaybe True $ iniOnOff "AUTH" "new_files" ini, newFileBasicAuth = either error id <$> strDecodeIni "AUTH" "create_password" ini, fileExpiration =