diff --git a/cabal-nix.project b/cabal-nix.project index 8a0391d..793b823 100644 --- a/cabal-nix.project +++ b/cabal-nix.project @@ -2,6 +2,7 @@ packages: ./metadata-lib ./metadata-server ./metadata-store-postgres + ./metadata-store-file ./metadata-webhook ./metadata-validator-github ./token-metadata-creator diff --git a/cabal.project b/cabal.project index 166ae1f..6155cf8 100644 --- a/cabal.project +++ b/cabal.project @@ -5,6 +5,7 @@ packages: ./metadata-server ./metadata-webhook ./metadata-store-postgres + ./metadata-store-file ./metadata-validator-github ./token-metadata-creator ./metadata-sync diff --git a/metadata-lib/src/Test/Cardano/Metadata/Generators.hs b/metadata-lib/src/Test/Cardano/Metadata/Generators.hs index 621f558..b50d339 100644 --- a/metadata-lib/src/Test/Cardano/Metadata/Generators.hs +++ b/metadata-lib/src/Test/Cardano/Metadata/Generators.hs @@ -75,7 +75,7 @@ complexType = <*> Gen.map (Range.linear 0 20) ((,) <$> key <*> val) complexKey :: MonadGen m => m ComplexKey -complexKey = unSubject <$> subject +complexKey = Gen.text (Range.linear 1 255) Gen.alphaNum complexKeyVals :: MonadGen m => m [(ComplexKey, ComplexType)] complexKeyVals = Gen.list (Range.linear 0 20) ((,) <$> complexKey <*> complexType) diff --git a/metadata-server/metadata-server.cabal b/metadata-server/metadata-server.cabal index 75488cb..9a040c2 100644 --- a/metadata-server/metadata-server.cabal +++ b/metadata-server/metadata-server.cabal @@ -19,7 +19,7 @@ executable metadata-server , lens , lens-aeson , metadata-lib - , metadata-store-postgres + , metadata-store-file , monad-logger , mtl , persistent-postgresql @@ -40,6 +40,7 @@ executable metadata-server -Wincomplete-uni-patterns -Wno-unsafe -threaded + -rtsopts other-modules: Paths_metadata_server Config \ No newline at end of file diff --git a/metadata-server/src/Config.hs b/metadata-server/src/Config.hs index 18adb75..32d7a26 100644 --- a/metadata-server/src/Config.hs +++ b/metadata-server/src/Config.hs @@ -2,7 +2,7 @@ module Config where import Options.Applicative -import Cardano.Metadata.Store.Postgres.Config +import Cardano.Metadata.Store.File.Config ( Opts, parseOpts ) opts :: ParserInfo Opts diff --git a/metadata-server/src/Main.hs b/metadata-server/src/Main.hs index 0aceed3..3697f64 100644 --- a/metadata-server/src/Main.hs +++ b/metadata-server/src/Main.hs @@ -21,25 +21,19 @@ import qualified Options.Applicative as Opt import Cardano.Metadata.Server ( webApp ) -import qualified Cardano.Metadata.Store.Postgres as Store -import Cardano.Metadata.Store.Postgres.Config - ( Opts (..), pgConnectionString ) +import qualified Cardano.Metadata.Store.File as Store +import Cardano.Metadata.Store.File.Config + ( Opts (..) ) import Config ( opts ) main :: IO () main = do - options@(Opts { optDbConnections = numDbConns - , optDbMetadataTableName = tableName + options@(Opts { optMetadataLocation = folder , optServerPort = port }) <- Opt.execParser opts - let pgConnString = pgConnectionString options - putStrLn $ "Connecting to database using connection string: " <> BC.unpack pgConnString - runStdoutLoggingT $ - Postgresql.withPostgresqlPool pgConnString numDbConns $ \pool -> liftIO $ do - putStrLn $ "Initializing table '" <> tableName <> "'." - intf <- Store.postgresStore pool (T.pack tableName) - - putStrLn $ "Metadata server is starting on port " <> show port <> "." - liftIO $ Warp.run port (webApp intf) + putStrLn $ "Using file store at: " <> folder + intf <- Store.fileStore folder + putStrLn $ "Metadata server is starting on port " <> show port <> "." + liftIO $ Warp.run port (webApp intf) diff --git a/metadata-store-file/metadata-store-file.cabal b/metadata-store-file/metadata-store-file.cabal new file mode 100644 index 0000000..47b7b9b --- /dev/null +++ b/metadata-store-file/metadata-store-file.cabal @@ -0,0 +1,88 @@ +cabal-version: >=1.10 +name: metadata-store-file +version: 0.1.0.0 +author: Samuel Evans-Powell +maintainer: mail@sevanspowell.net +build-type: Simple +extra-source-files: CHANGELOG + +library + hs-source-dirs: src + + exposed-modules: Cardano.Metadata.Store.File + Cardano.Metadata.Store.File.Config + + build-depends: aeson + , base + , bytestring + , containers + , directory + , metadata-lib + , mtl + , filepath + , optparse-applicative + , safe-exceptions + , scientific + , text + , unordered-containers + , warp + + ghc-options: -Wall + -Wincomplete-record-updates + -Wincomplete-uni-patterns + -Wincomplete-patterns + -Wredundant-constraints + -Wpartial-fields + -Wcompat + -rtsopts + +test-suite integration-tests + hs-source-dirs: test + main-is: Main.hs + type: exitcode-stdio-1.0 + + build-depends: base >=4.12 && <5 + , HUnit + , QuickCheck + , aeson + , aeson-pretty + , base + , bytestring + , casing + , containers + , directory + , hedgehog + , hspec + , http-client + , lens + , lens-aeson + , metadata-lib + , metadata-store-file + , monad-logger + , mtl + , raw-strings-qq + , resource-pool + , safe-exceptions + , scientific + , servant + , servant-client + , servant-server + , smallcheck + , tagged + , tasty + , tasty-hedgehog + , tasty-hspec + , tasty-hunit + , tasty-quickcheck + , text + , unordered-containers + , wai + , warp + + ghc-options: -Wall + -Wincomplete-record-updates + -Wincomplete-uni-patterns + -Wincomplete-patterns + -Wredundant-constraints + -Wpartial-fields + -Wcompat \ No newline at end of file diff --git a/metadata-store-file/src/Cardano/Metadata/Store/File.hs b/metadata-store-file/src/Cardano/Metadata/Store/File.hs new file mode 100644 index 0000000..cd37987 --- /dev/null +++ b/metadata-store-file/src/Cardano/Metadata/Store/File.hs @@ -0,0 +1,166 @@ +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE IncoherentInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TypeFamilies #-} + +module Cardano.Metadata.Store.File + ( read + , write + , update + , delete + , empty + , toList + , init + , fileStore + ) where + +import Cardano.Metadata.Store.Types +import Control.Exception.Safe +import Control.Monad.Reader +import Data.Aeson + ( FromJSON, FromJSONKey, ToJSON, ToJSONKey ) +import qualified Data.Aeson as Aeson +import qualified Data.Aeson.Encoding.Internal as Aeson +import qualified Data.Aeson.Types as Aeson +import Data.Coerce + ( coerce ) +import Data.Maybe + ( catMaybes, fromMaybe ) +import Data.Text + ( Text ) +import qualified Data.Text as T +import qualified Data.Text.Lazy as TL +import qualified Data.Text.Lazy.Encoding as TLE +import Prelude hiding + ( init, read ) +import System.Directory +import System.FilePath.Posix + ( takeFileName ) + +data PostgresKeyValueException = UniqueKeyConstraintViolated + | FailedToDecodeJSONValue String Text + deriving (Eq, Show, Exception) + +data KeyValue k v = KeyValue { _kvFolder :: FilePath } + +init + :: FilePath + -- ^ Folder containing metadata entries + -> IO (KeyValue k v) + -- ^ Resulting key-value store +init = pure . KeyValue + +fileStore + :: ( ToJSONKey k + , ToJSON v + , FromJSONKey k + , FromJSON v + ) + => FilePath + -- ^ Folder containing metadata entries + -> IO (StoreInterface k v) +fileStore folder = do + let kvs = KeyValue folder + pure $ StoreInterface (\k -> read k kvs) + (\ks -> readBatch ks kvs) + (\k v -> write k v kvs) + (\k -> delete k kvs) + (\f k -> update f k kvs) + (toList kvs) + (empty kvs) + +-- | Ensure file path is within folder. +safeFilePath :: ToJSONKey k => KeyValue k v -> k -> FilePath +safeFilePath (KeyValue folder) k = + let + -- Disallow user to enter a sub-directory or a parent directory by + -- limiting the requested path to a file name. I.e. "../x.txt" and + -- "inner/x.txt" are normalised to "x.txt" to restrict the user + -- from looking outside the specified folder. + raw :: FilePath + raw = takeFileName . T.unpack $ toJSONKeyText k + in + folder <> "/" <> raw + +withFileIfExists :: ToJSONKey k => KeyValue k v -> k -> (FilePath -> IO r) -> IO (Maybe r) +withFileIfExists kvs k f = do + let safe = safeFilePath kvs k + exists <- doesFileExist safe + if exists + then do + r <- f safe + pure $ Just r + else pure Nothing + +read :: (ToJSONKey k, FromJSON v) => k -> KeyValue k v -> IO (Maybe v) +read k kvs = do + withFileIfExists kvs k $ \safe -> + Aeson.eitherDecodeFileStrict' safe + >>= (\v -> handleJSONDecodeError (T.pack safe) v) + +readBatch :: (ToJSONKey k, FromJSON v) => [k] -> KeyValue k v -> IO [v] +readBatch [] _kvs = pure [] +readBatch ks kvs = fmap catMaybes $ forM ks (\k -> read k kvs) + +write :: (ToJSONKey k, ToJSON v) => k -> v -> KeyValue k v -> IO () +write k v kvs = + let + safe = safeFilePath kvs k + in + Aeson.encodeFile safe v + +delete :: ToJSONKey k => k -> KeyValue k v -> IO () +delete k kvs = + fromMaybe () <$> withFileIfExists kvs k removeFile + +update :: (ToJSONKey k, ToJSON v, FromJSON v) => (v -> Maybe v) -> k -> KeyValue k v -> IO () +update fv k kvs = do + mv <- read k kvs + case mv of + Nothing -> pure () + Just v -> case fv v of + Nothing -> delete k kvs + Just newValue -> write k newValue kvs + +toList :: (ToJSONKey k, FromJSONKey k, FromJSON v) => KeyValue k v -> IO [(k, v)] +toList kvs@(KeyValue folder) = do + ks <- fmap (fmap T.pack) $ listDirectory folder + forM ks $ \kText -> do + k <- handleJSONDecodeError kText $ decodeJSONKey kText + mV <- read k kvs + pure $ maybe (error $ "Unable to find file with name '" <> (T.unpack $ toJSONKeyText k) <> "'") (k,) mV + +empty :: (FromJSONKey k, ToJSONKey k) => KeyValue k v -> IO () +empty kvs@(KeyValue folder) = do + ks <- fmap (fmap T.pack) $ listDirectory folder + void . forM ks $ \kText -> do + k <- handleJSONDecodeError undefined $ decodeJSONKey kText + delete k kvs + +handleJSONDecodeError :: Text -> Either String a -> IO a +handleJSONDecodeError t = either (\err -> throw $ FailedToDecodeJSONValue err t) pure + +toJSONKeyText :: ToJSONKey k => k -> Text +toJSONKeyText k = + case Aeson.toJSONKey of + Aeson.ToJSONKeyText f _ -> f k + Aeson.ToJSONKeyValue _ f -> TL.toStrict $ TLE.decodeUtf8 $ Aeson.encodingToLazyByteString $ f k + +decodeJSONKey :: FromJSONKey k => Text -> Either String k +decodeJSONKey t = case Aeson.fromJSONKey of + Aeson.FromJSONKeyCoerce -> pure $ coerce t + Aeson.FromJSONKeyText f -> pure $ f t + Aeson.FromJSONKeyTextParser p -> Aeson.parseEither p t + Aeson.FromJSONKeyValue pv -> do + (v :: Aeson.Value) <- Aeson.eitherDecode (TLE.encodeUtf8 . TL.fromStrict $ t) + Aeson.parseEither pv v diff --git a/metadata-store-file/src/Cardano/Metadata/Store/File/Config.hs b/metadata-store-file/src/Cardano/Metadata/Store/File/Config.hs new file mode 100644 index 0000000..d7dd1cd --- /dev/null +++ b/metadata-store-file/src/Cardano/Metadata/Store/File/Config.hs @@ -0,0 +1,15 @@ +module Cardano.Metadata.Store.File.Config where + +import qualified Network.Wai.Handler.Warp as Warp +import Options.Applicative + +data Opts = Opts + { optMetadataLocation :: FilePath + , optServerPort :: Warp.Port + } + deriving (Eq, Show) + +parseOpts :: Parser Opts +parseOpts = Opts + <$> strOption (long "folder" <> metavar "FOLDER" <> help "Folder containing the metadata entries") + <*> option auto (short 'p' <> long "port" <> metavar "PORT" <> showDefault <> value 8080 <> help "Port to run the metadata web server on") diff --git a/metadata-store-file/test/Main.hs b/metadata-store-file/test/Main.hs new file mode 100644 index 0000000..577feca --- /dev/null +++ b/metadata-store-file/test/Main.hs @@ -0,0 +1,74 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeApplications #-} + +import Control.Monad.IO.Class + ( liftIO ) +import Data.Proxy + ( Proxy (Proxy) ) +import Data.Tagged + ( Tagged, unTagged ) +import Data.Text + ( Text ) +import Data.Word + ( Word8 ) +import Test.Tasty + ( TestTree + , askOption + , defaultIngredients + , defaultMainWithIngredients + , includingOptions + , testGroup + , withResource + ) +import Test.Tasty.Options + +import Cardano.Metadata.Store.File +import Cardano.Metadata.Store.Types +import Test.Cardano.Metadata.Generators + ( ComplexType ) +import Test.Cardano.Metadata.Store + +newtype Folder = Folder { _folder :: FilePath } + +instance IsOption Folder where + defaultValue = error $ "'" <> unTagged (optionName :: Tagged Folder String) <> "' is required." + parseValue str = Just $ Folder str + optionName = pure "folder" + optionHelp = pure "Folder to store and retrieve metadata entries from." + +main :: IO () +main = + defaultMainWithIngredients + ((includingOptions + [ Option (Proxy @Folder) ] + ) + : defaultIngredients + ) + testsWithStore + +testsWithStore :: TestTree +testsWithStore = + askOption $ \(Folder folder) -> + withResource + (do + fileIntf1 <- liftIO $ fileStore folder + fileIntf2 <- liftIO $ fileStore folder + + pure (fileIntf1, fileIntf2) + ) + (const $ pure ()) + tests + +tests + :: IO ( StoreInterface Word8 Word8 + , StoreInterface Text ComplexType + ) + -> TestTree +tests resources = + testGroup "integration tests" + [ + testGroup "File data store implementation" + [ testKeyValueImplementation $ (\(intf, _) -> intf) <$> resources + , testKeyValueComplexTypeImplementation $ (\(_, intf) -> intf) <$> resources + ] + ] diff --git a/metadata-store-postgres/metadata-store-postgres.cabal b/metadata-store-postgres/metadata-store-postgres.cabal index 209bbde..ddb6000 100644 --- a/metadata-store-postgres/metadata-store-postgres.cabal +++ b/metadata-store-postgres/metadata-store-postgres.cabal @@ -46,6 +46,7 @@ library -Wredundant-constraints -Wpartial-fields -Wcompat + -rtsopts test-suite integration-tests hs-source-dirs: test diff --git a/nix/haskell.nix b/nix/haskell.nix index 1c7b673..6c09d44 100644 --- a/nix/haskell.nix +++ b/nix/haskell.nix @@ -40,6 +40,7 @@ let packages.metadata-webhook = filterSubDir "metadata-webhook"; packages.metadata-sync = filterSubDir "metadata-sync"; packages.metadata-store-postgres = filterSubDir "metadata-store-postgres"; + packages.metadata-store-file = filterSubDir "metadata-store-file"; packages.metadata-validator-github = filterSubDir "metadata-validator-github"; } # Enable release flag (optimization and -Werror) on all local packages @@ -49,6 +50,7 @@ let packages.metadata-webhook.flags.release = true; packages.metadata-sync.flags.release = true; packages.metadata-store-postgres.flags.release = true; + packages.metadata-store-file.flags.release = true; packages.metadata-validator-github.flags.release = true; } { @@ -60,6 +62,8 @@ let # Enable profiling on executables if the profiling argument is set. (lib.optionalAttrs profiling { enableLibraryProfiling = true; + packages.metadata-store-postgres.components.library.enableLibraryProfiling = true; + packages.metadata-store-file.components.library.enableLibraryProfiling = true; packages.metadata-server.components.exes.metadata-server.enableExecutableProfiling = true; packages.metadata-webhook.components.exes.metadata-webhook.enableExecutableProfiling = true; packages.metadata-sync.components.exes.metadata-sync.enableExecutableProfiling = true; @@ -109,8 +113,8 @@ let ]; } { - packages.metadata-store-postgres.components.tests.integration-tests.doCheck = false; packages.metadata-sync.components.tests.integration-tests.doCheck = false; + packages.metadata-store-file.components.tests.integration-tests.doCheck = false; } ]; }); diff --git a/nix/nixos/metadata-server.nix b/nix/nixos/metadata-server.nix index e29c52e..7a50b93 100644 --- a/nix/nixos/metadata-server.nix +++ b/nix/nixos/metadata-server.nix @@ -36,38 +36,18 @@ in { default = 8080; description = "the port the metadata server runs on"; }; - postgres = { - socketdir = lib.mkOption { - type = lib.types.str; - default = "/run/postgresql"; - description = "the path to the postgresql socket"; - }; - port = lib.mkOption { - type = lib.types.int; - default = 5432; - description = "the postgresql port"; - }; - database = lib.mkOption { - type = lib.types.str; - # Postgresql cannot have a hyphen (`-`) - default = "metadata_server"; - description = "the postgresql database to use"; - }; - table = lib.mkOption { - type = lib.types.str; - default = "metadata"; - description = "the postgresql database table to use"; - }; - user = lib.mkOption { + extraFlags = lib.mkOption { + type = with lib.types; listOf str; + default = []; + description = '' + Extra flags to pass to the metadata-server executable. + ''; + example = ["+RTS" "-M500M" "-RTS"]; + }; + fileStore = { + folder = lib.mkOption { type = lib.types.str; - # Postgresql cannot have a hyphen (`-`) - default = "metadata_user"; - description = "the postgresql user to use"; - }; - numConnections = lib.mkOption { - type = lib.types.int; - default = 1; - description = "the number of connections to open to the postgresql database"; + description = "The path to the folder where the metadata entries are stored."; }; }; }; @@ -75,15 +55,10 @@ in { config = lib.mkIf cfg.enable { services.metadata-server.script = let exec = "metadata-server"; - cmd = builtins.filter (x: x != "") [ + cmd = builtins.filter (x: x != "") ([ "${cfg.package}/bin/${exec}" - "--db ${config.services.metadata-server.postgres.database}" - "--db-user ${config.services.metadata-server.postgres.user}" - "--db-host ${config.services.metadata-server.postgres.socketdir}" - "--db-table ${config.services.metadata-server.postgres.table}" - "--db-conns ${toString config.services.metadata-server.postgres.numConnections}" - "--port ${toString config.services.metadata-server.port}" - ]; + "--folder ${config.services.metadata-server.fileStore.folder}" + ] ++ cfg.extraFlags); in pkgs.writeShellScript "metadata-server" '' set -euo pipefail echo "Starting ${exec}: ${lib.concatStringsSep "\"\n echo \"" cmd}" @@ -91,17 +66,8 @@ in { echo "${toString cmd}" exec ${toString cmd} ''; - environment.systemPackages = [ cfg.package config.services.postgresql.package ]; systemd.services.metadata-server = { - path = [ cfg.package pkgs.netcat pkgs.postgresql ]; - preStart = '' - for x in {1..60}; do - nc -z localhost ${toString config.services.metadata-server.postgres.port} && break - echo loop $x: waiting for postgresql 2 sec... - sleep 2 - done - sleep 1 - ''; + path = [ cfg.package ]; serviceConfig = { ExecStart = config.services.metadata-server.script; DynamicUser = true; @@ -111,8 +77,6 @@ in { }; wantedBy = [ "multi-user.target" ]; - after = [ "postgres.service" ]; - requires = [ "postgresql.service" ]; }; }; } diff --git a/nix/nixos/tests/default.nix b/nix/nixos/tests/default.nix index c097ff2..63843cf 100644 --- a/nix/nixos/tests/default.nix +++ b/nix/nixos/tests/default.nix @@ -18,6 +18,8 @@ with pkgs.commonLib; in rec { metadataStorePostgres = callTest ./metadata-store-postgres.nix { inherit haskellPackages; }; metadataSync = callTest ./metadata-sync.nix { inherit haskellPackages; }; + metadataStoreFile = callTest ./metadata-store-file.nix { inherit haskellPackages; }; + memUsage = callTest ./mem-usage.nix {}; # Test will require local faucet setup # asset = callTest ./docs/asset.nix { inherit (pkgs.commonLib) sources; }; noNixSetup = callTest ./docs/no-nix-setup.nix { inherit haskellPackages; }; diff --git a/nix/nixos/tests/mem-usage.nix b/nix/nixos/tests/mem-usage.nix new file mode 100644 index 0000000..2cc6d17 --- /dev/null +++ b/nix/nixos/tests/mem-usage.nix @@ -0,0 +1,136 @@ +{ pkgs, ... }: +with pkgs; +let + # Single source of truth for all tutorial constants + database = "postgres"; + schema = "api"; + table = "metadata"; + user = "metadata-server"; + postgresUser = "metadata_server"; + password = "mysecretpassword"; + webRole = "web_anon"; + postgresPort = 5432; + metadataServerPort = 8080; + metadataWorkingDir = "/run/metadata-server"; + + totalMem = 1024; + allowedMem = 100; + + vegetaCommands = pkgs.callPackage ./mem-usage/vegeta-attack.nix { port = metadataServerPort; }; + vegetaGo = pkgs.writeShellScriptBin "vegeta-go" '' + cat ${vegetaCommands} | vegeta attack -duration 10s -connections 1 -rate 100/s -output vegeta.log + ''; +in +{ + name = "metadata-server-mem-usage-test"; + + nodes = { + server = { config, ... }: { + nixpkgs.pkgs = pkgs; + imports = [ + ../. + ]; + + virtualisation.memorySize = totalMem; + + environment.systemPackages = [ pkgs.vegeta pkgs.htop vegetaGo pkgs.haskellPackages.hp2pretty pkgs.haskellPackages.profiteur ]; + + services.postgresql = { + enable = true; + port = postgresPort; + package = pkgs.postgresql; + ensureDatabases = [ "${database}" ]; + ensureUsers = [ + { + name = "${postgresUser}"; + ensurePermissions = { + "DATABASE ${database}" = "ALL PRIVILEGES"; + }; + } + ]; + identMap = '' + metadata-server-users root ${postgresUser} + metadata-server-users ${user} ${postgresUser} + metadata-server-users postgres postgres + ''; + authentication = '' + local all all ident map=metadata-server-users + ''; + + settings = + { + log_connections = true; + # log_statement = "all"; + logging_collector = true; + log_disconnections = true; + log_destination = lib.mkForce "syslog"; + }; + }; + + users = { + mutableUsers = false; + + users = { + # For ease of debugging the VM as the `root` user + root.password = ""; + + # Create a system user that matches the database user so that we + # can use peer authentication. + "${user}".isSystemUser = true; + }; + }; + + services.metadata-server = { + enable = true; + + user = user; + port = metadataServerPort; + + fileStore.folder = "/"; + + extraFlags = ["+RTS" "-h" "-p" "-RTS"]; + + metadataServerPkgs = (import ../../../. {}).profiledProject; + }; + systemd.services.metadata-server.serviceConfig.WorkingDirectory = metadataWorkingDir; + systemd.services.metadata-server.serviceConfig.RuntimeDirectoryPreserve = true; + systemd.services.metadata-server.serviceConfig.KillSignal = "SIGINT"; + systemd.services.metadata-server.serviceConfig.TimeoutStopSec = "10"; + + systemd.tmpfiles.rules = [ + "L /root/vegeta.atk - - - - ${vegetaCommands}" + ]; + }; + }; + + testScript = + '' + # fmt: off + import os + import pathlib + + start_all() + + server.wait_for_open_port(${toString metadataServerPort}) + server.succeed("cat ${vegetaCommands} | vegeta attack -duration 10s -connections 1 -rate 10/s") + # Stop metadata-server.service so GHC writes out .prof file contents + server.succeed("systemctl stop metadata-server.service") + server.succeed("sleep 10") + server.succeed("cd ${metadataWorkingDir} && hp2pretty metadata-server.hp") + server.succeed("cd ${metadataWorkingDir} && profiteur metadata-server.prof") + server.copy_from_vm("${metadataWorkingDir}/metadata-server.svg") + server.copy_from_vm("${metadataWorkingDir}/metadata-server.prof") + server.copy_from_vm("${metadataWorkingDir}/metadata-server.prof.html") + + def write_hydra_build_products(data): + out_dir = pathlib.Path(os.environ.get("out", os.getcwd())) + hydra_build_products = out_dir / "nix-support" / "hydra-build-products" + hydra_build_products.parent.mkdir(exist_ok=True, parents=True) + with hydra_build_products.open(mode="a") as f: + f.write(data.format(out_dir) + "\n") + + write_hydra_build_products("file svg {}/metadata-server.svg") + write_hydra_build_products("file html {}/metadata-server.prof.html") + write_hydra_build_products("file text {}/metadata-server.prof") + ''; +} diff --git a/nix/nixos/tests/mem-usage/large-query.json b/nix/nixos/tests/mem-usage/large-query.json new file mode 100644 index 0000000..a7ab02d --- /dev/null +++ b/nix/nixos/tests/mem-usage/large-query.json @@ -0,0 +1,500 @@ +{ + "subjects": [ + "5e3ff95a3447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303231", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031354643303031", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031354643303030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031345253", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643313030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303939", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303938", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303937", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303936", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303935", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303934", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303933", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303932", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303931", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303930", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303839", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303838", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303837", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303836", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303835", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303834", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303833", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303832", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303831", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303830", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303739", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303738", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303737", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303736", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303735", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303734", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303733", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303732", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303731", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303730", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303639", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303638", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303637", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303636", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303635", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303634", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303633", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303632", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303631", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303630", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303539", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303538", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303537", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303536", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303535", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303534", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303533", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303532", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303531", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303530", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303439", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303438", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303437", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303436", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303435", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303434", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303433", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303432", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303431", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303430", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303339", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303338", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303337", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303336", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303335", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303334", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303333", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303332", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303331", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303330", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303239", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303238", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303237", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303236", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303235", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303234", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303233", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303232", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303231", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303230", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303139", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303138", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303137", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303136", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303135", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303134", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303133", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303132", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303131", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303130", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303039", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303038", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303037", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303036", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303035", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303034", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303033", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303032", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303031", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031344643303030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031335253", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643313030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303939", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303938", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303937", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303936", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303935", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303934", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303933", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303932", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303931", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303930", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303839", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303838", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303837", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303836", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303835", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303834", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303833", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303832", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303831", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303830", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303739", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303738", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303737", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303736", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303735", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303734", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303733", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303732", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303731", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303730", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303639", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303638", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303637", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303636", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303635", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303634", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303633", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303632", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303631", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303630", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303539", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303538", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303537", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303536", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303535", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303534", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303533", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303532", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303531", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303530", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303439", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303438", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303437", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303436", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303435", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303434", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303433", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303432", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303431", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303430", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303339", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303338", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303337", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303336", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303335", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303334", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303333", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303332", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303331", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303330", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303239", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303238", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303237", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303236", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303235", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303234", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303233", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303232", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303231", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303230", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303139", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303138", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303137", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303136", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303135", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303134", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303133", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303132", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303131", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303130", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303039", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303038", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303037", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303036", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303035", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303034", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303033", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303032", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303031", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031334643303030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031325253", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643313030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303939", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303938", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303937", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303936", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303935", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303934", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303933", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303932", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303931", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303930", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303839", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303838", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303837", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303836", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303835", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303834", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303833", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303832", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303831", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303830", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303739", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303738", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303737", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303736", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303735", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303734", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303733", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303732", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303731", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303730", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303639", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303638", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303637", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303636", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303635", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303634", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303633", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303632", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303631", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303630", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303539", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303538", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303537", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303536", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303535", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303534", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303533", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303532", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303531", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303530", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303439", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303438", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303437", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303436", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303435", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303434", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303433", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303432", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303431", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303430", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303339", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303338", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303337", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303336", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303335", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303334", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303333", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303332", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303331", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303330", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303239", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303238", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303237", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303236", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303235", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303234", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303233", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303232", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303231", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303230", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303139", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303138", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303137", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303136", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303135", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303134", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303133", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303132", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303131", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303130", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303039", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303038", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303037", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303036", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303035", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303034", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303033", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303032", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303031", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031324643303030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031315253", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643313030", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303939", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303938", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303937", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303936", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303935", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303934", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303933", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303932", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303931", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303930", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303839", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303838", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303837", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303836", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303835", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303834", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303833", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303832", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303831", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303830", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303739", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303738", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303737", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303736", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303735", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303734", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303733", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303732", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303731", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303730", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303639", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303638", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303637", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303636", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303635", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303634", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303633", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303632", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303631", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303630", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303539", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303538", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303537", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303536", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303535", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303534", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303533", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303532", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303531", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303530", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303439", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303438", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303437", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303436", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303435", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303434", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303433", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303432", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303431", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303430", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303339", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303338", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303337", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303336", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303335", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303334", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303333", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303332", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303331", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303330", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303239", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303238", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303237", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303236", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303235", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303234", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303233", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303232", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303231", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303230", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303139", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303138", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303137", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303136", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303135", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303134", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303133", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303132", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303131", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303130", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303039", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303038", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303037", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303036", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303035", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303034", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303033", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303032", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303031", + "5534595a12198346446ca7be0a56548e7091c3f2126f360a5fd8fe2d43617264616e6f4b69647a303031314643303030", + "5526e823c4d22ee5954bcfab7f6519af49656613588f9b5c1ebb153a524547474145", + "54de866237258c023d20bb14e0bc83531623d40995bb0852b2ae54cb686868636f69", + "54b024d57e039e1a22c58bb1ba9fdaadc15810e904021da37b2d7d79454253636f696e", + "547946fff572aa719ed094264df688ca452f1b382a78606228e8fc154754", + "546cd9cdde943dccdc1b7b779f1a1b9c7ba44f897b244634cc94aa8a43617264616e6f4275647a437573746f6d31", + "546a6165648fd686a13aa81427f1f5c3d0b587d8c4859e0181d16fd4426972647a", + "544571c086d0e5c5022aca9717dd0f438e21190abb48f37b3ae129f047524f57", + "53ce07f29e08950e27c82d3bf78c293600ee0d8932a7c8fc1c14b625496d6167654e6674546573745632", + "5338b0fc0034e44bd3f98719966cb855a2f1a2b0a628f81172be4f1e436f6c6f7234", + "5338b0fc0034e44bd3f98719966cb855a2f1a2b0a628f81172be4f1e436f6c6f7233", + "5338b0fc0034e44bd3f98719966cb855a2f1a2b0a628f81172be4f1e436f6c6f7232", + "5338b0fc0034e44bd3f98719966cb855a2f1a2b0a628f81172be4f1e436f6c6f7231", + "5337c606a288bc10993a7e65243613b1ae842729928bb69414ef85e335474c697a617264", + "5315f253d24b597a7054d9ca93710b60b3d45febb92d510216dac4224c574e4457534b303334", + "52ba0fe66618e8dbb24290a1a8004cfe54ad587b6a55a4860fd14bad544843", + "52b8878252271481a726b871af9bbba9649a03af9693fa33ccca16c25041524953436f696e", + "524f01b88a66031c1693ce089a05141824b0ac8cadc9c177849e43f14144414a6f696e7473", + "5234593099ec0eccf4bbf6298eed47dc50e5f69e207df9d89c4d4dcb4d455441", + "51f0beaac7a92ab31da474aa2eb5bcb27b7cbef775b4e112ed21def05a455553", + "51e7e01f2a6debba1a54a8bb2235aa59b9323351284a60c1c8f8441043617264616e6f4a696d626f37", + "51a8b917114265855de3bf1c3c077a8d14123eb2a725a32a37e966bf4d4453", + "514e10d3fff6164c4ef4a1ff9f8fdaf21f3bcbcc060164f58664828b446f6765", + "5146470454d0eaee6bc96ad3eb01f0c7abf9e007a29b70e6074d5dc14c574e4457534b303335", + "51315043b5288badcd3c15055ea37a951f9a1a6451b6ef08abd9f2915350495241", + "50e8466119a80770237b836aa985756837fc47c534a9e3374ee9219a6b6964", + "507e3c04f838dc4fd99e6996236326fe6d159f62793408982a2acc9c474f44", + "5047b1e24673127b46a7051360db3135c273cfab87a70e7b4155832f446563656e7472616c697a65644e6574776f726b5574696c697479546f6b656e", + "4fe8998be763a8ba5acbfffc75deb2e35371bfe99968f48a5bb5cd1549747341506972617465734c696665666f724d65", + "4fd0d998dc0700ca6ef89fafff05fbf523a3a25c1fc8314bf7e4d1c247726f777468", + "4f926153bb6a9d2b3e95afff14ec15979134f1b9b6f8e3b24cb014b06d6f6f6e7374616b6539", + "4f17fa7624930826b2fe0d27e0ab8dcae6f838674389014119ce4cc96170706c656a61636b", + "4ee39d1d7e375d18b8eec9ece1fe88f4f33dfbe3ed218a7088b893664974734f6e", + "4e9c58a772bee7bef7bd16575bf1f61cca82f26f5d87265080b550397469636b6574", + "4e9a6b1098a85fb303504f36ec9e41a05bbc2cf306428438f9fd1b71466c79696e67576f6d626174", + "4e6bb3ce4965847611061812707c73ec0a77a1c8123cdfb66dc3f4b449637954657374", + "4e2bb5f8b70b86ec485b7f7bbc9acc1dd438841d96974d3be7a9851d546573744e46543133", + "4ddec7d5207a7a3cb0ea89644844ab736eb88f902cef8a832f1867d5434954525553", + "4d96d472f8287d851cd609c9afb86c4f6b95893b60b86caeba466f9b4b595a", + "4d78bc38579c64e11ebf6e5aec7ae6d40ea68d29289c20773e5dfe9b6b697761", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303731", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303730", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303639", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303638", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303637", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303636", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303635", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303634", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303633", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303632", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303631", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303630", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303539", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303538", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303537", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303536", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303535", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303534", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303533", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303532", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303531", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303530", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303439", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303438", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303437", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303436", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303435", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303434", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303433", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303432", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303431", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303430", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303339", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303338", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303337", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303336", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303335", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303334", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303333", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303332", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303331", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303330", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303239", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303238", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303237", + "4d4ff7563447720d50a46ac83f8236430db79dc9da75a7cf91852e6a46696e6765724d6f6e73746572734e46545665676173303236" + ] +} diff --git a/nix/nixos/tests/mem-usage/vegeta-attack.nix b/nix/nixos/tests/mem-usage/vegeta-attack.nix new file mode 100644 index 0000000..e134980 --- /dev/null +++ b/nix/nixos/tests/mem-usage/vegeta-attack.nix @@ -0,0 +1,7 @@ +{ writeText, port }: + +writeText "vegeta.atk" '' + POST http://localhost:${builtins.toString port}/metadata/query + Content-Type: application/json + @${./large-query.json} +'' diff --git a/nix/nixos/tests/metadata-store-file.nix b/nix/nixos/tests/metadata-store-file.nix new file mode 100644 index 0000000..4e7d748 --- /dev/null +++ b/nix/nixos/tests/metadata-store-file.nix @@ -0,0 +1,58 @@ +{ pkgs, haskellPackages, ... }: +with pkgs; +let + # Single source of truth for all constants + table = "metadata"; + user = "metadata-server"; + folder = "/tmp/metadata-store-file-integration-test"; +in +{ + name = "metadata-store-file-integration-test"; + + nodes = { + server = { config, ... }: { + nixpkgs.pkgs = pkgs; + imports = [ + ../. + ]; + + # Open the default port for `postgrest` in the firewall + networking.firewall.allowedTCPPorts = []; + + users = { + mutableUsers = false; + + users = { + # For ease of debugging the VM as the `root` user + root.password = ""; + + # Create a system user that matches the database user so that we + # can use peer authentication. + "${user}".isSystemUser = true; + }; + }; + + services.metadata-server = { + enable = true; + + user = user; + + fileStore.folder = folder; + }; + }; + }; + + testScript = + '' + import json + import sys + + start_all() + + server.succeed("mkdir -p ${folder}") + server.succeed( + "${haskellPackages.metadata-store-file.components.tests.integration-tests}/bin/integration-tests \ + --folder ${folder}" + ) + ''; +} diff --git a/nix/nixos/tests/metadata-store-postgres.nix b/nix/nixos/tests/metadata-store-postgres.nix index 70f43f2..11b36af 100644 --- a/nix/nixos/tests/metadata-store-postgres.nix +++ b/nix/nixos/tests/metadata-store-postgres.nix @@ -45,6 +45,14 @@ in authentication = '' local all all ident map=metadata-server-users ''; + settings = + { + log_connections = true; + log_statement = "all"; + logging_collector = true; + log_disconnections = true; + log_destination = lib.mkForce "syslog"; + }; }; users = {