diff --git a/docs/papers/hbs2-browser/design.tex b/docs/papers/hbs2-browser/design.tex index 9ba65525..2f36ec09 100644 --- a/docs/papers/hbs2-browser/design.tex +++ b/docs/papers/hbs2-browser/design.tex @@ -19,6 +19,22 @@ \item Требуется включение/исключение авторов. \end{enumerate} +\section{Стейт} + +Исходя из требований, введём стейт как рефчан блоков транзакций, где каждая транзакция содержит +ссылку на блок, а каждый блок является \term{sstable}{sstable}, т.е индексированным, однократно +записываемым отсортированным множеством пар \texttt{(ключ, значение)}. + +Такой формат гарантирует нам, что одинаковая кодовая база (в плане настроек LSM и соглашений) будет +порождать идентичные блоки. + +В тоже время --- каждая отдельная <<транзакция>>, то есть <<факт>> -- не будет порождать отдельного +адресуемого объекта, таким образом, будут снижены все связанные с этим накладные расходы. + +При этом мы можем относительно быстро находить блок и проверять его наличие в прочих сегментах. + + + % \section{Структуры данных и протоколы} diff --git a/flake.lock b/flake.lock index 45da053e..001f1feb 100644 --- a/flake.lock +++ b/flake.lock @@ -133,6 +133,21 @@ "type": "github" } }, + "flake-utils_7": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "haskell-flake-utils": { "inputs": { "flake-utils": "flake-utils" @@ -229,6 +244,24 @@ "inputs": { "flake-utils": "flake-utils_6" }, + "locked": { + "lastModified": 1698938553, + "narHash": "sha256-oXpTKXioqFbl2mhhvpJIAvgNd+wYyv4ekI+YnJHEJ6s=", + "owner": "ivanovs-4", + "repo": "haskell-flake-utils", + "rev": "19b273b5dc401a0a565e7f75cf50a593871b80c9", + "type": "github" + }, + "original": { + "owner": "ivanovs-4", + "repo": "haskell-flake-utils", + "type": "github" + } + }, + "haskell-flake-utils_7": { + "inputs": { + "flake-utils": "flake-utils_7" + }, "locked": { "lastModified": 1672412555, "narHash": "sha256-Kaa8F7nQFR3KuS6Y9WRUxeJeZlp6CCubyrRfmiEsW4k=", @@ -264,6 +297,27 @@ "type": "github" } }, + "lsm": { + "inputs": { + "haskell-flake-utils": "haskell-flake-utils_6", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1711033804, + "narHash": "sha256-z9cb5yuWfuZmGukxsZebXhc6KUZoPVT60oXxQ6j6ML8=", + "ref": "refs/heads/master", + "rev": "0e8286a43da5b9e54c4f3ecdb994173fe77351db", + "revCount": 26, + "type": "git", + "url": "https://git.hbs2.net/5BCaH95cWsVKBmWaDNLWQr2umxzzT5kqRRKNTm2J15Ls" + }, + "original": { + "type": "git", + "url": "https://git.hbs2.net/5BCaH95cWsVKBmWaDNLWQr2umxzzT5kqRRKNTm2J15Ls" + } + }, "nixpkgs": { "locked": { "lastModified": 1707451808, @@ -286,6 +340,7 @@ "fixme": "fixme", "haskell-flake-utils": "haskell-flake-utils_4", "hspup": "hspup", + "lsm": "lsm", "nixpkgs": "nixpkgs", "saltine": "saltine", "suckless-conf": "suckless-conf_2" @@ -332,7 +387,7 @@ }, "suckless-conf_2": { "inputs": { - "haskell-flake-utils": "haskell-flake-utils_6", + "haskell-flake-utils": "haskell-flake-utils_7", "nixpkgs": [ "nixpkgs" ] diff --git a/flake.nix b/flake.nix index 8373d009..51294f2f 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,9 @@ inputs = { db-pipe.url = "git+https://git.hbs2.net/5xrwbTzzweS9yeJQnrrUY9gQJfhJf84pbyHhF2MMmSft"; db-pipe.inputs.nixpkgs.follows = "nixpkgs"; + lsm.url = "git+https://git.hbs2.net/5BCaH95cWsVKBmWaDNLWQr2umxzzT5kqRRKNTm2J15Ls"; + lsm.inputs.nixpkgs.follows = "nixpkgs"; + saltine = { url = "github:tel/saltine/3d3a54cf46f78b71b4b55653482fb6f4cee6b77d"; flake = false; diff --git a/hbs2-git/hbs2-git-oracle/app/Main.hs b/hbs2-git/hbs2-git-oracle/app/Main.hs index 2eff49f4..fa399b3d 100644 --- a/hbs2-git/hbs2-git-oracle/app/Main.hs +++ b/hbs2-git/hbs2-git-oracle/app/Main.hs @@ -1,5 +1,7 @@ module Main where +import HBS2.Git.Oracle.Prelude + main :: IO () main = do print "hbs2-git-oracle" diff --git a/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/App.hs b/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/App.hs new file mode 100644 index 00000000..f61ed714 --- /dev/null +++ b/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/App.hs @@ -0,0 +1,31 @@ +module HBS2.Git.Oracle.App where + +import HBS2.Git.Oracle.Prelude + +import Control.Monad.Reader + +data OracleEnv = + OracleEnv + { + } + deriving stock (Generic) + +newtype Oracle m a = + Oracle { fromOracle :: ReaderT OracleEnv m a } + deriving newtype ( Applicative + , Functor + , Monad + , MonadTrans + , MonadReader OracleEnv + , MonadIO + , MonadUnliftIO + ) + +newOracleEnv :: MonadIO m => m OracleEnv +newOracleEnv = pure OracleEnv + +withOracleEnv :: MonadIO m => OracleEnv -> Oracle m a -> m a +withOracleEnv env m = runReaderT (fromOracle m) env + + + diff --git a/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/Prelude.hs b/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/Prelude.hs new file mode 100644 index 00000000..5dfb14e8 --- /dev/null +++ b/hbs2-git/hbs2-git-oracle/lib/HBS2/Git/Oracle/Prelude.hs @@ -0,0 +1,12 @@ +module HBS2.Git.Oracle.Prelude + ( module HBS2.Prelude.Plated + , module Control.Monad.Reader.Class + , module UnliftIO + ) where + +import HBS2.Prelude.Plated + +import Control.Monad.Reader.Class +import UnliftIO + + diff --git a/hbs2-git/hbs2-git.cabal b/hbs2-git/hbs2-git.cabal index 4b3960f0..ba1b006d 100644 --- a/hbs2-git/hbs2-git.cabal +++ b/hbs2-git/hbs2-git.cabal @@ -168,13 +168,28 @@ executable git-remote-hbs2 default-language: GHC2021 +library hbs2-git-oracle-oracle-lib + import: shared-properties + + exposed-modules: + HBS2.Git.Oracle.Prelude + HBS2.Git.Oracle.App + + build-depends: base + , base16-bytestring + , binary + , unix + + hs-source-dirs: hbs2-git-oracle/lib + + executable hbs2-git-oracle import: shared-properties main-is: Main.hs -- other-modules: -- other-extensions: build-depends: - base, hbs2-git + base, hbs2-git, hbs2-git-oracle-oracle-lib , binary , vector , optparse-applicative