diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 725c32e6..795d71ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,18 +30,15 @@ jobs: toolchain: ${{ matrix.toolchain }} override: true profile: minimal - - name: Pin dependencies - if: ${{ matrix.toolchain == '1.63.0' }} - run: | - cargo update -p tokio --precise "1.38.1" --verbose - cargo update -p postgres-types --precise "0.2.6" --verbose - cargo update -p parking_lot@0.12.4 --precise "0.12.3" --verbose - cargo update -p parking_lot_core@0.9.11 --precise "0.9.10" --verbose - cargo update -p lock_api --precise "0.4.12" --verbose - name: Build on Rust ${{ matrix.toolchain }} run: | cargo build --verbose --color always test: + strategy: + matrix: + toolchain: + - stable + - 1.63.0 runs-on: ubuntu-latest services: postgres: @@ -61,7 +58,7 @@ jobs: - name: Install Rust ${{ matrix.toolchain }} toolchain uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: ${{ matrix.toolchain }} override: true profile: minimal - name: Run tests diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..e8d511ff --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1328 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals", + "bitcoin_hashes", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "bitcoin" +version = "0.32.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda569d741b895131a88ee5589a467e73e9c4718e958ac9308e4f7dc44b6945" +dependencies = [ + "base58ck", + "bech32", + "bitcoin-internals", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes", + "bitcoinconsensus", + "hex-conservative", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitcoinconsensus" +version = "0.105.0+25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f260ac8fb2c621329013fc0ed371c940fcc512552dcbcb9095ed0179098c9e18" +dependencies = [ + "cc", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dnssec-prover" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4f825369fc7134da70ca4040fddc8e03b80a46d249ae38d9c1c39b7b4476bf" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "lightning" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc19846267fc5406a43bed1ca00621a74752b26998ee4eae9f532386b9bee59e" +dependencies = [ + "bech32", + "bitcoin", + "dnssec-prover", + "hashbrown", + "libm", + "lightning-invoice", + "lightning-types", + "possiblyrandom", + "regex", +] + +[[package]] +name = "lightning-block-sync" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baab5bdee174a2047d939a4ca0dc2e1c23caa0f8cab0b4380aed77a20e116f1e" +dependencies = [ + "bitcoin", + "chunked_transfer", + "lightning", + "serde_json", +] + +[[package]] +name = "lightning-invoice" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11209f386879b97198b2bfc9e9c1e5d42870825c6bd4376f17f95357244d6600" +dependencies = [ + "bech32", + "bitcoin", + "lightning-types", +] + +[[package]] +name = "lightning-net-tokio" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6a6c93b1e592f1d46bb24233cac4a33b4015c99488ee229927a81d16226e45" +dependencies = [ + "bitcoin", + "lightning", + "tokio", +] + +[[package]] +name = "lightning-rapid-gossip-sync" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78dacdef3e2f5d727754f902f4e6bbc43bfc886fec8e71f36757711060916ebe" +dependencies = [ + "bitcoin", + "bitcoin-io", + "bitcoin_hashes", + "lightning", +] + +[[package]] +name = "lightning-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cd84d4e71472035903e43caded8ecc123066ce466329ccd5ae537a8d5488c7" +dependencies = [ + "bitcoin", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "possiblyrandom" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b122a615d72104fb3d8b26523fdf9232cd8ee06949fb37e4ce3ff964d15dffd" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" +dependencies = [ + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rapid-gossip-sync-server" +version = "0.1.0" +dependencies = [ + "bitcoin", + "futures", + "hex-conservative", + "lightning", + "lightning-block-sync", + "lightning-net-tokio", + "lightning-rapid-gossip-sync", + "tokio", + "tokio-postgres", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "regex" +version = "1.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.3", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.10", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6c8b33df661b548dcd8f9bf87debb8c56c05657ed291122e1188698c2ece95" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures", + "log", + "parking_lot 0.11.2", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "socket2 0.4.10", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/src/lib.rs b/src/lib.rs index f794044d..a399d1b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,20 +11,24 @@ extern crate core; use std::collections::{HashMap, HashSet}; use std::fs::File; -use std::io::BufReader; +use std::io::{BufReader, BufWriter, Write}; use std::ops::Deref; use std::sync::Arc; +use std::time::Duration; + use bitcoin::blockdata::constants::ChainHash; -use lightning::log_info; +use lightning::log_info; use lightning::routing::gossip::{NetworkGraph, NodeId}; use lightning::util::logger::Logger; use lightning::util::ser::{ReadableArgs, Writeable}; + +use tokio::runtime::Builder; use tokio::sync::mpsc; use tokio_postgres::{Client, NoTls}; + use crate::config::SYMLINK_GRANULARITY_INTERVAL; use crate::lookup::DeltaSet; - use crate::persistence::GossipPersister; use crate::serialization::{MutatedNodeProperties, NodeSerializationStrategy, SerializationSet, UpdateSerialization}; use crate::snapshot::Snapshotter; @@ -104,9 +108,17 @@ impl RapidSyncProcessor where L::Ta if config::DOWNLOAD_NEW_GOSSIP { let (mut persister, persistence_sender) = - GossipPersister::new(self.network_graph.clone(), self.logger.clone()).await; + GossipPersister::new(self.logger.clone()).await; + log_info!(self.logger, "Starting gossip db persistence listener"); - tokio::spawn(async move { persister.persist_gossip().await; }); + // We persist gossip to postgres in a separate runtime as we can end up blocking on it + // (indirectly via the async queue getting full) with sync mutexes held (esp + // PeerManager's peers mutex). Otherwise, blocking on it could result in blocking the + // tokio reactor which we're waiting on to complete postgres writes. + let runtime = Builder::new_multi_thread() + .enable_all().worker_threads(2).thread_name("postgres-writer") .build().unwrap(); + runtime.spawn(async move { persister.persist_gossip().await; }); + Box::leak(Box::new(runtime)); { log_info!(self.logger, "Backfilling latest gossip from cached network graph…"); @@ -130,6 +142,16 @@ impl RapidSyncProcessor where L::Ta log_info!(self.logger, "Starting gossip download"); tokio::spawn(tracking::download_gossip(persistence_sender, sync_completion_sender, Arc::clone(&self.network_graph), self.logger.clone())); + + let graph = Arc::clone(&self.network_graph); + let logger = self.logger.clone(); + tokio::spawn(async move { + let mut intvl = tokio::time::interval(Duration::from_secs(60 * 10)); + loop { + intvl.tick().await; + persist_network_graph(&logger, &*graph); + } + }); } else { sync_completion_sender.send(()).await.unwrap(); } @@ -145,6 +167,22 @@ impl RapidSyncProcessor where L::Ta } } +fn persist_network_graph(logger: &L, graph: &NetworkGraph) where L::Target: Logger { + log_info!(logger, "Caching network graph…"); + let cache_path = config::network_graph_cache_path(); + let file = std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(&cache_path) + .unwrap(); + graph.remove_stale_channels_and_tracking(); + let mut writer = BufWriter::new(file); + graph.write(&mut writer).unwrap(); + writer.flush().unwrap(); + log_info!(logger, "Cached network graph!"); +} + pub(crate) async fn connect_to_db() -> Client { let connection_config = config::db_connection_config(); let (client, connection) = connection_config.connect(NoTls).await.unwrap(); @@ -202,7 +240,7 @@ fn serialize_empty_blob(current_timestamp: u64, serialization_version: u8) -> Ve blob } -async fn calculate_delta(network_graph: Arc>, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) -> SerializationSet where L::Target: Logger { +async fn calculate_delta(network_graph: &NetworkGraph, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) -> SerializationSet where L::Target: Logger { let client = connect_to_db().await; network_graph.remove_stale_channels_and_tracking(); @@ -212,7 +250,7 @@ async fn calculate_delta(network_graph: Arc>, // for announcement-free incremental-only updates, chain hash can be skipped let mut delta_set = DeltaSet::new(); - lookup::fetch_channel_announcements(&mut delta_set, Arc::clone(&network_graph), &client, last_sync_timestamp, snapshot_reference_timestamp, logger.clone()).await; + lookup::fetch_channel_announcements(&mut delta_set, network_graph, &client, last_sync_timestamp, snapshot_reference_timestamp, logger.clone()).await; log_info!(logger, "announcement channel count: {}", delta_set.len()); lookup::fetch_channel_updates(&mut delta_set, &client, last_sync_timestamp, logger.clone()).await; log_info!(logger, "update-fetched channel count: {}", delta_set.len()); diff --git a/src/lookup.rs b/src/lookup.rs index 39c17df8..071995f0 100644 --- a/src/lookup.rs +++ b/src/lookup.rs @@ -1,6 +1,5 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use std::ops::Deref; -use std::sync::Arc; use std::time::{Instant, SystemTime, UNIX_EPOCH}; use bitcoin::io::Cursor; @@ -126,7 +125,7 @@ fn should_snapshot_include_reminders(last_sync_timestamp: u32, current /// whether they had been seen before. /// Also include all announcements for which the first update was announced /// after `last_sync_timestamp` -pub(super) async fn fetch_channel_announcements(delta_set: &mut DeltaSet, network_graph: Arc>, client: &Client, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) where L::Target: Logger { +pub(super) async fn fetch_channel_announcements(delta_set: &mut DeltaSet, network_graph: &NetworkGraph, client: &Client, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) where L::Target: Logger { log_info!(logger, "Obtaining channel ids from network graph"); let channel_ids = { let read_only_graph = network_graph.read_only(); @@ -472,7 +471,7 @@ pub(super) async fn fetch_channel_updates(delta_set: &mut DeltaSet, cl log_info!(logger, "Processed intermediate rows ({}) (delta size: {}): {:?}", intermediate_update_count, delta_set.len(), start.elapsed()); } -pub(super) async fn fetch_node_updates(network_graph: Arc>, client: &Client, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) -> NodeDeltaSet where L::Target: Logger { +pub(super) async fn fetch_node_updates(network_graph: &NetworkGraph, client: &Client, last_sync_timestamp: u32, snapshot_reference_timestamp: Option, logger: L) -> NodeDeltaSet where L::Target: Logger { let start = Instant::now(); let last_sync_timestamp_float = last_sync_timestamp as f64; diff --git a/src/persistence.rs b/src/persistence.rs index 1b622bcc..38146a13 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -1,13 +1,9 @@ -use std::fs::OpenOptions; -use std::io::{BufWriter, Write}; use std::ops::Deref; use std::sync::Arc; use std::time::{Duration, Instant}; use lightning::log_info; -use lightning::routing::gossip::NetworkGraph; use lightning::util::logger::Logger; use lightning::util::ser::Writeable; -use tokio::runtime::Runtime; use tokio::sync::{mpsc, Mutex, Semaphore}; use crate::config; @@ -18,13 +14,11 @@ const INSERT_PARALELLISM: usize = 16; pub(crate) struct GossipPersister where L::Target: Logger { gossip_persistence_receiver: mpsc::Receiver, - network_graph: Arc>, - tokio_runtime: Runtime, logger: L } impl GossipPersister where L::Target: Logger { - pub async fn new(network_graph: Arc>, logger: L) -> (Self, mpsc::Sender) { + pub async fn new(logger: L) -> (Self, mpsc::Sender) { { // initialize the database // this client instance is only used once let mut client = crate::connect_to_db().await; @@ -83,11 +77,8 @@ impl GossipPersister where L::Targe let (gossip_persistence_sender, gossip_persistence_receiver) = mpsc::channel::(100); - let runtime = Runtime::new().unwrap(); (GossipPersister { gossip_persistence_receiver, - network_graph, - tokio_runtime: runtime, logger }, gossip_persistence_sender) } @@ -96,14 +87,10 @@ impl GossipPersister where L::Targe // print log statement every minute let mut latest_persistence_log = Instant::now() - Duration::from_secs(60); let mut i = 0u32; - let mut latest_graph_cache_time = Instant::now(); let insert_limiter = Arc::new(Semaphore::new(INSERT_PARALELLISM)); let connections_cache = Arc::new(Mutex::new(Vec::with_capacity(INSERT_PARALELLISM))); #[cfg(test)] let mut tasks_spawned = Vec::new(); - // TODO: it would be nice to have some sort of timeout here so after 10 seconds of - // inactivity, some sort of message could be broadcast signaling the activation of request - // processing while let Some(gossip_message) = self.gossip_persistence_receiver.recv().await { i += 1; // count the persisted gossip messages @@ -112,11 +99,6 @@ impl GossipPersister where L::Targe latest_persistence_log = Instant::now(); } - // has it been ten minutes? Just cache it - if latest_graph_cache_time.elapsed().as_secs() >= 600 { - self.persist_network_graph(); - latest_graph_cache_time = Instant::now(); - } insert_limiter.acquire().await.unwrap().forget(); let limiter_ref = Arc::clone(&insert_limiter); @@ -144,7 +126,7 @@ impl GossipPersister where L::Targe let mut serialized_addresses = Vec::new(); announcement.contents.addresses.write(&mut serialized_addresses).unwrap(); - let _task = self.tokio_runtime.spawn(async move { + let _task = tokio::spawn(async move { if cfg!(test) && seen_override.is_some() { tokio::time::timeout(POSTGRES_INSERT_TIMEOUT, client .execute("INSERT INTO node_announcements (\ @@ -192,7 +174,7 @@ impl GossipPersister where L::Targe let mut announcement_signed = Vec::new(); announcement.write(&mut announcement_signed).unwrap(); - let _task = self.tokio_runtime.spawn(async move { + let _task = tokio::spawn(async move { if cfg!(test) && seen_override.is_some() { tokio::time::timeout(POSTGRES_INSERT_TIMEOUT, client .execute("INSERT INTO channel_announcements (\ @@ -212,7 +194,7 @@ impl GossipPersister where L::Targe short_channel_id, \ funding_amount_sats, \ announcement_signed \ - ) VALUES ($1, $2, $3) ON CONFLICT (short_channel_id) DO NOTHING", &[ + ) VALUES ($1, $2, $3) ON CONFLICT (short_channel_id) DO UPDATE SET funding_amount_sats = $2", &[ &scid, &(funding_value as i64), &announcement_signed @@ -278,7 +260,7 @@ impl GossipPersister where L::Targe // this may not be used outside test cfg let _seen_timestamp = seen_override.unwrap_or(timestamp as u32) as f64; - let _task = self.tokio_runtime.spawn(async move { + let _task = tokio::spawn(async move { tokio::time::timeout(POSTGRES_INSERT_TIMEOUT, client .execute(insertion_statement, &[ &scid, @@ -309,20 +291,4 @@ impl GossipPersister where L::Targe task.await.unwrap(); } } - - fn persist_network_graph(&self) { - log_info!(self.logger, "Caching network graph…"); - let cache_path = config::network_graph_cache_path(); - let file = OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(&cache_path) - .unwrap(); - self.network_graph.remove_stale_channels_and_tracking(); - let mut writer = BufWriter::new(file); - self.network_graph.write(&mut writer).unwrap(); - writer.flush().unwrap(); - log_info!(self.logger, "Cached network graph!"); - } } diff --git a/src/snapshot.rs b/src/snapshot.rs index e9d84459..7f88fd08 100644 --- a/src/snapshot.rs +++ b/src/snapshot.rs @@ -116,11 +116,10 @@ impl Snapshotter where L::Target: Logger { let mut snapshot_filenames_by_scope: HashMap = HashMap::with_capacity(10); for (current_scope, current_last_sync_timestamp) in &snapshot_sync_timestamps { - let network_graph_clone = self.network_graph.clone(); { log_info!(self.logger, "Calculating {}-second snapshot", current_scope); // calculate the snapshot - let delta = super::calculate_delta(network_graph_clone.clone(), current_last_sync_timestamp.clone() as u32, Some(reference_timestamp), self.logger.clone()).await; + let delta = super::calculate_delta(&*self.network_graph, current_last_sync_timestamp.clone() as u32, Some(reference_timestamp), self.logger.clone()).await; let snapshot_v1 = super::serialize_delta(&delta, 1, self.logger.clone()); let snapshot_v2 = super::serialize_delta(&delta, 2, self.logger.clone()); diff --git a/src/tests/mod.rs b/src/tests/mod.rs index b23fd55c..7d97f225 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -213,9 +213,7 @@ async fn clean_test_db() { async fn test_persistence_runtime() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); - let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (_persister, _receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (_persister, _receiver) = GossipPersister::new(logger.clone()).await; tokio::task::spawn_blocking(move || { drop(_persister); @@ -232,8 +230,7 @@ fn test_no_op() { let serialization = serialize_empty_blob(current_time() as u64, serialization_version); let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); rgs.update_network_graph(&serialization).unwrap(); } } @@ -243,8 +240,7 @@ async fn test_trivial_setup() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let short_channel_id = 1; let timestamp = current_time() - 10; @@ -255,9 +251,9 @@ async fn test_trivial_setup() { let update_1 = generate_update(short_channel_id, false, timestamp, 0, 0, 0, 5, 0); let update_2 = generate_update(short_channel_id, true, timestamp, 0, 0, 0, 10, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, None)).await.unwrap(); @@ -266,12 +262,12 @@ async fn test_trivial_setup() { persister.persist_gossip().await; } - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 1", 1); clean_test_db().await; - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); assert_eq!(serialization.message_count, 3); @@ -279,8 +275,7 @@ async fn test_trivial_setup() { assert_eq!(serialization.update_count, 2); let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); println!("update result: {}", update_result); // the update result must be a multiple of our snapshot granularity @@ -291,7 +286,7 @@ async fn test_trivial_setup() { println!("timestamp delta: {}", timestamp_delta); assert!(timestamp_delta < config::snapshot_generation_interval()); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -316,9 +311,7 @@ async fn test_trivial_setup() { async fn test_node_announcement_persistence() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); - let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; { // seed the db let mut announcement = generate_node_announcement(None); @@ -358,8 +351,7 @@ async fn test_node_announcement_delta_detection() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let timestamp = current_time() - 10; @@ -372,9 +364,9 @@ async fn test_node_announcement_delta_detection() { let update_1 = generate_update(1, false, timestamp - 10, 0, 0, 0, 6, 0); let update_2 = generate_update(1, true, timestamp - 10, 0, 0, 0, 6, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - 10))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - 10))).await.unwrap(); @@ -386,9 +378,9 @@ async fn test_node_announcement_delta_detection() { let update_1 = generate_update(2, false, timestamp - 10, 0, 0, 0, 6, 0); let update_2 = generate_update(2, true, timestamp - 10, 0, 0, 0, 6, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - 10))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - 10))).await.unwrap(); @@ -399,10 +391,10 @@ async fn test_node_announcement_delta_detection() { // Add some node announcements from before the last sync for node 1. let mut announcement = generate_node_announcement(None); announcement.contents.timestamp = timestamp - 10; - network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); + network_graph.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap(); announcement.contents.timestamp = timestamp - 8; - network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); + network_graph.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap(); } @@ -410,7 +402,7 @@ async fn test_node_announcement_delta_detection() { // Add a node announcement from before the last sync for node 4. let mut announcement = generate_node_announcement(Some(fourth_node.clone())); announcement.contents.timestamp = timestamp - 10; - network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); + network_graph.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); receiver.send(GossipMessage::NodeAnnouncement(announcement.clone(), Some(announcement.contents.timestamp))).await.unwrap(); } @@ -420,7 +412,7 @@ async fn test_node_announcement_delta_detection() { let mut current_announcement = generate_node_announcement(Some(SecretKey::from_slice(&[2; 32]).unwrap())); current_announcement.contents.features = NodeFeatures::from_be_bytes(vec![23, 48]); current_announcement.contents.timestamp = timestamp; - network_graph_arc.update_node_from_unsigned_announcement(¤t_announcement.contents).unwrap(); + network_graph.update_node_from_unsigned_announcement(¤t_announcement.contents).unwrap(); receiver.send(GossipMessage::NodeAnnouncement(current_announcement, Some(timestamp))).await.unwrap(); } @@ -451,7 +443,7 @@ async fn test_node_announcement_delta_detection() { port: 4, }); announcement.contents.timestamp = timestamp; - network_graph_arc.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); + network_graph.update_node_from_unsigned_announcement(&announcement.contents).unwrap(); receiver.send(GossipMessage::NodeAnnouncement(announcement, Some(timestamp))).await.unwrap(); } @@ -463,7 +455,7 @@ async fn test_node_announcement_delta_detection() { }).await.unwrap(); } - let delta = calculate_delta(network_graph_arc.clone(), timestamp - 5, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, timestamp - 5, None, logger.clone()).await; let serialization = serialize_delta(&delta, 2, logger.clone()); clean_test_db().await; @@ -484,8 +476,7 @@ async fn test_unidirectional_intermediate_update_consideration() { let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let short_channel_id = 1; let timestamp = current_time() - 10; @@ -497,10 +488,10 @@ async fn test_unidirectional_intermediate_update_consideration() { let update_2 = generate_update(short_channel_id, true, timestamp + 1, 0, 0, 0, 3, 0); let update_3 = generate_update(short_channel_id, true, timestamp + 2, 0, 0, 0, 4, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_3.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_unsigned(&update_3.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, None)).await.unwrap(); @@ -510,14 +501,13 @@ async fn test_unidirectional_intermediate_update_consideration() { persister.persist_gossip().await; } - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); - let delta = calculate_delta(network_graph_arc.clone(), timestamp + 1, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, timestamp + 1, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server::lookup", "Fetched 1 update rows of the first update in a new direction", 1); @@ -534,7 +524,7 @@ async fn test_unidirectional_intermediate_update_consideration() { println!("update result: {}", update_result); // the update result must be a multiple of our snapshot granularity - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -553,8 +543,7 @@ async fn test_bidirectional_intermediate_update_consideration() { let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let short_channel_id = 1; let timestamp = current_time() - 10; @@ -567,11 +556,11 @@ async fn test_bidirectional_intermediate_update_consideration() { let update_3 = generate_update(short_channel_id, false, timestamp + 2, 0, 0, 0, 3, 0); let update_4 = generate_update(short_channel_id, true, timestamp, 0, 0, 0, 3, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_3.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_4.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_unsigned(&update_3.contents).unwrap(); + network_graph.update_channel_unsigned(&update_4.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, None)).await.unwrap(); @@ -582,10 +571,10 @@ async fn test_bidirectional_intermediate_update_consideration() { persister.persist_gossip().await; } - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); - let delta = calculate_delta(network_graph_arc.clone(), timestamp + 1, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, timestamp + 1, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server::lookup", "Fetched 0 update rows of the first update in a new direction", 1); @@ -611,8 +600,7 @@ async fn test_channel_reminders() { let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let timestamp = current_time(); println!("timestamp: {}", timestamp); @@ -625,9 +613,9 @@ async fn test_channel_reminders() { let update_1 = generate_update(short_channel_id, false, timestamp - channel_reminder_delta - 1, 0, 0, 0, 5, 0); let update_2 = generate_update(short_channel_id, true, timestamp - channel_reminder_delta - 1, 0, 0, 0, 3, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - channel_reminder_delta - 1))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - channel_reminder_delta - 1))).await.unwrap(); @@ -646,9 +634,9 @@ async fn test_channel_reminders() { let update_7 = generate_update(short_channel_id, false, timestamp - channel_reminder_delta + 20, 0, 0, 0, 5, 0); let update_8 = generate_update(short_channel_id, true, timestamp - channel_reminder_delta + 20, 0, 0, 0, 3, 0); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); - network_graph_arc.update_channel_unsigned(&update_7.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_8.contents).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_unsigned(&update_7.contents).unwrap(); + network_graph.update_channel_unsigned(&update_8.contents).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, Some(timestamp - channel_reminder_delta - 1))).await.unwrap(); receiver.send(GossipMessage::ChannelUpdate(update_1, Some(timestamp - channel_reminder_delta - 10))).await.unwrap(); @@ -666,10 +654,10 @@ async fn test_channel_reminders() { persister.persist_gossip().await; } - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 2); - let delta = calculate_delta(network_graph_arc.clone(), timestamp - channel_reminder_delta + 15, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, timestamp - channel_reminder_delta + 15, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server::lookup", "Fetched 0 update rows of the first update in a new direction", 1); @@ -695,34 +683,33 @@ async fn test_full_snapshot_recency() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); let short_channel_id = 1; let timestamp = current_time(); println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let announcement = generate_channel_announcement(short_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); { // direction false { // first update let update = generate_update(short_channel_id, false, timestamp - 1, 0, 0, 0, 0, 38); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { // second update let update = generate_update(short_channel_id, false, timestamp, 0, 0, 0, 0, 39); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } { // direction true { // first and only update let update = generate_update(short_channel_id, true, timestamp, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -736,27 +723,26 @@ async fn test_full_snapshot_recency() { } let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); { // sync after initial seed - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 1", 1); - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); assert_eq!(serialization.message_count, 3); assert_eq!(serialization.channel_announcement_count, 1); assert_eq!(serialization.update_count, 2); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); assert!(update_result < timestamp); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -776,34 +762,33 @@ async fn test_full_snapshot_recency_with_wrong_seen_order() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); let short_channel_id = 1; let timestamp = current_time(); println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let announcement = generate_channel_announcement(short_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); { // direction false { // first update, seen latest let update = generate_update(short_channel_id, false, timestamp - 1, 0, 0, 0, 0, 38); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, Some(timestamp))).await.unwrap(); } { // second update, seen first let update = generate_update(short_channel_id, false, timestamp, 0, 0, 0, 0, 39); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, Some(timestamp - 1))).await.unwrap(); } } { // direction true { // first and only update let update = generate_update(short_channel_id, true, timestamp, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -817,27 +802,26 @@ async fn test_full_snapshot_recency_with_wrong_seen_order() { } let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); { // sync after initial seed - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 1", 1); - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); assert_eq!(serialization.message_count, 3); assert_eq!(serialization.channel_announcement_count, 1); assert_eq!(serialization.update_count, 2); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); assert!(update_result < timestamp); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -857,24 +841,23 @@ async fn test_full_snapshot_recency_with_wrong_propagation_order() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); let short_channel_id = 1; let timestamp = current_time(); println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let announcement = generate_channel_announcement(short_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); { // direction false // apply updates in their timestamp order let update_1 = generate_update(short_channel_id, false, timestamp - 1, 0, 0, 0, 0, 38); let update_2 = generate_update(short_channel_id, false, timestamp, 0, 0, 0, 0, 39); - network_graph_arc.update_channel_unsigned(&update_1.contents).unwrap(); - network_graph_arc.update_channel_unsigned(&update_2.contents).unwrap(); + network_graph.update_channel_unsigned(&update_1.contents).unwrap(); + network_graph.update_channel_unsigned(&update_2.contents).unwrap(); // propagate updates in their seen order receiver.send(GossipMessage::ChannelUpdate(update_2, Some(timestamp - 1))).await.unwrap(); @@ -883,7 +866,7 @@ async fn test_full_snapshot_recency_with_wrong_propagation_order() { { // direction true { // first and only update let update = generate_update(short_channel_id, true, timestamp, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -897,27 +880,26 @@ async fn test_full_snapshot_recency_with_wrong_propagation_order() { } let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); { // sync after initial seed - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 1", 1); - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); assert_eq!(serialization.message_count, 3); assert_eq!(serialization.channel_announcement_count, 1); assert_eq!(serialization.update_count, 2); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); assert!(update_result < timestamp); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -937,7 +919,6 @@ async fn test_full_snapshot_mutiny_scenario() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); let short_channel_id = 873706024403271681; let timestamp = current_time(); @@ -947,77 +928,77 @@ async fn test_full_snapshot_mutiny_scenario() { println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let announcement = generate_channel_announcement(short_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); { // direction false { let update = generate_update(short_channel_id, false, 1693507369 + timestamp_offset, 0, 0, 0, 0, 38); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1693680390 + timestamp_offset, 0, 0, 0, 0, 38); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1693749109 + timestamp_offset, 0, 0, 0, 0, 200); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1693925190 + timestamp_offset, 0, 0, 0, 0, 200); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694008323 + timestamp_offset, 0, 0, 0, 0, 209); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694219924 + timestamp_offset, 0, 0, 0, 0, 209); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694267536 + timestamp_offset, 0, 0, 0, 0, 210); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694458808 + timestamp_offset, 0, 0, 0, 0, 210); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694526734 + timestamp_offset, 0, 0, 0, 0, 200); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1694794765 + timestamp_offset, 0, 0, 0, 0, 200); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, Some(1695909301 + 2 * config::SYMLINK_GRANULARITY_INTERVAL + timestamp_offset))).await.unwrap(); } { let update = generate_update(short_channel_id, false, 1695909301 + timestamp_offset, 0, 0, 0, 0, 130); - // network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + // network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } { // direction true { let update = generate_update(short_channel_id, true, 1693300588 + timestamp_offset, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { let update = generate_update(short_channel_id, true, 1695003621 + timestamp_offset, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -1031,21 +1012,20 @@ async fn test_full_snapshot_mutiny_scenario() { } let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); { // sync after initial seed - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 1", 1); - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 1); assert_eq!(serialization.message_count, 3); assert_eq!(serialization.channel_announcement_count, 1); assert_eq!(serialization.update_count, 2); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); println!("update result: {}", update_result); // the update result must be a multiple of our snapshot granularity @@ -1056,7 +1036,7 @@ async fn test_full_snapshot_mutiny_scenario() { println!("timestamp delta: {}", timestamp_delta); assert!(timestamp_delta < config::snapshot_generation_interval()); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -1075,37 +1055,36 @@ async fn test_full_snapshot_interlaced_channel_timestamps() { let _sanitizer = SchemaSanitizer::new(); let logger = Arc::new(TestLogger::new()); let network_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let network_graph_arc = Arc::new(network_graph); let main_channel_id = 1; let timestamp = current_time(); println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let secondary_channel_id = main_channel_id + 1; { // main channel let announcement = generate_channel_announcement(main_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); } { // secondary channel let announcement = generate_channel_announcement(secondary_channel_id); - network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); + network_graph.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); } { // main channel { // direction false let update = generate_update(main_channel_id, false, timestamp - 2, 0, 0, 0, 0, 10); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { // direction true let update = generate_update(main_channel_id, true, timestamp - 2, 0, 0, 0, 0, 5); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -1113,12 +1092,12 @@ async fn test_full_snapshot_interlaced_channel_timestamps() { { // in-between channel { // direction false let update = generate_update(secondary_channel_id, false, timestamp - 1, 0, 0, 0, 0, 42); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { // direction true let update = generate_update(secondary_channel_id, true, timestamp - 1, 0, 0, 0, 0, 42); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -1126,12 +1105,12 @@ async fn test_full_snapshot_interlaced_channel_timestamps() { { // main channel { // direction false let update = generate_update(main_channel_id, false, timestamp, 0, 0, 0, 0, 11); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } { // direction true let update = generate_update(main_channel_id, true, timestamp, 0, 0, 0, 0, 6); - network_graph_arc.update_channel_unsigned(&update.contents).unwrap(); + network_graph.update_channel_unsigned(&update.contents).unwrap(); receiver.send(GossipMessage::ChannelUpdate(update, None)).await.unwrap(); } } @@ -1145,27 +1124,26 @@ async fn test_full_snapshot_interlaced_channel_timestamps() { } let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); { // sync after initial seed - let delta = calculate_delta(network_graph_arc.clone(), 0, None, logger.clone()).await; + let delta = calculate_delta(&network_graph, 0, None, logger.clone()).await; let serialization = serialize_delta(&delta, 1, logger.clone()); logger.assert_log_contains("rapid_gossip_sync_server", "announcement channel count: 2", 1); - let channel_count = network_graph_arc.read_only().channels().len(); + let channel_count = network_graph.read_only().channels().len(); assert_eq!(channel_count, 2); assert_eq!(serialization.message_count, 6); assert_eq!(serialization.channel_announcement_count, 2); assert_eq!(serialization.update_count, 4); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&serialization.data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); assert!(update_result < timestamp); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 2); @@ -1194,7 +1172,7 @@ async fn test_full_snapshot_persistence() { println!("timestamp: {}", timestamp); { // seed the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; let announcement = generate_channel_announcement(short_channel_id); network_graph_arc.update_channel_from_announcement_no_lookup(&announcement).unwrap(); receiver.send(GossipMessage::ChannelAnnouncement(announcement, 100, None)).await.unwrap(); @@ -1229,14 +1207,13 @@ async fn test_full_snapshot_persistence() { let symlinked_data = fs::read(&symlink_path).unwrap(); let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&symlinked_data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1); @@ -1249,7 +1226,7 @@ async fn test_full_snapshot_persistence() { } { // update the db - let (mut persister, receiver) = GossipPersister::new(network_graph_arc.clone(), logger.clone()).await; + let (mut persister, receiver) = GossipPersister::new(logger.clone()).await; { // second update let update = generate_update(short_channel_id, false, timestamp + 30, 0, 0, 0, 0, 39); @@ -1271,14 +1248,13 @@ async fn test_full_snapshot_persistence() { let symlinked_data = fs::read(&symlink_path).unwrap(); let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); - let client_graph_arc = Arc::new(client_graph); - let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + let rgs = RapidGossipSync::new(&client_graph, logger.clone()); let update_result = rgs.update_network_graph(&symlinked_data).unwrap(); // the update result must be a multiple of our snapshot granularity assert_eq!(update_result % config::snapshot_generation_interval(), 0); - let readonly_graph = client_graph_arc.read_only(); + let readonly_graph = client_graph.read_only(); let channels = readonly_graph.channels(); let client_channel_count = channels.len(); assert_eq!(client_channel_count, 1);