mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
a892f4ab36
commit
37618a32bb
|
@ -19,6 +19,22 @@
|
||||||
\item Требуется включение/исключение авторов.
|
\item Требуется включение/исключение авторов.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
|
\section{Стейт}
|
||||||
|
|
||||||
|
Исходя из требований, введём стейт как рефчан блоков транзакций, где каждая транзакция содержит
|
||||||
|
ссылку на блок, а каждый блок является \term{sstable}{sstable}, т.е индексированным, однократно
|
||||||
|
записываемым отсортированным множеством пар \texttt{(ключ, значение)}.
|
||||||
|
|
||||||
|
Такой формат гарантирует нам, что одинаковая кодовая база (в плане настроек LSM и соглашений) будет
|
||||||
|
порождать идентичные блоки.
|
||||||
|
|
||||||
|
В тоже время --- каждая отдельная <<транзакция>>, то есть <<факт>> -- не будет порождать отдельного
|
||||||
|
адресуемого объекта, таким образом, будут снижены все связанные с этим накладные расходы.
|
||||||
|
|
||||||
|
При этом мы можем относительно быстро находить блок и проверять его наличие в прочих сегментах.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% \section{Структуры данных и протоколы}
|
% \section{Структуры данных и протоколы}
|
||||||
|
|
||||||
|
|
57
flake.lock
57
flake.lock
|
@ -133,6 +133,21 @@
|
||||||
"type": "github"
|
"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": {
|
"haskell-flake-utils": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils"
|
"flake-utils": "flake-utils"
|
||||||
|
@ -229,6 +244,24 @@
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_6"
|
"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": {
|
"locked": {
|
||||||
"lastModified": 1672412555,
|
"lastModified": 1672412555,
|
||||||
"narHash": "sha256-Kaa8F7nQFR3KuS6Y9WRUxeJeZlp6CCubyrRfmiEsW4k=",
|
"narHash": "sha256-Kaa8F7nQFR3KuS6Y9WRUxeJeZlp6CCubyrRfmiEsW4k=",
|
||||||
|
@ -264,6 +297,27 @@
|
||||||
"type": "github"
|
"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": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1707451808,
|
"lastModified": 1707451808,
|
||||||
|
@ -286,6 +340,7 @@
|
||||||
"fixme": "fixme",
|
"fixme": "fixme",
|
||||||
"haskell-flake-utils": "haskell-flake-utils_4",
|
"haskell-flake-utils": "haskell-flake-utils_4",
|
||||||
"hspup": "hspup",
|
"hspup": "hspup",
|
||||||
|
"lsm": "lsm",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"saltine": "saltine",
|
"saltine": "saltine",
|
||||||
"suckless-conf": "suckless-conf_2"
|
"suckless-conf": "suckless-conf_2"
|
||||||
|
@ -332,7 +387,7 @@
|
||||||
},
|
},
|
||||||
"suckless-conf_2": {
|
"suckless-conf_2": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"haskell-flake-utils": "haskell-flake-utils_6",
|
"haskell-flake-utils": "haskell-flake-utils_7",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
|
|
|
@ -18,6 +18,9 @@ inputs = {
|
||||||
db-pipe.url = "git+https://git.hbs2.net/5xrwbTzzweS9yeJQnrrUY9gQJfhJf84pbyHhF2MMmSft";
|
db-pipe.url = "git+https://git.hbs2.net/5xrwbTzzweS9yeJQnrrUY9gQJfhJf84pbyHhF2MMmSft";
|
||||||
db-pipe.inputs.nixpkgs.follows = "nixpkgs";
|
db-pipe.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
|
lsm.url = "git+https://git.hbs2.net/5BCaH95cWsVKBmWaDNLWQr2umxzzT5kqRRKNTm2J15Ls";
|
||||||
|
lsm.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
saltine = {
|
saltine = {
|
||||||
url = "github:tel/saltine/3d3a54cf46f78b71b4b55653482fb6f4cee6b77d";
|
url = "github:tel/saltine/3d3a54cf46f78b71b4b55653482fb6f4cee6b77d";
|
||||||
flake = false;
|
flake = false;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
|
import HBS2.Git.Oracle.Prelude
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
print "hbs2-git-oracle"
|
print "hbs2-git-oracle"
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -168,13 +168,28 @@ executable git-remote-hbs2
|
||||||
default-language: GHC2021
|
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
|
executable hbs2-git-oracle
|
||||||
import: shared-properties
|
import: shared-properties
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
-- other-modules:
|
-- other-modules:
|
||||||
-- other-extensions:
|
-- other-extensions:
|
||||||
build-depends:
|
build-depends:
|
||||||
base, hbs2-git
|
base, hbs2-git, hbs2-git-oracle-oracle-lib
|
||||||
, binary
|
, binary
|
||||||
, vector
|
, vector
|
||||||
, optparse-applicative
|
, optparse-applicative
|
||||||
|
|
Loading…
Reference in New Issue