Skip to content

Commit e9d723d

Browse files
authored
Merge pull request #15989 from MinaProtocol/dkijania/revive_extract_dump_archive_test_dev
Port patch archive test to dev
2 parents d55f0df + 9927f77 commit e9d723d

17 files changed

+313
-26
lines changed

buildkite/scripts/build-artifact.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ dune build "--profile=${DUNE_PROFILE}" $INSTRUMENTED_PARAM \
4545
src/app/rosetta/indexer_test/indexer_test.exe \
4646
src/app/rosetta/ocaml-signer/signer_testnet_signatures.exe \
4747
src/app/test_executive/test_executive.exe \
48-
src/test/command_line_tests/command_line_tests.exe # 2>&1 | tee /tmp/buildocaml.log
48+
src/test/command_line_tests/command_line_tests.exe \
49+
src/test/archive/patch_archive_test/patch_archive_test.exe
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
let Artifacts = ../Constants/Artifacts.dhall
2+
3+
let Command = ./Base.dhall
4+
5+
let Size = ./Size.dhall
6+
7+
let Network = ../Constants/Network.dhall
8+
9+
let RunWithPostgres = ./RunWithPostgres.dhall
10+
11+
in { step =
12+
\(dependsOn : List Command.TaggedKey.Type)
13+
-> Command.build
14+
Command.Config::{
15+
, commands =
16+
[ RunWithPostgres.runInDockerWithPostgresConn
17+
[ "PATCH_ARCHIVE_TEST_APP=mina-patch-archive-test"
18+
, "NETWORK_DATA_FOLDER=/etc/mina/test/archive/sample_db"
19+
]
20+
"./src/test/archive/sample_db/archive_db.sql"
21+
Artifacts.Type.FunctionalTestSuite
22+
Network.Type.Devnet
23+
"./scripts/patch-archive-test.sh"
24+
]
25+
, label = "Archive: Patch Archive test"
26+
, key = "patch-archive-test"
27+
, target = Size.Large
28+
, depends_on = dependsOn
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
let S = ../../Lib/SelectFiles.dhall
2+
3+
let Pipeline = ../../Pipeline/Dsl.dhall
4+
5+
let PipelineTag = ../../Pipeline/Tag.dhall
6+
7+
let JobSpec = ../../Pipeline/JobSpec.dhall
8+
9+
let PatchArchiveTest = ../../Command/PatchArchiveTest.dhall
10+
11+
let Profiles = ../../Constants/Profiles.dhall
12+
13+
let Dockers = ../../Constants/DockerVersions.dhall
14+
15+
let Network = ../../Constants/Network.dhall
16+
17+
let Artifacts = ../../Constants/Artifacts.dhall
18+
19+
let dependsOn =
20+
Dockers.dependsOn
21+
Dockers.Type.Bullseye
22+
Network.Type.Devnet
23+
Profiles.Type.Standard
24+
Artifacts.Type.FunctionalTestSuite
25+
26+
in Pipeline.build
27+
Pipeline.Config::{
28+
, spec = JobSpec::{
29+
, dirtyWhen =
30+
[ S.strictlyStart (S.contains "src")
31+
, S.exactly "scripts/path-archive-test" "sh"
32+
, S.exactly "buildkite/src/Jobs/Test/PatchArchiveTest" "dhall"
33+
, S.exactly "buildkite/src/Command/PatchArchiveTest" "dhall"
34+
]
35+
, path = "Test"
36+
, name = "PatchArchiveTest"
37+
, tags =
38+
[ PipelineTag.Type.Long
39+
, PipelineTag.Type.Test
40+
, PipelineTag.Type.Stable
41+
]
42+
}
43+
, steps = [ PatchArchiveTest.step dependsOn ]
44+
}

scripts/debian/builder-helpers.sh

+7-3
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,14 @@ build_batch_txn_deb() {
239239
build_functional_test_suite_deb() {
240240
create_control_file mina-test-suite "${SHARED_DEPS}" 'Test suite apps for mina.'
241241

242+
mkdir -p "${BUILDDIR}/etc/mina/test/archive"
243+
244+
cp -r ../src/test/archive/* ${BUILDDIR}/etc/mina/test/archive/
245+
242246
# Binaries
243247
cp ./default/src/test/command_line_tests/command_line_tests.exe "${BUILDDIR}/usr/local/bin/mina-command-line-tests"
244-
248+
cp ./default/src/test/archive/patch_archive_test/patch_archive_test.exe "${BUILDDIR}/usr/local/bin/mina-patch-archive-test"
249+
245250
build_deb mina-test-suite
246251

247252
}
@@ -349,8 +354,7 @@ build_archive_deb () {
349354
cp ./default/src/app/extract_blocks/extract_blocks.exe "${BUILDDIR}/usr/local/bin/mina-extract-blocks"
350355

351356
mkdir -p "${BUILDDIR}/etc/mina/archive"
352-
cp ../scripts/archive/missing-blocks-guardian.sh "${BUILDDIR}/etc/mina/archive"
353-
357+
cp ../scripts/archive/missing-blocks-guardian.sh "${BUILDDIR}/usr/local/bin/mina-missing-blocks-guardian"
354358
cp ./default/src/app/missing_blocks_auditor/missing_blocks_auditor.exe "${BUILDDIR}/usr/local/bin/mina-missing-blocks-auditor"
355359
cp ./default/src/app/replayer/replayer.exe "${BUILDDIR}/usr/local/bin/mina-replayer"
356360

scripts/patch-archive-test.sh

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/bin/bash
2+
3+
set -x
4+
# test replayer on known archive db
5+
6+
NETWORK_DATA_FOLDER=src/test/archive/sample_db
7+
PATCH_ARCHIVE_TEST_APP=${PATCH_ARCHIVE_TEST_APP:-_build/default/src/test/archive/patch_archive_test/patch_archive_test.exe}
8+
PG_PORT=${PG_PORT:-5432}
9+
POSTGRES_USER=${POSTGRES_USER:-postgres}
10+
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
11+
12+
CONN=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:${PG_PORT}
13+
14+
15+
echo "Running patch archive test"
16+
$PATCH_ARCHIVE_TEST_APP --source-uri $CONN \
17+
--network-data-folder $NETWORK_DATA_FOLDER

scripts/replayer-test.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ set -x
55

66
INPUT_FILE=src/test/archive/sample_db/replayer_input_file.json
77
REPLAYER_APP=_build/default/src/app/replayer/replayer.exe
8-
PG_CONN=postgres://postgres:postgres@localhost:5433/archive
8+
PG_CONN=postgres://postgres:postgres@localhost:5432/archive
99

1010
while [[ "$#" -gt 0 ]]; do case $1 in
1111
-i|--input-file) INPUT_FILE="$2"; shift;;

src/dune-project

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
(package (name parallel))
136136
(package (name parallel_scan))
137137
(package (name participating_state))
138+
(package (name patch_archive_test))
138139
(package (name pasta_bindings))
139140
(package (name perf_histograms))
140141
(package (name pickles_base))

src/lib/cli_lib/dune

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
kimchi_pasta.basic
4646
ppx_version.runtime
4747
gossip_net
48-
mina_runtime_config)
48+
runtime_config)
4949
(preprocess
5050
(pps ppx_version ppx_jane ppx_deriving_yojson ppx_deriving.make))
5151
(instrumentation (backend bisect_ppx))

src/lib/mina_compile_config/dune

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(library
22
(name mina_compile_config)
33
(public_name mina_compile_config)
4-
(libraries mina_node_config mina_node_config.for_unit_tests core_kernel currency)
4+
(libraries mina_node_config node_config_for_unit_tests core_kernel currency)
55
(instrumentation (backend bisect_ppx))
66
(preprocess (pps ppx_version ppx_base ppx_deriving_yojson)))
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
(executable
2+
(package patch_archive_test)
3+
(name patch_archive_test)
4+
(public_name patch_archive_test)
5+
(libraries
6+
async
7+
async.async_command
8+
core_kernel
9+
caqti
10+
caqti-async
11+
caqti-driver-postgresql
12+
integration_test_lib
13+
archive_lib
14+
block_time
15+
mina_numbers
16+
logger
17+
mina_base
18+
uri
19+
base
20+
async_kernel
21+
core
22+
async_unix
23+
stdio
24+
base.caml
25+
result
26+
mina_automation
27+
bounded_types
28+
)
29+
(preprocessor_deps ../../../config.mlh)
30+
(instrumentation (backend bisect_ppx))
31+
(preprocess (pps ppx_version ppx_mina ppx_let ppx_hash ppx_compare ppx_sexp_conv h_list.ppx)))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
(* patch_archive_test.ml *)
2+
3+
(* test patching of archive databases
4+
5+
test structure:
6+
- import reference database for comparision (for example with 100 blocks)
7+
- create new schema and export blocks from reference db with some missing ones
8+
- patch the database with missing precomputed blocks
9+
- compare original and copy
10+
*)
11+
12+
module Network_Data = struct
13+
type t =
14+
{ init_script : String.t
15+
; precomputed_blocks_zip : String.t
16+
; genesis_ledger_file : String.t
17+
; replayer_input_file : String.t
18+
; folder : String.t
19+
}
20+
21+
let create folder =
22+
{ init_script = "archive_db.sql"
23+
; genesis_ledger_file = "input.json"
24+
; precomputed_blocks_zip = "precomputed_blocks.zip"
25+
; replayer_input_file = "replayer_input_file.json"
26+
; folder
27+
}
28+
end
29+
30+
open Core_kernel
31+
open Async
32+
open Mina_automation
33+
34+
let main ~db_uri ~network_data_folder () =
35+
let open Deferred.Let_syntax in
36+
let missing_blocks_count = 3 in
37+
let network_name = "dummy" in
38+
39+
let network_data = Network_Data.create network_data_folder in
40+
41+
let output_folder = Filename.temp_dir_name ^ "/output" in
42+
43+
let%bind output_folder = Unix.mkdtemp output_folder in
44+
45+
let connection = Psql.Conn_str db_uri in
46+
47+
let source_db_name = "patch_archive_test_source" in
48+
let target_db_name = "patch_archive_test_target" in
49+
let%bind _ = Psql.create_empty_db ~connection ~db:source_db_name in
50+
let%bind _ =
51+
Psql.run_script ~connection ~db:source_db_name
52+
(network_data.folder ^ "/" ^ network_data.init_script)
53+
in
54+
let%bind () = Psql.create_mina_db ~connection ~db:target_db_name in
55+
56+
let source_db = db_uri ^ "/" ^ source_db_name in
57+
let target_db = db_uri ^ "/" ^ target_db_name in
58+
59+
let extract_blocks = Extract_blocks.of_context Executor.AutoDetect in
60+
let config =
61+
{ Extract_blocks.Config.archive_uri = source_db
62+
; range = Extract_blocks.Config.AllBlocks
63+
; output_folder = Some output_folder
64+
; network = Some network_name
65+
; include_block_height_in_name = true
66+
}
67+
in
68+
let%bind _ = Extract_blocks.run extract_blocks ~config in
69+
70+
let archive_blocks = Archive_blocks.of_context Executor.AutoDetect in
71+
72+
let%bind extensional_files =
73+
Sys.ls_dir output_folder
74+
>>= Deferred.List.map ~f:(fun e ->
75+
Deferred.return (output_folder ^ "/" ^ e) )
76+
in
77+
78+
let n =
79+
List.init missing_blocks_count ~f:(fun _ ->
80+
Random.int (List.length extensional_files) )
81+
in
82+
83+
let unpatched_extensional_files =
84+
List.filteri extensional_files ~f:(fun i _ ->
85+
not (List.mem n i ~equal:Int.equal) )
86+
|> List.dedup_and_sort ~compare:(fun left right ->
87+
let scan_height item =
88+
let item =
89+
Filename.basename item |> Str.global_replace (Str.regexp "-") " "
90+
in
91+
Scanf.sscanf item "%s %d %s" (fun _ height _ -> height)
92+
in
93+
94+
let left_height = scan_height left in
95+
let right_height = scan_height right in
96+
97+
Int.compare left_height right_height )
98+
in
99+
100+
let%bind _ =
101+
Archive_blocks.run archive_blocks ~blocks:unpatched_extensional_files
102+
~archive_uri:target_db ~format:Extensional
103+
in
104+
105+
let%bind missing_blocks_auditor_path =
106+
Missing_blocks_auditor.of_context Executor.AutoDetect
107+
|> Missing_blocks_auditor.path
108+
in
109+
110+
let%bind archive_blocks_path = Archive_blocks.path archive_blocks in
111+
112+
let config =
113+
{ Missing_blocks_guardian.Config.archive_uri = Uri.of_string target_db
114+
; precomputed_blocks = Uri.make ~scheme:"file" ~path:output_folder ()
115+
; network = network_name
116+
; run_mode = Run
117+
; missing_blocks_auditor = missing_blocks_auditor_path
118+
; archive_blocks = archive_blocks_path
119+
; block_format = Extensional
120+
}
121+
in
122+
123+
let missing_blocks_guardian =
124+
Missing_blocks_guardian.of_context Executor.AutoDetect
125+
in
126+
127+
let%bind _ = Missing_blocks_guardian.run missing_blocks_guardian ~config in
128+
129+
let replayer = Replayer.of_context Executor.AutoDetect in
130+
131+
let%bind _ =
132+
Replayer.run replayer ~archive_uri:target_db
133+
~input_config:
134+
(network_data.folder ^ "/" ^ network_data.replayer_input_file)
135+
~interval_checkpoint:10 ~output_ledger:"./output_ledger" ()
136+
in
137+
138+
Deferred.unit
139+
140+
let () =
141+
Command.(
142+
run
143+
(let open Let_syntax in
144+
async ~summary:"Test patching of blocks in an archive database"
145+
(let%map db_uri =
146+
Param.flag "--source-uri"
147+
~doc:
148+
"URI URI for connecting to the database (e.g., \
149+
postgres://$USER@localhost:5432)"
150+
Param.(required string)
151+
and network_data_folder =
152+
Param.(
153+
flag "--network-data-folder" ~aliases:[ "network-data-folder" ]
154+
Param.(required string))
155+
~doc:
156+
"Path Path to folder containing network data. Usually it's sql \
157+
for db import, genesis ledger and zipped precomputed blocks \
158+
archive"
159+
in
160+
main ~db_uri ~network_data_folder )))

src/test/mina_automation/archive_blocks.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ include Executor
99
let of_context context =
1010
Executor.of_context ~context
1111
~dune_name:"src/app/archive_blocks/archive_blocks.exe"
12-
~official_name:"/usr/local/bin/mina-archive-blocks"
12+
~official_name:"mina-archive-blocks"
1313

1414
type format = Precomputed | Extensional
1515

0 commit comments

Comments
 (0)