From 79293de42acb4d61c091932d0d53df3930df9e35 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 4 Jul 2024 17:45:48 +0300 Subject: [PATCH 01/26] Added skeleton for storage db interface for execution data and pebble and badger implementation --- go.mod | 7 +- go.sum | 40 ++----- insecure/go.mod | 7 +- insecure/go.sum | 40 ++----- integration/go.mod | 7 +- integration/go.sum | 47 ++------ .../storage/badger_storage_db.go | 105 ++++++++++++++++++ .../storage/pebble_storage_db.go | 92 +++++++++++++++ .../executiondatasync/storage/storage_db.go | 36 ++++++ 9 files changed, 275 insertions(+), 106 deletions(-) create mode 100644 module/executiondatasync/storage/badger_storage_db.go create mode 100644 module/executiondatasync/storage/pebble_storage_db.go create mode 100644 module/executiondatasync/storage/storage_db.go diff --git a/go.mod b/go.mod index 6f22a64920c..3e0201b690f 100644 --- a/go.mod +++ b/go.mod @@ -34,6 +34,7 @@ require ( github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-badger2 v0.1.3 + github.com/ipfs/go-ds-pebble v0.3.1 github.com/ipfs/go-ipld-format v0.6.0 github.com/ipfs/go-log v1.0.5 github.com/ipfs/go-log/v2 v2.5.1 @@ -93,7 +94,7 @@ require ( ) require ( - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 + github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe github.com/coreos/go-semver v0.3.0 github.com/docker/go-units v0.5.0 github.com/glebarez/go-sqlite v1.22.0 @@ -145,9 +146,9 @@ require ( github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect diff --git a/go.sum b/go.sum index 0883c06396a..839908f8a92 100644 --- a/go.sum +++ b/go.sum @@ -963,9 +963,7 @@ github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= @@ -1183,22 +1181,23 @@ github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/P github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA= github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe h1:ZBhPcgWjnfy2PFWlvPlcOXAfAQqOIdpfksijpKiMWcc= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe/go.mod h1:BHuaMa/lK7fUe75BlsteiiTu8ptIG+qSAuDtGMArP18= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= @@ -1386,7 +1385,6 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= @@ -1495,7 +1493,6 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -1504,7 +1501,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -1761,7 +1757,6 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1802,6 +1797,8 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= +github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= +github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -1829,8 +1826,6 @@ github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOan github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -1878,14 +1873,9 @@ github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/go-bindata v3.23.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kevinburke/go-bindata v3.24.0+incompatible h1:qajFA3D0pH94OTLU4zcCCKCDgR+Zr2cZK/RPJHDdFoY= @@ -1899,7 +1889,6 @@ github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= @@ -1940,7 +1929,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= @@ -2012,7 +2000,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -2051,7 +2038,6 @@ github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvls github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -2371,7 +2357,6 @@ github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= @@ -2670,7 +2655,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2829,7 +2813,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -3004,7 +2987,6 @@ golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -3616,7 +3598,6 @@ gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8 gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -3637,7 +3618,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/insecure/go.mod b/insecure/go.mod index d4f03241831..aa2ed1d6d88 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -55,10 +55,10 @@ require ( github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect @@ -138,6 +138,7 @@ require ( github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect github.com/ipfs/go-ds-badger2 v0.1.3 // indirect + github.com/ipfs/go-ds-pebble v0.3.1 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect diff --git a/insecure/go.sum b/insecure/go.sum index fec8cd1bfb7..c6ec1e056ff 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -963,9 +963,7 @@ github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= @@ -1182,22 +1180,23 @@ github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/P github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA= github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe h1:ZBhPcgWjnfy2PFWlvPlcOXAfAQqOIdpfksijpKiMWcc= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe/go.mod h1:BHuaMa/lK7fUe75BlsteiiTu8ptIG+qSAuDtGMArP18= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= @@ -1383,7 +1382,6 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= @@ -1490,7 +1488,6 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -1499,7 +1496,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -1754,7 +1750,6 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1796,6 +1791,8 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= +github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= +github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -1823,8 +1820,6 @@ github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOan github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -1872,14 +1867,9 @@ github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/go-bindata v3.23.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kevinburke/go-bindata v3.24.0+incompatible h1:qajFA3D0pH94OTLU4zcCCKCDgR+Zr2cZK/RPJHDdFoY= @@ -1893,7 +1883,6 @@ github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= @@ -1934,7 +1923,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= @@ -2006,7 +1994,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -2043,7 +2030,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -2353,7 +2339,6 @@ github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= @@ -2654,7 +2639,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2813,7 +2797,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -2988,7 +2971,6 @@ golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -3600,7 +3582,6 @@ gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8 gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -3621,7 +3602,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/integration/go.mod b/integration/go.mod index 138d2e0374c..a85d44c89b9 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -83,10 +83,10 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect @@ -175,6 +175,7 @@ require ( github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect + github.com/ipfs/go-ds-pebble v0.3.1 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect diff --git a/integration/go.sum b/integration/go.sum index 310bad73ae6..3f2680805e2 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -973,9 +973,7 @@ github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= @@ -1186,22 +1184,23 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA= +github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA= github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe h1:ZBhPcgWjnfy2PFWlvPlcOXAfAQqOIdpfksijpKiMWcc= +github.com/cockroachdb/pebble v0.0.0-20231218155426-48b54c29d8fe/go.mod h1:BHuaMa/lK7fUe75BlsteiiTu8ptIG+qSAuDtGMArP18= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= @@ -1406,7 +1405,6 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= @@ -1507,7 +1505,6 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -1516,7 +1513,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -1689,7 +1685,6 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -1748,7 +1743,6 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1788,6 +1782,8 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= +github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= +github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -1815,8 +1811,6 @@ github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOan github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= @@ -1845,7 +1839,6 @@ github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqo github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -1870,14 +1863,9 @@ github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/go-bindata v3.23.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kevinburke/go-bindata v3.24.0+incompatible h1:qajFA3D0pH94OTLU4zcCCKCDgR+Zr2cZK/RPJHDdFoY= @@ -1893,7 +1881,6 @@ github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= @@ -1932,7 +1919,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= @@ -2003,7 +1989,6 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -2044,7 +2029,6 @@ github.com/mdlayher/packet v1.1.1/go.mod h1:DRvYY5mH4M4lUqAnMg04E60U4fjUKMZ/4g2c github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -2131,11 +2115,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= @@ -2334,7 +2315,6 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= @@ -2478,9 +2458,7 @@ github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3C github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= @@ -2629,7 +2607,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2784,7 +2761,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -2957,7 +2933,6 @@ golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -3558,7 +3533,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -3580,7 +3554,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go new file mode 100644 index 00000000000..549fb792adb --- /dev/null +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -0,0 +1,105 @@ +package storage + +import ( + "errors" + + "github.com/dgraph-io/badger/v2" + ds "github.com/ipfs/go-datastore" + badgerds "github.com/ipfs/go-ds-badger2" +) + +var _ StorageDB = (*BadgerDBWrapper)(nil) + +// BadgerDBWrapper wraps the BadgerDB to implement the StorageDB interface. +type BadgerDBWrapper struct { + ds *badgerds.Datastore +} + +func NewBadgerDBWrapper(datastorePath string, options *badgerds.Options) (*BadgerDBWrapper, error) { + ds, err := badgerds.NewDatastore(datastorePath, options) + if err != nil { + return nil, err + } + + return &BadgerDBWrapper{ds}, nil +} + +func (b *BadgerDBWrapper) Datastore() ds.Batching { + return b.ds +} + +func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { + var keys [][]byte + + err := b.ds.DB.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.IteratorOptions{ + PrefetchValues: false, + Prefix: prefix, + }) + defer it.Close() + + for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { + keys = append(keys, it.Item().Key()) + } + return nil + }) + if err != nil { + return nil, err + } + return keys, nil +} + +func (b *BadgerDBWrapper) Get(key []byte) (StorageItem, error) { + var item StorageItem + err := b.ds.DB.View(func(txn *badger.Txn) error { + dbItem, err := txn.Get(key) + if err != nil { + return err + } + val, err := dbItem.ValueCopy(nil) + if err != nil { + return err + } + item = StorageItem{key: key, val: val} + return nil + }) + return item, err +} + +func (b *BadgerDBWrapper) Set(key, val []byte) error { + return b.ds.DB.Update(func(txn *badger.Txn) error { + return txn.Set(key, val) + }) +} + +func (b *BadgerDBWrapper) Delete(key []byte) error { + return b.ds.DB.Update(func(txn *badger.Txn) error { + return txn.Delete(key) + }) +} + +func (b *BadgerDBWrapper) Close() error { + return b.ds.Close() +} + +func (b *BadgerDBWrapper) RetryOnConflict(fn func() error) error { + for { + err := fn() + if errors.Is(err, badger.ErrConflict) { + continue + } + return err + } +} + +func (b *BadgerDBWrapper) MaxBatchCount() int64 { + return b.ds.DB.MaxBatchCount() +} + +func (b *BadgerDBWrapper) MaxBatchSize() int64 { + return b.ds.DB.MaxBatchSize() +} + +func (b *BadgerDBWrapper) RunValueLogGC(discardRatio float64) error { + return b.ds.DB.RunValueLogGC(discardRatio) +} diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go new file mode 100644 index 00000000000..7566ec2f04b --- /dev/null +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -0,0 +1,92 @@ +package storage + +import ( + "context" + "fmt" + + "github.com/cockroachdb/pebble" + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/query" + pebbleds "github.com/ipfs/go-ds-pebble" +) + +var _ StorageDB = (*PebbleDBWrapper)(nil) + +// PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. +type PebbleDBWrapper struct { + ds *pebbleds.Datastore +} + +func NewPebbleDBWrapper(datastorePath string, options *pebble.Options) (*PebbleDBWrapper, error) { + db, err := pebbleds.NewDatastore(datastorePath, options) + if err != nil { + return nil, fmt.Errorf("could not open tracker ds: %w", err) + } + + return &PebbleDBWrapper{db}, nil +} + +func (p *PebbleDBWrapper) Datastore() ds.Batching { + return p.ds +} + +func (p *PebbleDBWrapper) Keys(prefix []byte) ([][]byte, error) { + var keys [][]byte + var q query.Query + q.Prefix = string(prefix[:]) + + result, err := p.ds.Query(context.Background(), q) + if err != nil { + return nil, err + } + + entries, _ := result.Rest() + if err != nil { + return nil, err + } + + for _, entry := range entries { + keys = append(keys, []byte(entry.Key)) + } + + return keys, nil +} + +func (p *PebbleDBWrapper) Get(key []byte) (StorageItem, error) { + val, err := p.ds.Get(context.Background(), ds.NewKey(string(key))) + if err != nil { + return StorageItem{}, err + } + return StorageItem{key: key, val: val}, nil +} + +func (p *PebbleDBWrapper) Set(key, val []byte) error { + return p.ds.Put(context.Background(), ds.NewKey(string(key)), val) +} + +func (p *PebbleDBWrapper) Delete(key []byte) error { + return p.ds.Delete(context.Background(), ds.NewKey(string(key))) +} + +func (p *PebbleDBWrapper) Close() error { + return p.ds.Close() +} + +func (p *PebbleDBWrapper) RetryOnConflict(_ func() error) error { + return nil +} + +// TODO: implement +func (p *PebbleDBWrapper) MaxBatchCount() int64 { + return 0 +} + +// TODO: implement +func (p *PebbleDBWrapper) MaxBatchSize() int64 { + return 0 +} + +func (p *PebbleDBWrapper) RunValueLogGC(_ float64) error { + // PebbleDB (go-ds-pebble) does not have a direct equivalent to Badger's value log GC. + return nil +} diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go new file mode 100644 index 00000000000..0a6199a25ed --- /dev/null +++ b/module/executiondatasync/storage/storage_db.go @@ -0,0 +1,36 @@ +package storage + +import ( + "github.com/ipfs/go-datastore" +) + +// TODO: rename +// StorageDB defines the interface for key-value store operations. +type StorageDB interface { + Datastore() datastore.Batching + + Get(key []byte) (StorageItem, error) + Set(key, val []byte) error + Delete(key []byte) error + Close() error + + Keys(prefix []byte) ([][]byte, error) + + RetryOnConflict(fn func() error) error + MaxBatchCount() int64 + MaxBatchSize() int64 + RunValueLogGC(discardRatio float64) error +} + +type StorageItem struct { + key []byte + val []byte +} + +func (i *StorageItem) ValueCopy(dst []byte) ([]byte, error) { + return append(dst, i.val...), nil +} + +func (i *StorageItem) Key() []byte { + return i.key +} From a6607f633b04c44c2d479ecd5a29ff4fe9ed42d6 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 4 Jul 2024 17:48:42 +0300 Subject: [PATCH 02/26] Added extra flag for pebble db to AN and ON, updated tracker storage --- .../node_builder/access_node_builder.go | 34 ++- cmd/execution_builder.go | 11 +- cmd/observer/node_builder/observer_builder.go | 31 ++- module/executiondatasync/tracker/storage.go | 251 ++++++++---------- 4 files changed, 165 insertions(+), 162 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 2a985da3dd8..f6db71a2bff 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -12,10 +12,12 @@ import ( "time" "github.com/ipfs/boxo/bitswap" + "github.com/ipfs/go-datastore" badger "github.com/ipfs/go-ds-badger2" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/routing" "github.com/onflow/crypto" + storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow/protobuf/go/flow/access" "github.com/rs/zerolog" "github.com/spf13/pflag" @@ -146,6 +148,7 @@ type AccessNodeConfig struct { executionDataDir string executionDataStartHeight uint64 executionDataConfig edrequester.ExecutionDataConfig + pebbleDBExecutionDataEnabled bool PublicNetworkConfig PublicNetworkConfig TxResultCacheSize uint TxErrorMessagesCacheSize uint @@ -247,6 +250,7 @@ func DefaultAccessNodeConfig() *AccessNodeConfig { MaxRetryDelay: edrequester.DefaultMaxRetryDelay, }, executionDataIndexingEnabled: false, + pebbleDBExecutionDataEnabled: false, registersDBPath: filepath.Join(homedir, ".flow", "execution_state"), checkpointFile: cmd.NotSet, scriptExecutorConfig: query.NewDefaultConfig(), @@ -502,7 +506,8 @@ func (builder *FlowAccessNodeBuilder) BuildConsensusFollower() *FlowAccessNodeBu } func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccessNodeBuilder { - var ds *badger.Datastore + var ds datastore.Batching + var storageDB storage2.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -525,14 +530,21 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess if err != nil { return err } - - ds, err = badger.NewDatastore(datastoreDir, &badger.DefaultOptions) - if err != nil { - return err + if builder.pebbleDBExecutionDataEnabled { + storageDB, err = storage2.NewPebbleDBWrapper(datastoreDir, nil) + if err != nil { + return err + } + } else { + storageDB, err = storage2.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + if err != nil { + return err + } } + ds = storageDB.Datastore() builder.ShutdownFunc(func() error { - if err := ds.Close(); err != nil { + if err := storageDB.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -543,13 +555,15 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(ds.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + //TODO: Uliana: ask + processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(ds.DB, module.ConsumeProgressExecutionDataRequesterNotification) + //TODO: Uliana: ask + processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { @@ -1179,6 +1193,10 @@ func (builder *FlowAccessNodeBuilder) extraFlags() { "execution-data-max-retry-delay", defaultConfig.executionDataConfig.MaxRetryDelay, "maximum delay for exponential backoff when fetching execution data fails e.g. 5m") + flags.BoolVar(&builder.pebbleDBExecutionDataEnabled, + "pebble-execution-data-db-enabled", + defaultConfig.pebbleDBExecutionDataEnabled, + "[experimental] whether to enable the pebble as the DB for execution data") // Execution State Streaming API flags.Uint32Var(&builder.stateStreamConf.ExecutionDataCacheSize, "execution-data-cache-size", defaultConfig.stateStreamConf.ExecutionDataCacheSize, "block execution data cache size") diff --git a/cmd/execution_builder.go b/cmd/execution_builder.go index 3841f70f5f5..edf378f2f46 100644 --- a/cmd/execution_builder.go +++ b/cmd/execution_builder.go @@ -19,6 +19,7 @@ import ( badger "github.com/ipfs/go-ds-badger2" "github.com/onflow/cadence" "github.com/onflow/flow-core-contracts/lib/go/templates" + storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/shirou/gopsutil/v3/cpu" @@ -942,8 +943,16 @@ func (exeNode *ExecutionNode) LoadExecutionDataPruner( } trackerDir := filepath.Join(exeNode.exeConf.executionDataDir, "tracker") + + options := badger.DefaultOptions + options.Options = badgerDB.LSMOnlyOptions(trackerDir) + badgerDBWrapper, err := storage2.NewBadgerDBWrapper(trackerDir, &options) + if err != nil { + return nil, fmt.Errorf("could not create BadgerDBWrapper: %w", err) + } + exeNode.executionDataTracker, err = tracker.OpenStorage( - trackerDir, + badgerDBWrapper, sealed.Height, node.Logger, tracker.WithPruneCallback(func(c cid.Cid) error { diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index ee817aa985b..5f9884d7709 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -14,12 +14,14 @@ import ( "time" "github.com/ipfs/boxo/bitswap" + "github.com/ipfs/go-datastore" badger "github.com/ipfs/go-ds-badger2" dht "github.com/libp2p/go-libp2p-kad-dht" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/routing" "github.com/onflow/crypto" + storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/rs/zerolog" "github.com/spf13/pflag" "google.golang.org/grpc/credentials" @@ -149,6 +151,7 @@ type ObserverServiceConfig struct { logTxTimeToFinalizedExecuted bool executionDataSyncEnabled bool executionDataIndexingEnabled bool + pebbleDBExecutionDataEnabled bool localServiceAPIEnabled bool executionDataDir string executionDataStartHeight uint64 @@ -219,6 +222,7 @@ func DefaultObserverServiceConfig() *ObserverServiceConfig { logTxTimeToFinalizedExecuted: false, executionDataSyncEnabled: false, executionDataIndexingEnabled: false, + pebbleDBExecutionDataEnabled: false, localServiceAPIEnabled: false, executionDataDir: filepath.Join(homedir, ".flow", "execution_data"), executionDataStartHeight: 0, @@ -656,6 +660,10 @@ func (builder *ObserverServiceBuilder) extraFlags() { flags.BoolVar(&builder.localServiceAPIEnabled, "local-service-api-enabled", defaultConfig.localServiceAPIEnabled, "whether to use local indexed data for api queries") flags.StringVar(&builder.registersDBPath, "execution-state-dir", defaultConfig.registersDBPath, "directory to use for execution-state database") flags.StringVar(&builder.checkpointFile, "execution-state-checkpoint", defaultConfig.checkpointFile, "execution-state checkpoint file") + flags.BoolVar(&builder.pebbleDBExecutionDataEnabled, + "pebble-execution-data-db-enabled", + defaultConfig.pebbleDBExecutionDataEnabled, + "[experimental] whether to enable the pebble as the DB for execution data") // ExecutionDataRequester config flags.BoolVar(&builder.executionDataSyncEnabled, @@ -1059,7 +1067,8 @@ func (builder *ObserverServiceBuilder) Build() (cmd.Node, error) { } func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverServiceBuilder { - var ds *badger.Datastore + var ds datastore.Batching + var storageDB storage2.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -1083,13 +1092,21 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return err } - ds, err = badger.NewDatastore(datastoreDir, &badger.DefaultOptions) - if err != nil { - return err + if builder.pebbleDBExecutionDataEnabled { + storageDB, err = storage2.NewPebbleDBWrapper(datastoreDir, nil) + if err != nil { + return err + } + } else { + storageDB, err = storage2.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + if err != nil { + return err + } } + ds = storageDB.Datastore() builder.ShutdownFunc(func() error { - if err := ds.Close(); err != nil { + if err := storageDB.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -1100,13 +1117,13 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(ds.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(ds.DB, module.ConsumeProgressExecutionDataRequesterNotification) + processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { diff --git a/module/executiondatasync/tracker/storage.go b/module/executiondatasync/tracker/storage.go index 4c47ccad5ca..a6306696f85 100644 --- a/module/executiondatasync/tracker/storage.go +++ b/module/executiondatasync/tracker/storage.go @@ -9,6 +9,7 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/hashicorp/go-multierror" "github.com/ipfs/go-cid" + storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/rs/zerolog" "github.com/onflow/flow-go/module/blobs" @@ -28,16 +29,6 @@ const ( const cidsPerBatch = 16 // number of cids to track per batch -func retryOnConflict(db *badger.DB, fn func(txn *badger.Txn) error) error { - for { - err := db.Update(fn) - if errors.Is(err, badger.ErrConflict) { - continue - } - return err - } -} - const globalStateKeyLength = 2 func makeGlobalStateKey(state byte) []byte { @@ -78,7 +69,7 @@ func makeUint64Value(v uint64) []byte { return value } -func getUint64Value(item *badger.Item) (uint64, error) { +func getUint64Value(item storage2.StorageItem) (uint64, error) { value, err := item.ValueCopy(nil) if err != nil { return 0, err @@ -89,7 +80,7 @@ func getUint64Value(item *badger.Item) (uint64, error) { // getBatchItemCountLimit returns the maximum number of items that can be included in a single batch // transaction based on the number / total size of updates per item. -func getBatchItemCountLimit(db *badger.DB, writeCountPerItem int64, writeSizePerItem int64) int { +func getBatchItemCountLimit(db storage2.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { totalSizePerItem := 2*writeCountPerItem + writeSizePerItem // 2 bytes per entry for user and internal meta maxItemCountByWriteCount := db.MaxBatchCount() / writeCountPerItem maxItemCountByWriteSize := db.MaxBatchSize() / totalSizePerItem @@ -175,7 +166,7 @@ type storage struct { // we acquire the write lock when we want to perform a prune WRITE mu sync.RWMutex - db *badger.DB + db storage2.StorageDB pruneCallback PruneCallback logger zerolog.Logger } @@ -188,12 +179,8 @@ func WithPruneCallback(callback PruneCallback) StorageOption { } } -func OpenStorage(dbPath string, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { +func OpenStorage(db storage2.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { lg := logger.With().Str("module", "tracker_storage").Logger() - db, err := badger.Open(badger.LSMOnlyOptions(dbPath)) - if err != nil { - return nil, fmt.Errorf("could not open tracker db: %w", err) - } storage := &storage{ db: db, @@ -236,7 +223,7 @@ func (s *storage) init(startHeight uint64) error { } s.logger.Info().Msgf("finished pruning") } else if errors.Is(fulfilledHeightErr, badger.ErrKeyNotFound) && errors.Is(prunedHeightErr, badger.ErrKeyNotFound) { - // db is empty, we need to bootstrap it + // ds is empty, we need to bootstrap it if err := s.bootstrap(startHeight); err != nil { return fmt.Errorf("failed to bootstrap storage: %w", err) } @@ -254,17 +241,15 @@ func (s *storage) bootstrap(startHeight uint64) error { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) prunedHeightValue := makeUint64Value(startHeight) - return s.db.Update(func(txn *badger.Txn) error { - if err := txn.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { - return fmt.Errorf("failed to set fulfilled height value: %w", err) - } + if err := s.db.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { + return fmt.Errorf("failed to set fulfilled height value: %w", err) + } - if err := txn.Set(prunedHeightKey, prunedHeightValue); err != nil { - return fmt.Errorf("failed to set pruned height value: %w", err) - } + if err := s.db.Set(prunedHeightKey, prunedHeightValue); err != nil { + return fmt.Errorf("failed to set pruned height value: %w", err) + } - return nil - }) + return nil } func (s *storage) Update(f UpdateFn) error { @@ -277,45 +262,37 @@ func (s *storage) SetFulfilledHeight(height uint64) error { fulfilledHeightKey := makeGlobalStateKey(globalStateFulfilledHeight) fulfilledHeightValue := makeUint64Value(height) - return s.db.Update(func(txn *badger.Txn) error { - if err := txn.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { - return fmt.Errorf("failed to set fulfilled height value: %w", err) - } + if err := s.db.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { + return fmt.Errorf("failed to set fulfilled height value: %w", err) + } - return nil - }) + return nil } func (s *storage) GetFulfilledHeight() (uint64, error) { fulfilledHeightKey := makeGlobalStateKey(globalStateFulfilledHeight) var fulfilledHeight uint64 - if err := s.db.View(func(txn *badger.Txn) error { - item, err := txn.Get(fulfilledHeightKey) - if err != nil { - return fmt.Errorf("failed to find fulfilled height entry: %w", err) - } - - fulfilledHeight, err = getUint64Value(item) - if err != nil { - return fmt.Errorf("failed to retrieve fulfilled height value: %w", err) - } + item, err := s.db.Get(fulfilledHeightKey) + if err != nil { + return 0, fmt.Errorf("failed to find fulfilled height entry: %w", err) + } - return nil - }); err != nil { - return 0, err + fulfilledHeight, err = getUint64Value(item) + if err != nil { + return 0, fmt.Errorf("failed to retrieve fulfilled height value: %w", err) } return fulfilledHeight, nil } -func (s *storage) trackBlob(txn *badger.Txn, blockHeight uint64, c cid.Cid) error { - if err := txn.Set(makeBlobRecordKey(blockHeight, c), nil); err != nil { +func (s *storage) trackBlob(blockHeight uint64, c cid.Cid) error { + if err := s.db.Set(makeBlobRecordKey(blockHeight, c), nil); err != nil { return fmt.Errorf("failed to add blob record: %w", err) } latestHeightKey := makeLatestHeightKey(c) - item, err := txn.Get(latestHeightKey) + item, err := s.db.Get(latestHeightKey) if err != nil { if !errors.Is(err, badger.ErrKeyNotFound) { return fmt.Errorf("failed to get latest height: %w", err) @@ -334,7 +311,7 @@ func (s *storage) trackBlob(txn *badger.Txn, blockHeight uint64, c cid.Cid) erro latestHeightValue := makeUint64Value(blockHeight) - if err := txn.Set(latestHeightKey, latestHeightValue); err != nil { + if err := s.db.Set(latestHeightKey, latestHeightValue); err != nil { return fmt.Errorf("failed to set latest height value: %w", err) } @@ -355,15 +332,16 @@ func (s *storage) trackBlobs(blockHeight uint64, cids ...cid.Cid) error { } batch := cids[:batchSize] - if err := retryOnConflict(s.db, func(txn *badger.Txn) error { + err := s.db.RetryOnConflict(func() error { for _, c := range batch { - if err := s.trackBlob(txn, blockHeight, c); err != nil { + err := s.trackBlob(blockHeight, c) + if err != nil { return fmt.Errorf("failed to track blob %s: %w", c.String(), err) } } - return nil - }); err != nil { + }) + if err != nil { return err } @@ -374,21 +352,19 @@ func (s *storage) trackBlobs(blockHeight uint64, cids ...cid.Cid) error { } func (s *storage) batchDelete(deleteInfos []*deleteInfo) error { - return s.db.Update(func(txn *badger.Txn) error { - for _, dInfo := range deleteInfos { - if err := txn.Delete(makeBlobRecordKey(dInfo.height, dInfo.cid)); err != nil { - return fmt.Errorf("failed to delete blob record for Cid %s: %w", dInfo.cid.String(), err) - } + for _, dInfo := range deleteInfos { + if err := s.db.Delete(makeBlobRecordKey(dInfo.height, dInfo.cid)); err != nil { + return fmt.Errorf("failed to delete blob record for Cid %s: %w", dInfo.cid.String(), err) + } - if dInfo.deleteLatestHeightRecord { - if err := txn.Delete(makeLatestHeightKey(dInfo.cid)); err != nil { - return fmt.Errorf("failed to delete latest height record for Cid %s: %w", dInfo.cid.String(), err) - } + if dInfo.deleteLatestHeightRecord { + if err := s.db.Delete(makeLatestHeightKey(dInfo.cid)); err != nil { + return fmt.Errorf("failed to delete latest height record for Cid %s: %w", dInfo.cid.String(), err) } } + } - return nil - }) + return nil } func (s *storage) batchDeleteItemLimit() int { @@ -412,82 +388,72 @@ func (s *storage) PruneUpToHeight(height uint64) error { return err } - if err := s.db.View(func(txn *badger.Txn) error { - it := txn.NewIterator(badger.IteratorOptions{ - PrefetchValues: false, - Prefix: blobRecordPrefix, - }) - defer it.Close() - - // iterate over blob records, calling pruneCallback for any CIDs that should be pruned - // and cleaning up the corresponding tracker records - for it.Seek(blobRecordPrefix); it.ValidForPrefix(blobRecordPrefix); it.Next() { - blobRecordItem := it.Item() - blobRecordKey := blobRecordItem.Key() - - blockHeight, blobCid, err := parseBlobRecordKey(blobRecordKey) - if err != nil { - return fmt.Errorf("malformed blob record key %v: %w", blobRecordKey, err) - } + keys, err := s.db.Keys(blobRecordPrefix) + if err != nil { + return err + } - // iteration occurs in key order, so block heights are guaranteed to be ascending - if blockHeight > height { - break - } + // iterate over blob records, calling pruneCallback for any CIDs that should be pruned + // and cleaning up the corresponding tracker records + for _, blobRecordKey := range keys { + blockHeight, blobCid, err := parseBlobRecordKey(blobRecordKey) + if err != nil { + return fmt.Errorf("malformed blob record key %v: %w", blobRecordKey, err) + } - dInfo := &deleteInfo{ - cid: blobCid, - height: blockHeight, - } + // iteration occurs in key order, so block heights are guaranteed to be ascending + if blockHeight > height { + break + } - latestHeightKey := makeLatestHeightKey(blobCid) - latestHeightItem, err := txn.Get(latestHeightKey) - if err != nil { - return fmt.Errorf("failed to get latest height entry for Cid %s: %w", blobCid.String(), err) - } + dInfo := &deleteInfo{ + cid: blobCid, + height: blockHeight, + } - latestHeight, err := getUint64Value(latestHeightItem) - if err != nil { - return fmt.Errorf("failed to retrieve latest height value for Cid %s: %w", blobCid.String(), err) - } + latestHeightKey := makeLatestHeightKey(blobCid) + latestHeightItem, err := s.db.Get(latestHeightKey) + if err != nil { + return fmt.Errorf("failed to get latest height entry for Cid %s: %w", blobCid.String(), err) + } - // a blob is only removable if it is not referenced by any blob tree at a higher height - if latestHeight < blockHeight { - // this should never happen - return fmt.Errorf( - "inconsistency detected: latest height recorded for Cid %s is %d, but blob record exists at height %d", - blobCid.String(), latestHeight, blockHeight, - ) - } + latestHeight, err := getUint64Value(latestHeightItem) + if err != nil { + return fmt.Errorf("failed to retrieve latest height value for Cid %s: %w", blobCid.String(), err) + } - // the current block height is the last to reference this CID, prune the CID and remove - // all tracker records - if latestHeight == blockHeight { - if err := s.pruneCallback(blobCid); err != nil { - return err - } - dInfo.deleteLatestHeightRecord = true - } + // a blob is only removable if it is not referenced by any blob tree at a higher height + if latestHeight < blockHeight { + // this should never happen + return fmt.Errorf( + "inconsistency detected: latest height recorded for Cid %s is %d, but blob record exists at height %d", + blobCid.String(), latestHeight, blockHeight, + ) + } - // remove tracker records for pruned heights - batch = append(batch, dInfo) - if len(batch) == itemsPerBatch { - if err := s.batchDelete(batch); err != nil { - return err - } - batch = nil + // the current block height is the last to reference this CID, prune the CID and remove + // all tracker records + if latestHeight == blockHeight { + if err := s.pruneCallback(blobCid); err != nil { + return err } + dInfo.deleteLatestHeightRecord = true } - if len(batch) > 0 { + // remove tracker records for pruned heights + batch = append(batch, dInfo) + if len(batch) == itemsPerBatch { if err := s.batchDelete(batch); err != nil { return err } + batch = nil } + } - return nil - }); err != nil { - return err + if len(batch) > 0 { + if err := s.batchDelete(batch); err != nil { + return err + } } // this is a good time to do garbage collection @@ -502,33 +468,26 @@ func (s *storage) setPrunedHeight(height uint64) error { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) prunedHeightValue := makeUint64Value(height) - return s.db.Update(func(txn *badger.Txn) error { - if err := txn.Set(prunedHeightKey, prunedHeightValue); err != nil { - return fmt.Errorf("failed to set pruned height value: %w", err) - } + if err := s.db.Set(prunedHeightKey, prunedHeightValue); err != nil { + return fmt.Errorf("failed to set pruned height value: %w", err) + } + + return nil - return nil - }) } func (s *storage) GetPrunedHeight() (uint64, error) { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) var prunedHeight uint64 - if err := s.db.View(func(txn *badger.Txn) error { - item, err := txn.Get(prunedHeightKey) - if err != nil { - return fmt.Errorf("failed to find pruned height entry: %w", err) - } - - prunedHeight, err = getUint64Value(item) - if err != nil { - return fmt.Errorf("failed to retrieve pruned height value: %w", err) - } + item, err := s.db.Get(prunedHeightKey) + if err != nil { + return 0, fmt.Errorf("failed to find pruned height entry: %w", err) + } - return nil - }); err != nil { - return 0, err + prunedHeight, err = getUint64Value(item) + if err != nil { + return 0, fmt.Errorf("failed to retrieve pruned height value: %w", err) } return prunedHeight, nil From e6740897a0d30cf25f9dd7973a9755a83cd5f94c Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 4 Jul 2024 19:51:55 +0300 Subject: [PATCH 03/26] Updated imports name --- cmd/access/node_builder/access_node_builder.go | 10 ++++------ cmd/observer/node_builder/observer_builder.go | 8 ++++---- module/executiondatasync/tracker/storage.go | 10 +++++----- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index f6db71a2bff..e29935a4669 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -17,7 +17,6 @@ import ( "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/routing" "github.com/onflow/crypto" - storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow/protobuf/go/flow/access" "github.com/rs/zerolog" "github.com/spf13/pflag" @@ -67,6 +66,7 @@ import ( "github.com/onflow/flow-go/module/execution" "github.com/onflow/flow-go/module/executiondatasync/execution_data" execdatacache "github.com/onflow/flow-go/module/executiondatasync/execution_data/cache" + storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" "github.com/onflow/flow-go/module/grpcserver" "github.com/onflow/flow-go/module/id" @@ -507,7 +507,7 @@ func (builder *FlowAccessNodeBuilder) BuildConsensusFollower() *FlowAccessNodeBu func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccessNodeBuilder { var ds datastore.Batching - var storageDB storage2.StorageDB + var storageDB storagedb.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -531,12 +531,12 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess return err } if builder.pebbleDBExecutionDataEnabled { - storageDB, err = storage2.NewPebbleDBWrapper(datastoreDir, nil) + storageDB, err = storagedb.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return err } } else { - storageDB, err = storage2.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + storageDB, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) if err != nil { return err } @@ -555,14 +555,12 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - //TODO: Uliana: ask processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - //TODO: Uliana: ask processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 5f9884d7709..7f353d16869 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -21,7 +21,6 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/routing" "github.com/onflow/crypto" - storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/rs/zerolog" "github.com/spf13/pflag" "google.golang.org/grpc/credentials" @@ -66,6 +65,7 @@ import ( "github.com/onflow/flow-go/module/execution" "github.com/onflow/flow-go/module/executiondatasync/execution_data" execdatacache "github.com/onflow/flow-go/module/executiondatasync/execution_data/cache" + storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" "github.com/onflow/flow-go/module/grpcserver" "github.com/onflow/flow-go/module/id" @@ -1068,7 +1068,7 @@ func (builder *ObserverServiceBuilder) Build() (cmd.Node, error) { func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverServiceBuilder { var ds datastore.Batching - var storageDB storage2.StorageDB + var storageDB storagedb.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -1093,12 +1093,12 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } if builder.pebbleDBExecutionDataEnabled { - storageDB, err = storage2.NewPebbleDBWrapper(datastoreDir, nil) + storageDB, err = storagedb.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return err } } else { - storageDB, err = storage2.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + storageDB, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) if err != nil { return err } diff --git a/module/executiondatasync/tracker/storage.go b/module/executiondatasync/tracker/storage.go index a6306696f85..5ae7b6007bd 100644 --- a/module/executiondatasync/tracker/storage.go +++ b/module/executiondatasync/tracker/storage.go @@ -9,10 +9,10 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/hashicorp/go-multierror" "github.com/ipfs/go-cid" - storage2 "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/rs/zerolog" "github.com/onflow/flow-go/module/blobs" + storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" ) // badger key prefixes @@ -69,7 +69,7 @@ func makeUint64Value(v uint64) []byte { return value } -func getUint64Value(item storage2.StorageItem) (uint64, error) { +func getUint64Value(item storagedb.StorageItem) (uint64, error) { value, err := item.ValueCopy(nil) if err != nil { return 0, err @@ -80,7 +80,7 @@ func getUint64Value(item storage2.StorageItem) (uint64, error) { // getBatchItemCountLimit returns the maximum number of items that can be included in a single batch // transaction based on the number / total size of updates per item. -func getBatchItemCountLimit(db storage2.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { +func getBatchItemCountLimit(db storagedb.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { totalSizePerItem := 2*writeCountPerItem + writeSizePerItem // 2 bytes per entry for user and internal meta maxItemCountByWriteCount := db.MaxBatchCount() / writeCountPerItem maxItemCountByWriteSize := db.MaxBatchSize() / totalSizePerItem @@ -166,7 +166,7 @@ type storage struct { // we acquire the write lock when we want to perform a prune WRITE mu sync.RWMutex - db storage2.StorageDB + db storagedb.StorageDB pruneCallback PruneCallback logger zerolog.Logger } @@ -179,7 +179,7 @@ func WithPruneCallback(callback PruneCallback) StorageOption { } } -func OpenStorage(db storage2.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { +func OpenStorage(db storagedb.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { lg := logger.With().Str("module", "tracker_storage").Logger() storage := &storage{ From 1c106c0faa223baadbd82de5a8bee2ddd2ce650c Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 4 Jul 2024 20:18:56 +0300 Subject: [PATCH 04/26] Added StorageItem interface for storage element --- .../storage/badger_storage_db.go | 12 ++++-------- .../storage/pebble_storage_db.go | 19 +++++++++++++++++-- .../executiondatasync/storage/storage_db.go | 14 +++----------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 549fb792adb..33fd847244c 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -50,17 +50,13 @@ func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { } func (b *BadgerDBWrapper) Get(key []byte) (StorageItem, error) { - var item StorageItem - err := b.ds.DB.View(func(txn *badger.Txn) error { - dbItem, err := txn.Get(key) - if err != nil { - return err - } - val, err := dbItem.ValueCopy(nil) + var item *badger.Item + var err error + err = b.ds.DB.View(func(txn *badger.Txn) error { + item, err = txn.Get(key) if err != nil { return err } - item = StorageItem{key: key, val: val} return nil }) return item, err diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index 7566ec2f04b..11b3d135295 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -55,9 +55,9 @@ func (p *PebbleDBWrapper) Keys(prefix []byte) ([][]byte, error) { func (p *PebbleDBWrapper) Get(key []byte) (StorageItem, error) { val, err := p.ds.Get(context.Background(), ds.NewKey(string(key))) if err != nil { - return StorageItem{}, err + return &PebbleItem{}, err } - return StorageItem{key: key, val: val}, nil + return &PebbleItem{key: key, val: val}, nil } func (p *PebbleDBWrapper) Set(key, val []byte) error { @@ -90,3 +90,18 @@ func (p *PebbleDBWrapper) RunValueLogGC(_ float64) error { // PebbleDB (go-ds-pebble) does not have a direct equivalent to Badger's value log GC. return nil } + +var _ StorageItem = (*PebbleItem)(nil) + +type PebbleItem struct { + key []byte + val []byte +} + +func (i *PebbleItem) ValueCopy(dst []byte) ([]byte, error) { + return append(dst, i.val...), nil +} + +func (i *PebbleItem) Key() []byte { + return i.key +} diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go index 0a6199a25ed..6afcd910334 100644 --- a/module/executiondatasync/storage/storage_db.go +++ b/module/executiondatasync/storage/storage_db.go @@ -22,15 +22,7 @@ type StorageDB interface { RunValueLogGC(discardRatio float64) error } -type StorageItem struct { - key []byte - val []byte -} - -func (i *StorageItem) ValueCopy(dst []byte) ([]byte, error) { - return append(dst, i.val...), nil -} - -func (i *StorageItem) Key() []byte { - return i.key +type StorageItem interface { + ValueCopy(dst []byte) ([]byte, error) + Key() []byte } From bc3fecd9ad62b0a95e93dcf98fc95e18e917f945 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Mon, 8 Jul 2024 17:13:36 +0300 Subject: [PATCH 05/26] Updated flow/go-ethereum version to newer according pebble datastore version --- go.mod | 3 +++ go.sum | 4 ++-- insecure/go.mod | 3 +++ insecure/go.sum | 4 ++-- integration/go.mod | 3 +++ integration/go.sum | 4 ++-- 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index dafef4b183d..c68eb29eab8 100644 --- a/go.mod +++ b/go.mod @@ -329,3 +329,6 @@ require ( // Using custom fork until https://github.com/onflow/flow-go/issues/5338 is resolved replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 + +// TODO: remove after merged +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 diff --git a/go.sum b/go.sum index b6212d51f54..74bfdb69022 100644 --- a/go.sum +++ b/go.sum @@ -988,6 +988,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -2182,8 +2184,6 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.4 h1:lD1owoZGFgLcvdLZDmP0Kc4GOuQeSU3/d7hrujFzt6k= github.com/onflow/flow/protobuf/go/flow v0.4.4/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= -github.com/onflow/go-ethereum v1.13.4 h1:iNO86fm8RbBbhZ87ZulblInqCdHnAQVY8okBrNsTevc= -github.com/onflow/go-ethereum v1.13.4/go.mod h1:cE/gEUkAffhwbVmMJYz+t1dAfVNHNwZCgc3BWtZxBGY= github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 h1:sxyWLqGm/p4EKT6DUlQESDG1ZNMN9GjPCm1gTq7NGfc= github.com/onflow/nft-storefront/lib/go/contracts v1.0.0/go.mod h1:kMeq9zUwCrgrSojEbTUTTJpZ4WwacVm2pA7LVFr+glk= github.com/onflow/sdks v0.5.1-0.20230912225508-b35402f12bba/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= diff --git a/insecure/go.mod b/insecure/go.mod index c73b315c9c9..093b43997ab 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -306,3 +306,6 @@ require ( ) replace github.com/onflow/flow-go => ../ + +// TODO: remove after merged +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 diff --git a/insecure/go.sum b/insecure/go.sum index 2b861e11578..7bbe6fee6c3 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -988,6 +988,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -2169,8 +2171,6 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.4 h1:lD1owoZGFgLcvdLZDmP0Kc4GOuQeSU3/d7hrujFzt6k= github.com/onflow/flow/protobuf/go/flow v0.4.4/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= -github.com/onflow/go-ethereum v1.13.4 h1:iNO86fm8RbBbhZ87ZulblInqCdHnAQVY8okBrNsTevc= -github.com/onflow/go-ethereum v1.13.4/go.mod h1:cE/gEUkAffhwbVmMJYz+t1dAfVNHNwZCgc3BWtZxBGY= github.com/onflow/sdks v0.5.1-0.20230912225508-b35402f12bba/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= github.com/onflow/sdks v0.6.0-preview.1 h1:mb/cUezuqWEP1gFZNAgUI4boBltudv4nlfxke1KBp9k= github.com/onflow/sdks v0.6.0-preview.1/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= diff --git a/integration/go.mod b/integration/go.mod index b3fe28e78b2..e204c541331 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -357,3 +357,6 @@ require ( replace github.com/onflow/flow-go => ../ replace github.com/onflow/flow-go/insecure => ../insecure + +// TODO: remove after merged +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 diff --git a/integration/go.sum b/integration/go.sum index e45806dd565..b2fa1cb6ca6 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -998,6 +998,8 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -2156,8 +2158,6 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.4 h1:lD1owoZGFgLcvdLZDmP0Kc4GOuQeSU3/d7hrujFzt6k= github.com/onflow/flow/protobuf/go/flow v0.4.4/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= -github.com/onflow/go-ethereum v1.13.4 h1:iNO86fm8RbBbhZ87ZulblInqCdHnAQVY8okBrNsTevc= -github.com/onflow/go-ethereum v1.13.4/go.mod h1:cE/gEUkAffhwbVmMJYz+t1dAfVNHNwZCgc3BWtZxBGY= github.com/onflow/sdks v0.5.1-0.20230912225508-b35402f12bba/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= github.com/onflow/sdks v0.6.0-preview.1 h1:mb/cUezuqWEP1gFZNAgUI4boBltudv4nlfxke1KBp9k= github.com/onflow/sdks v0.6.0-preview.1/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= From 9c515325c842bae800fb10d6448801cbd8abc40a Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Mon, 8 Jul 2024 18:14:36 +0300 Subject: [PATCH 06/26] Updated Keys method for badger wrapper --- module/executiondatasync/storage/badger_storage_db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 66082145789..7764bfc26c0 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -40,7 +40,7 @@ func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { defer it.Close() for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { - keys = append(keys, it.Item().Key()) + keys = append(keys, it.Item().KeyCopy(nil)) } return nil }) From 9132f868eb476482c15e8646541ef2e58e0aaeec Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 9 Jul 2024 13:49:05 +0300 Subject: [PATCH 07/26] Updated imports name --- .../node_builder/access_node_builder.go | 10 +++++----- cmd/execution_builder.go | 20 +++++++++---------- cmd/observer/node_builder/observer_builder.go | 10 +++++----- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index a5537ce63d4..570851bcc31 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -11,11 +11,11 @@ import ( "strings" "time" - badgerDB "github.com/dgraph-io/badger/v2" + "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" - badger "github.com/ipfs/go-ds-badger2" + badgerds "github.com/ipfs/go-ds-badger2" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/routing" "github.com/onflow/crypto" @@ -547,7 +547,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess return err } } else { - builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return err } @@ -651,8 +651,8 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } } else { - options := badger.DefaultOptions - options.Options = badgerDB.LSMOnlyOptions(trackerDir) + options := badgerds.DefaultOptions + options.Options = badger.LSMOnlyOptions(trackerDir) storageDB, err = storagedb.NewBadgerDBWrapper(trackerDir, &options) if err != nil { return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) diff --git a/cmd/execution_builder.go b/cmd/execution_builder.go index d3e43d9e78a..b61dece7dac 100644 --- a/cmd/execution_builder.go +++ b/cmd/execution_builder.go @@ -13,10 +13,10 @@ import ( awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" - badgerDB "github.com/dgraph-io/badger/v2" + "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" - badger "github.com/ipfs/go-ds-badger2" + badgerds "github.com/ipfs/go-ds-badger2" "github.com/onflow/cadence" "github.com/onflow/flow-core-contracts/lib/go/templates" "github.com/rs/zerolog" @@ -155,7 +155,7 @@ type ExecutionNode struct { executionDataStore execution_data.ExecutionDataStore toTriggerCheckpoint *atomic.Bool // create the checkpoint trigger to be controlled by admin tool, and listened by the compactor stopControl *stop.StopControl // stop the node at given block height - executionDataDatastore *badger.Datastore + executionDataDatastore *badgerds.Datastore executionDataPruner *pruner.Pruner executionDataBlobstore blobs.Blobstore executionDataTracker tracker.Storage @@ -670,8 +670,8 @@ func (exeNode *ExecutionNode) LoadExecutionDataDatastore( if err != nil { return err } - dsOpts := &badger.DefaultOptions - ds, err := badger.NewDatastore(datastoreDir, dsOpts) + dsOpts := &badgerds.DefaultOptions + ds, err := badgerds.NewDatastore(datastoreDir, dsOpts) if err != nil { return err } @@ -692,10 +692,10 @@ func (exeNode *ExecutionNode) LoadExecutionDataGetter(node *NodeConfig) error { return nil } -func OpenChunkDataPackDB(dbPath string, logger zerolog.Logger) (*badgerDB.DB, error) { +func OpenChunkDataPackDB(dbPath string, logger zerolog.Logger) (*badger.DB, error) { log := sutil.NewLogger(logger) - opts := badgerDB. + opts := badger. DefaultOptions(dbPath). WithKeepL0InMemory(true). WithLogger(log). @@ -709,7 +709,7 @@ func OpenChunkDataPackDB(dbPath string, logger zerolog.Logger) (*badgerDB.DB, er WithValueLogFileSize(256 << 23). WithValueLogMaxEntries(100000) // Default is 1000000 - db, err := badgerDB.Open(opts) + db, err := badger.Open(opts) if err != nil { return nil, fmt.Errorf("could not open chunk data pack badger db at path %v: %w", dbPath, err) } @@ -948,8 +948,8 @@ func (exeNode *ExecutionNode) LoadExecutionDataPruner( trackerDir := filepath.Join(exeNode.exeConf.executionDataDir, "tracker") - options := badger.DefaultOptions - options.Options = badgerDB.LSMOnlyOptions(trackerDir) + options := badgerds.DefaultOptions + options.Options = badger.LSMOnlyOptions(trackerDir) badgerDBWrapper, err := storagedb.NewBadgerDBWrapper(trackerDir, &options) if err != nil { return nil, fmt.Errorf("could not create BadgerDBWrapper: %w", err) diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 7c14e2a6354..65fd211d744 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -13,11 +13,11 @@ import ( "strings" "time" - badgerDB "github.com/dgraph-io/badger/v2" + "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" - badger "github.com/ipfs/go-ds-badger2" + badgerds "github.com/ipfs/go-ds-badger2" dht "github.com/libp2p/go-libp2p-kad-dht" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" @@ -1120,7 +1120,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return err } } else { - builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badger.DefaultOptions) + builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return err } @@ -1216,8 +1216,8 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } } else { - options := badger.DefaultOptions - options.Options = badgerDB.LSMOnlyOptions(trackerDir) + options := badgerds.DefaultOptions + options.Options = badger.LSMOnlyOptions(trackerDir) storageDB, err = storagedb.NewBadgerDBWrapper(trackerDir, &options) if err != nil { return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) From 22fdd73715250e4ef39ca600736d27d3cb242242 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 9 Jul 2024 16:06:59 +0300 Subject: [PATCH 08/26] Updated go-ethereum version --- go.mod | 2 +- go.sum | 4 ++-- insecure/go.mod | 2 +- insecure/go.sum | 4 ++-- integration/go.mod | 2 +- integration/go.sum | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 8938aa6377d..305f865fe13 100644 --- a/go.mod +++ b/go.mod @@ -331,4 +331,4 @@ require ( replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 // TODO: remove after merged -replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de diff --git a/go.sum b/go.sum index ad8f581a35e..6c81797d7ca 100644 --- a/go.sum +++ b/go.sum @@ -988,8 +988,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de h1:k7+/nb7Y6LSepBHyttxyDtNlDXUln384u8q8TX0N5aE= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de/go.mod h1:3ThGal9rCAxtaE/b5ffv3969ccoBsYJ0L3pU2lNXoxg= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= diff --git a/insecure/go.mod b/insecure/go.mod index d8ae25a9e71..c39ecc005ac 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -308,4 +308,4 @@ require ( replace github.com/onflow/flow-go => ../ // TODO: remove after merged -replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de diff --git a/insecure/go.sum b/insecure/go.sum index d6d4a9ec311..4096d27fe8b 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -988,8 +988,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de h1:k7+/nb7Y6LSepBHyttxyDtNlDXUln384u8q8TX0N5aE= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de/go.mod h1:3ThGal9rCAxtaE/b5ffv3969ccoBsYJ0L3pU2lNXoxg= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= diff --git a/integration/go.mod b/integration/go.mod index ac92463ae3b..208c6f7ea72 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -358,4 +358,4 @@ replace github.com/onflow/flow-go => ../ replace github.com/onflow/flow-go/insecure => ../insecure // TODO: remove after merged -replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 +replace github.com/onflow/go-ethereum v1.13.4 => github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de diff --git a/integration/go.sum b/integration/go.sum index 96a06f2a40a..c3c11165cd4 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -998,8 +998,8 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17 h1:HMvIWOX0sDMN58tu7bUhknGPCLFz6Qqxi4ltQhf/aRY= -github.com/The-K-R-O-K/go-ethereum v0.0.0-20240708135526-51ceb66eba17/go.mod h1:8tQPAB1Z6XRuUzcwa15igFWqNTcQRDNDbIbToHKbh1M= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de h1:k7+/nb7Y6LSepBHyttxyDtNlDXUln384u8q8TX0N5aE= +github.com/The-K-R-O-K/go-ethereum v0.0.0-20240709125751-036ea21774de/go.mod h1:3ThGal9rCAxtaE/b5ffv3969ccoBsYJ0L3pU2lNXoxg= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= From 409687ea88800cc7aa351ae6f31ee9e05b15d517 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 17 Jul 2024 17:08:23 +0300 Subject: [PATCH 09/26] Added ExecutionDataDBMode --- .../execution_data/execution_data.go | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/module/executiondatasync/execution_data/execution_data.go b/module/executiondatasync/execution_data/execution_data.go index 5c4fdd4edbf..83239075857 100644 --- a/module/executiondatasync/execution_data/execution_data.go +++ b/module/executiondatasync/execution_data/execution_data.go @@ -1,10 +1,46 @@ package execution_data import ( + "errors" + "github.com/onflow/flow-go/ledger" "github.com/onflow/flow-go/model/flow" ) +// ExecutionDataDBMode controls which db type to use. +type ExecutionDataDBMode int + +const ( + // ExecutionDataDBModeBadger uses badger db + ExecutionDataDBModeBadger ExecutionDataDBMode = iota + 1 + + // ExecutionDataDBModePebble uses pebble db + // execution nodes + ExecutionDataDBModePebble +) + +func ParseExecutionDataDBMode(s string) (ExecutionDataDBMode, error) { + switch s { + case ExecutionDataDBModeBadger.String(): + return ExecutionDataDBModeBadger, nil + case ExecutionDataDBModePebble.String(): + return ExecutionDataDBModePebble, nil + default: + return 0, errors.New("invalid execution data DB mode") + } +} + +func (m ExecutionDataDBMode) String() string { + switch m { + case ExecutionDataDBModeBadger: + return "badger" + case ExecutionDataDBModePebble: + return "pebble" + default: + return "" + } +} + // DefaultMaxBlobSize is the default maximum size of a blob. // This is calibrated to fit within a libp2p message and not exceed the max size recommended by bitswap. const DefaultMaxBlobSize = 1 << 20 // 1MiB From 6594f6c6db9707267ecf5a28b0952d409cf871cb Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 17 Jul 2024 17:09:44 +0300 Subject: [PATCH 10/26] Added consumer progress impl for pebble storage --- storage/pebble/consumer_progress.go | 50 ++++++++++++++++++++++++ storage/pebble/operation/codes.go | 5 --- storage/pebble/operation/jobs.go | 19 +++++++++ storage/pebble/operation/prefix.go | 51 +++++++++++++++++++++++++ storage/pebble/operation/prefix_test.go | 37 ++++++++++++++++++ 5 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 storage/pebble/consumer_progress.go delete mode 100644 storage/pebble/operation/codes.go create mode 100644 storage/pebble/operation/jobs.go create mode 100644 storage/pebble/operation/prefix.go create mode 100644 storage/pebble/operation/prefix_test.go diff --git a/storage/pebble/consumer_progress.go b/storage/pebble/consumer_progress.go new file mode 100644 index 00000000000..37448bb4b5f --- /dev/null +++ b/storage/pebble/consumer_progress.go @@ -0,0 +1,50 @@ +package pebble + +import ( + "fmt" + + "github.com/cockroachdb/pebble" + + "github.com/onflow/flow-go/storage/pebble/operation" +) + +type ConsumerProgress struct { + db *pebble.DB + consumer string // to distinguish the consume progress between different consumers +} + +func NewConsumerProgress(db *pebble.DB, consumer string) *ConsumerProgress { + return &ConsumerProgress{ + db: db, + consumer: consumer, + } +} + +func (cp *ConsumerProgress) ProcessedIndex() (uint64, error) { + var processed uint64 + err := operation.RetrieveProcessedIndex(cp.consumer, &processed)(cp.db) + if err != nil { + return 0, fmt.Errorf("failed to retrieve processed index: %w", err) + } + return processed, nil +} + +// InitProcessedIndex insert the default processed index to the storage layer, can only be done once. +// initialize for the second time will return storage.ErrAlreadyExists +func (cp *ConsumerProgress) InitProcessedIndex(defaultIndex uint64) error { + err := operation.InsertProcessedIndex(cp.consumer, defaultIndex)(cp.db) + if err != nil { + return fmt.Errorf("could not update processed index: %w", err) + } + + return nil +} + +func (cp *ConsumerProgress) SetProcessedIndex(processed uint64) error { + err := operation.SetProcessedIndex(cp.consumer, processed)(cp.db) + if err != nil { + return fmt.Errorf("could not update processed index: %w", err) + } + + return nil +} diff --git a/storage/pebble/operation/codes.go b/storage/pebble/operation/codes.go deleted file mode 100644 index 1d9057646c3..00000000000 --- a/storage/pebble/operation/codes.go +++ /dev/null @@ -1,5 +0,0 @@ -package operation - -const ( - codeChunkDataPack = 100 -) diff --git a/storage/pebble/operation/jobs.go b/storage/pebble/operation/jobs.go new file mode 100644 index 00000000000..d18d3f39446 --- /dev/null +++ b/storage/pebble/operation/jobs.go @@ -0,0 +1,19 @@ +package operation + +import ( + "github.com/cockroachdb/pebble" +) + +// RetrieveProcessedIndex returns the processed index for a job consumer +func RetrieveProcessedIndex(jobName string, processed *uint64) func(pebble.Reader) error { + return retrieve(makePrefix(codeJobConsumerProcessed, jobName), processed) +} + +func InsertProcessedIndex(jobName string, processed uint64) func(pebble.Writer) error { + return insert(makePrefix(codeJobConsumerProcessed, jobName), processed) +} + +// SetProcessedIndex updates the processed index for a job consumer with given index +func SetProcessedIndex(jobName string, processed uint64) func(pebble.Writer) error { + return insert(makePrefix(codeJobConsumerProcessed, jobName), processed) +} diff --git a/storage/pebble/operation/prefix.go b/storage/pebble/operation/prefix.go new file mode 100644 index 00000000000..ef7cdf3c08d --- /dev/null +++ b/storage/pebble/operation/prefix.go @@ -0,0 +1,51 @@ +package operation + +import ( + "encoding/binary" + "fmt" + + "github.com/onflow/flow-go/model/flow" +) + +const ( + //lint:ignore U1000 Ignore unused variable warning + // job queue consumers and producers + codeJobConsumerProcessed = 70 + + // legacy codes (should be cleaned up) + codeChunkDataPack = 100 +) + +func makePrefix(code byte, keys ...interface{}) []byte { + prefix := make([]byte, 1) + prefix[0] = code + for _, key := range keys { + prefix = append(prefix, b(key)...) + } + return prefix +} + +func b(v interface{}) []byte { + switch i := v.(type) { + case uint8: + return []byte{i} + case uint32: + b := make([]byte, 4) + binary.BigEndian.PutUint32(b, i) + return b + case uint64: + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, i) + return b + case string: + return []byte(i) + case flow.Role: + return []byte{byte(i)} + case flow.Identifier: + return i[:] + case flow.ChainID: + return []byte(i) + default: + panic(fmt.Sprintf("unsupported type to convert (%T)", v)) + } +} diff --git a/storage/pebble/operation/prefix_test.go b/storage/pebble/operation/prefix_test.go new file mode 100644 index 00000000000..444311ece22 --- /dev/null +++ b/storage/pebble/operation/prefix_test.go @@ -0,0 +1,37 @@ +package operation + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/onflow/flow-go/model/flow" +) + +func TestMakePrefix(t *testing.T) { + + code := byte(0x01) + + u := uint64(1337) + expected := []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x39} + actual := makePrefix(code, u) + + assert.Equal(t, expected, actual) + + r := flow.Role(2) + expected = []byte{0x01, 0x02} + actual = makePrefix(code, r) + + assert.Equal(t, expected, actual) + + id := flow.Identifier{0x05, 0x06, 0x07} + expected = []byte{0x01, + 0x05, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + actual = makePrefix(code, id) + + assert.Equal(t, expected, actual) +} From 47eec47ce3a6f4f2c131b91ee96fae7804168869 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 17 Jul 2024 17:11:26 +0300 Subject: [PATCH 11/26] Updated imports name, updated AN, ON builders according to execution data DB mode --- .../node_builder/access_node_builder.go | 77 ++++++++++-------- cmd/execution_builder.go | 4 +- cmd/observer/node_builder/observer_builder.go | 79 ++++++++++--------- .../storage/badger_storage_db.go | 4 + .../storage/pebble_storage_db.go | 19 ++++- .../executiondatasync/storage/storage_db.go | 1 + module/executiondatasync/tracker/storage.go | 10 +-- .../executiondatasync/tracker/storage_test.go | 8 +- 8 files changed, 118 insertions(+), 84 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 570851bcc31..376295e804e 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/cockroachdb/pebble" "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" @@ -69,7 +70,7 @@ import ( "github.com/onflow/flow-go/module/executiondatasync/execution_data" execdatacache "github.com/onflow/flow-go/module/executiondatasync/execution_data/cache" "github.com/onflow/flow-go/module/executiondatasync/pruner" - storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" + edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow-go/module/executiondatasync/tracker" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" "github.com/onflow/flow-go/module/grpcserver" @@ -107,7 +108,7 @@ import ( "github.com/onflow/flow-go/state/protocol/blocktimer" "github.com/onflow/flow-go/storage" bstorage "github.com/onflow/flow-go/storage/badger" - pStorage "github.com/onflow/flow-go/storage/pebble" + pstorage "github.com/onflow/flow-go/storage/pebble" "github.com/onflow/flow-go/utils/grpcutils" ) @@ -149,7 +150,7 @@ type AccessNodeConfig struct { rpcMetricsEnabled bool executionDataSyncEnabled bool publicNetworkExecutionDataEnabled bool - pebbleDBExecutionDataEnabled bool + executionDataDBMode string executionDataPrunerHeightRangeTarget uint64 executionDataPrunerThreshold uint64 executionDataDir string @@ -256,7 +257,7 @@ func DefaultAccessNodeConfig() *AccessNodeConfig { MaxRetryDelay: edrequester.DefaultMaxRetryDelay, }, executionDataIndexingEnabled: false, - pebbleDBExecutionDataEnabled: false, + executionDataDBMode: execution_data.ExecutionDataDBModeBadger.String(), executionDataPrunerHeightRangeTarget: 0, executionDataPrunerThreshold: 100_000, registersDBPath: filepath.Join(homedir, ".flow", "execution_state"), @@ -264,7 +265,7 @@ func DefaultAccessNodeConfig() *AccessNodeConfig { scriptExecutorConfig: query.NewDefaultConfig(), scriptExecMinBlock: 0, scriptExecMaxBlock: math.MaxUint64, - registerCacheType: pStorage.CacheTypeTwoQueue.String(), + registerCacheType: pstorage.CacheTypeTwoQueue.String(), registerCacheSize: 0, programCacheSize: 0, } @@ -312,7 +313,7 @@ type FlowAccessNodeBuilder struct { IndexerDependencies *cmd.DependencyList collectionExecutedMetric module.CollectionExecutedMetric ExecutionDataPruner *pruner.Pruner - ExecutionDataDatastore storagedb.StorageDB + ExecutionDataDatastore edstorage.StorageDB ExecutionDataTracker tracker.Storage // The sync engine participants provider is the libp2p peer store for the access node @@ -526,6 +527,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess var execDataDistributor *edrequester.ExecutionDataDistributor var execDataCacheBackend *herocache.BlockExecutionData var executionDataStoreCache *execdatacache.ExecutionDataCache + var executionDataDBMode execution_data.ExecutionDataDBMode // setup dependency chain to ensure indexer starts after the requester requesterDependable := module.NewProxiedReadyDoneAware() @@ -541,13 +543,19 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess if err != nil { return err } - if builder.pebbleDBExecutionDataEnabled { - builder.ExecutionDataDatastore, err = storagedb.NewPebbleDBWrapper(datastoreDir, nil) + + executionDataDBMode, err = execution_data.ParseExecutionDataDBMode(builder.executionDataDBMode) + if err != nil { + return fmt.Errorf("could not parse execution data DB mode: %w", err) + } + + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return err } } else { - builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return err } @@ -566,13 +574,21 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } else { + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } else { + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { @@ -643,20 +659,13 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } trackerDir := filepath.Join(builder.executionDataDir, "tracker") - var storageDB storagedb.StorageDB - if builder.pebbleDBExecutionDataEnabled { - storageDB, err = storagedb.NewPebbleDBWrapper(trackerDir, nil) - if err != nil { - return nil, fmt.Errorf("could not create tracker NewPebbleDBWrapper: %w", err) - } - } else { - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(trackerDir) - storageDB, err = storagedb.NewBadgerDBWrapper(trackerDir, &options) - if err != nil { - return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) - } + // only badger db for tracker now, will change in new PRs + options := badgerds.DefaultOptions + options.Options = badger.LSMOnlyOptions(trackerDir) + storageDB, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) + if err != nil { + return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) } builder.ExecutionDataTracker, err = tracker.OpenStorage( @@ -849,7 +858,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess // other components from starting while bootstrapping the register db since it may // take hours to complete. - pdb, err := pStorage.OpenRegisterPebbleDB(builder.registersDBPath) + pdb, err := pstorage.OpenRegisterPebbleDB(builder.registersDBPath) if err != nil { return nil, fmt.Errorf("could not open registers db: %w", err) } @@ -857,7 +866,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess return pdb.Close() }) - bootstrapped, err := pStorage.IsBootstrapped(pdb) + bootstrapped, err := pstorage.IsBootstrapped(pdb) if err != nil { return nil, fmt.Errorf("could not check if registers db is bootstrapped: %w", err) } @@ -889,7 +898,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } rootHash := ledger.RootHash(builder.RootSeal.FinalState) - bootstrap, err := pStorage.NewRegisterBootstrap(pdb, checkpointFile, checkpointHeight, rootHash, builder.Logger) + bootstrap, err := pstorage.NewRegisterBootstrap(pdb, checkpointFile, checkpointHeight, rootHash, builder.Logger) if err != nil { return nil, fmt.Errorf("could not create registers bootstrap: %w", err) } @@ -902,18 +911,18 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } } - registers, err := pStorage.NewRegisters(pdb) + registers, err := pstorage.NewRegisters(pdb) if err != nil { return nil, fmt.Errorf("could not create registers storage: %w", err) } if builder.registerCacheSize > 0 { - cacheType, err := pStorage.ParseCacheType(builder.registerCacheType) + cacheType, err := pstorage.ParseCacheType(builder.registerCacheType) if err != nil { return nil, fmt.Errorf("could not parse register cache type: %w", err) } cacheMetrics := metrics.NewCacheCollector(builder.RootChainID) - registersCache, err := pStorage.NewRegistersCache(registers, cacheType, builder.registerCacheSize, cacheMetrics) + registersCache, err := pstorage.NewRegistersCache(registers, cacheType, builder.registerCacheSize, cacheMetrics) if err != nil { return nil, fmt.Errorf("could not create registers cache: %w", err) } @@ -1288,10 +1297,10 @@ func (builder *FlowAccessNodeBuilder) extraFlags() { "execution-data-max-retry-delay", defaultConfig.executionDataConfig.MaxRetryDelay, "maximum delay for exponential backoff when fetching execution data fails e.g. 5m") - flags.BoolVar(&builder.pebbleDBExecutionDataEnabled, - "pebble-execution-data-db-enabled", - defaultConfig.pebbleDBExecutionDataEnabled, - "[experimental] whether to enable the pebble as the DB for execution data") + flags.StringVar(&builder.executionDataDBMode, + "execution-data-db", + defaultConfig.executionDataDBMode, + "[experimental] the DB name for execution data name. One of [badger, pebble]") flags.Uint64Var(&builder.executionDataPrunerHeightRangeTarget, "execution-data-height-range-target", defaultConfig.executionDataPrunerHeightRangeTarget, diff --git a/cmd/execution_builder.go b/cmd/execution_builder.go index b61dece7dac..ad245fc8f34 100644 --- a/cmd/execution_builder.go +++ b/cmd/execution_builder.go @@ -78,7 +78,7 @@ import ( "github.com/onflow/flow-go/module/executiondatasync/execution_data" exedataprovider "github.com/onflow/flow-go/module/executiondatasync/provider" "github.com/onflow/flow-go/module/executiondatasync/pruner" - storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" + edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow-go/module/executiondatasync/tracker" "github.com/onflow/flow-go/module/finalizedreader" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" @@ -950,7 +950,7 @@ func (exeNode *ExecutionNode) LoadExecutionDataPruner( options := badgerds.DefaultOptions options.Options = badger.LSMOnlyOptions(trackerDir) - badgerDBWrapper, err := storagedb.NewBadgerDBWrapper(trackerDir, &options) + badgerDBWrapper, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) if err != nil { return nil, fmt.Errorf("could not create BadgerDBWrapper: %w", err) } diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 65fd211d744..c7ff020abf6 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -13,6 +13,7 @@ import ( "strings" "time" + "github.com/cockroachdb/pebble" "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" @@ -68,7 +69,7 @@ import ( "github.com/onflow/flow-go/module/executiondatasync/execution_data" execdatacache "github.com/onflow/flow-go/module/executiondatasync/execution_data/cache" "github.com/onflow/flow-go/module/executiondatasync/pruner" - storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" + edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow-go/module/executiondatasync/tracker" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" "github.com/onflow/flow-go/module/grpcserver" @@ -108,7 +109,7 @@ import ( "github.com/onflow/flow-go/state/protocol/events/gadgets" "github.com/onflow/flow-go/storage" bstorage "github.com/onflow/flow-go/storage/badger" - pStorage "github.com/onflow/flow-go/storage/pebble" + pstorage "github.com/onflow/flow-go/storage/pebble" "github.com/onflow/flow-go/utils/grpcutils" "github.com/onflow/flow-go/utils/io" ) @@ -155,7 +156,7 @@ type ObserverServiceConfig struct { logTxTimeToFinalizedExecuted bool executionDataSyncEnabled bool executionDataIndexingEnabled bool - pebbleDBExecutionDataEnabled bool + executionDataDBMode string executionDataPrunerHeightRangeTarget uint64 executionDataPrunerThreshold uint64 localServiceAPIEnabled bool @@ -228,7 +229,7 @@ func DefaultObserverServiceConfig() *ObserverServiceConfig { logTxTimeToFinalizedExecuted: false, executionDataSyncEnabled: false, executionDataIndexingEnabled: false, - pebbleDBExecutionDataEnabled: false, + executionDataDBMode: execution_data.ExecutionDataDBModeBadger.String(), executionDataPrunerHeightRangeTarget: 0, executionDataPrunerThreshold: 100_000, localServiceAPIEnabled: false, @@ -244,7 +245,7 @@ func DefaultObserverServiceConfig() *ObserverServiceConfig { }, scriptExecMinBlock: 0, scriptExecMaxBlock: math.MaxUint64, - registerCacheType: pStorage.CacheTypeTwoQueue.String(), + registerCacheType: pstorage.CacheTypeTwoQueue.String(), registerCacheSize: 0, programCacheSize: 0, } @@ -278,7 +279,7 @@ type ObserverServiceBuilder struct { ExecutionDataStore execution_data.ExecutionDataStore ExecutionDataBlobstore blobs.Blobstore ExecutionDataPruner *pruner.Pruner - ExecutionDataDatastore storagedb.StorageDB + ExecutionDataDatastore edstorage.StorageDB ExecutionDataTracker tracker.Storage RegistersAsyncStore *execution.RegistersAsyncStore @@ -672,10 +673,10 @@ func (builder *ObserverServiceBuilder) extraFlags() { flags.BoolVar(&builder.localServiceAPIEnabled, "local-service-api-enabled", defaultConfig.localServiceAPIEnabled, "whether to use local indexed data for api queries") flags.StringVar(&builder.registersDBPath, "execution-state-dir", defaultConfig.registersDBPath, "directory to use for execution-state database") flags.StringVar(&builder.checkpointFile, "execution-state-checkpoint", defaultConfig.checkpointFile, "execution-state checkpoint file") - flags.BoolVar(&builder.pebbleDBExecutionDataEnabled, - "pebble-execution-data-db-enabled", - defaultConfig.pebbleDBExecutionDataEnabled, - "[experimental] whether to enable the pebble as the DB for execution data") + flags.StringVar(&builder.executionDataDBMode, + "execution-data-db", + defaultConfig.executionDataDBMode, + "[experimental] the DB name for execution data name. One of [badger, pebble]") // Execution data pruner flags.Uint64Var(&builder.executionDataPrunerHeightRangeTarget, @@ -1090,7 +1091,7 @@ func (builder *ObserverServiceBuilder) Build() (cmd.Node, error) { func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverServiceBuilder { var ds datastore.Batching - var storageDB storagedb.StorageDB + var storageDB edstorage.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -1098,6 +1099,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS var execDataDistributor *edrequester.ExecutionDataDistributor var execDataCacheBackend *herocache.BlockExecutionData var executionDataStoreCache *execdatacache.ExecutionDataCache + var executionDataDBMode execution_data.ExecutionDataDBMode // setup dependency chain to ensure indexer starts after the requester requesterDependable := module.NewProxiedReadyDoneAware() @@ -1114,13 +1116,18 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return err } - if builder.pebbleDBExecutionDataEnabled { - builder.ExecutionDataDatastore, err = storagedb.NewPebbleDBWrapper(datastoreDir, nil) + executionDataDBMode, err = execution_data.ParseExecutionDataDBMode(builder.executionDataDBMode) + if err != nil { + return fmt.Errorf("could not parse execution data DB mode: %w", err) + } + + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return err } } else { - builder.ExecutionDataDatastore, err = storagedb.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return err } @@ -1139,13 +1146,21 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } else { + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) + if executionDataDBMode == execution_data.ExecutionDataDBModePebble { + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } else { + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { @@ -1208,20 +1223,12 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } trackerDir := filepath.Join(builder.executionDataDir, "tracker") - var storageDB storagedb.StorageDB - if builder.pebbleDBExecutionDataEnabled { - storageDB, err = storagedb.NewPebbleDBWrapper(trackerDir, nil) - if err != nil { - return nil, fmt.Errorf("could not create tracker NewPebbleDBWrapper: %w", err) - } - - } else { - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(trackerDir) - storageDB, err = storagedb.NewBadgerDBWrapper(trackerDir, &options) - if err != nil { - return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) - } + // only badger db for tracker now, will change in new PRs + options := badgerds.DefaultOptions + options.Options = badger.LSMOnlyOptions(trackerDir) + storageDB, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) + if err != nil { + return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) } builder.ExecutionDataTracker, err = tracker.OpenStorage( @@ -1373,7 +1380,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS // other components from starting while bootstrapping the register db since it may // take hours to complete. - pdb, err := pStorage.OpenRegisterPebbleDB(builder.registersDBPath) + pdb, err := pstorage.OpenRegisterPebbleDB(builder.registersDBPath) if err != nil { return nil, fmt.Errorf("could not open registers db: %w", err) } @@ -1381,7 +1388,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return pdb.Close() }) - bootstrapped, err := pStorage.IsBootstrapped(pdb) + bootstrapped, err := pstorage.IsBootstrapped(pdb) if err != nil { return nil, fmt.Errorf("could not check if registers db is bootstrapped: %w", err) } @@ -1413,7 +1420,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } rootHash := ledger.RootHash(builder.RootSeal.FinalState) - bootstrap, err := pStorage.NewRegisterBootstrap(pdb, checkpointFile, checkpointHeight, rootHash, builder.Logger) + bootstrap, err := pstorage.NewRegisterBootstrap(pdb, checkpointFile, checkpointHeight, rootHash, builder.Logger) if err != nil { return nil, fmt.Errorf("could not create registers bootstrap: %w", err) } @@ -1426,18 +1433,18 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } } - registers, err := pStorage.NewRegisters(pdb) + registers, err := pstorage.NewRegisters(pdb) if err != nil { return nil, fmt.Errorf("could not create registers storage: %w", err) } if builder.registerCacheSize > 0 { - cacheType, err := pStorage.ParseCacheType(builder.registerCacheType) + cacheType, err := pstorage.ParseCacheType(builder.registerCacheType) if err != nil { return nil, fmt.Errorf("could not parse register cache type: %w", err) } cacheMetrics := metrics.NewCacheCollector(builder.RootChainID) - registersCache, err := pStorage.NewRegistersCache(registers, cacheType, builder.registerCacheSize, cacheMetrics) + registersCache, err := pstorage.NewRegistersCache(registers, cacheType, builder.registerCacheSize, cacheMetrics) if err != nil { return nil, fmt.Errorf("could not create registers cache: %w", err) } diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 7764bfc26c0..25437f10665 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -29,6 +29,10 @@ func (b *BadgerDBWrapper) Datastore() ds.Batching { return b.ds } +func (b *BadgerDBWrapper) DB() interface{} { + return b.ds.DB +} + func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { var keys [][]byte diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index 2169f968248..75ad33f7de3 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -15,21 +15,34 @@ var _ StorageDB = (*PebbleDBWrapper)(nil) // PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. type PebbleDBWrapper struct { ds *pebbleds.Datastore + db *pebble.DB } -func NewPebbleDBWrapper(datastorePath string, options *pebble.Options) (*PebbleDBWrapper, error) { - db, err := pebbleds.NewDatastore(datastorePath, options) +func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrapper, error) { + db, err := pebble.Open(dbPath, options) + if err != nil { + return nil, fmt.Errorf("failed to open pebble database: %w", err) + } + + ds, err := pebbleds.NewDatastore(dbPath, options) if err != nil { return nil, fmt.Errorf("could not open tracker ds: %w", err) } - return &PebbleDBWrapper{db}, nil + return &PebbleDBWrapper{ + ds: ds, + db: db, + }, nil } func (p *PebbleDBWrapper) Datastore() ds.Batching { return p.ds } +func (p *PebbleDBWrapper) DB() interface{} { + return p.db +} + func (p *PebbleDBWrapper) Keys(prefix []byte) ([][]byte, error) { var keys [][]byte var q query.Query diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go index edd87331963..98a2ab39381 100644 --- a/module/executiondatasync/storage/storage_db.go +++ b/module/executiondatasync/storage/storage_db.go @@ -10,6 +10,7 @@ import ( // StorageDB defines the interface for key-value store operations. type StorageDB interface { Datastore() datastore.Batching + DB() interface{} Get(key []byte) (StorageItem, error) Set(key, val []byte) error diff --git a/module/executiondatasync/tracker/storage.go b/module/executiondatasync/tracker/storage.go index 48f339ffe52..2f6e42db54c 100644 --- a/module/executiondatasync/tracker/storage.go +++ b/module/executiondatasync/tracker/storage.go @@ -12,7 +12,7 @@ import ( "github.com/rs/zerolog" "github.com/onflow/flow-go/module/blobs" - storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" + edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" ) // badger key prefixes @@ -69,7 +69,7 @@ func makeUint64Value(v uint64) []byte { return value } -func getUint64Value(item storagedb.StorageItem) (uint64, error) { +func getUint64Value(item edstorage.StorageItem) (uint64, error) { value, err := item.ValueCopy(nil) if err != nil { return 0, err @@ -80,7 +80,7 @@ func getUint64Value(item storagedb.StorageItem) (uint64, error) { // getBatchItemCountLimit returns the maximum number of items that can be included in a single batch // transaction based on the number / total size of updates per item. -func getBatchItemCountLimit(db storagedb.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { +func getBatchItemCountLimit(db edstorage.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { totalSizePerItem := 2*writeCountPerItem + writeSizePerItem // 2 bytes per entry for user and internal meta maxItemCountByWriteCount := db.MaxBatchCount() / writeCountPerItem maxItemCountByWriteSize := db.MaxBatchSize() / totalSizePerItem @@ -166,7 +166,7 @@ type storage struct { // we acquire the write lock when we want to perform a prune WRITE mu sync.RWMutex - db storagedb.StorageDB + db edstorage.StorageDB pruneCallback PruneCallback logger zerolog.Logger } @@ -179,7 +179,7 @@ func WithPruneCallback(callback PruneCallback) StorageOption { } } -func OpenStorage(db storagedb.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { +func OpenStorage(db edstorage.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { lg := logger.With().Str("module", "tracker_storage").Logger() storage := &storage{ diff --git a/module/executiondatasync/tracker/storage_test.go b/module/executiondatasync/tracker/storage_test.go index 1c7e8595b56..e18c53e2e0e 100644 --- a/module/executiondatasync/tracker/storage_test.go +++ b/module/executiondatasync/tracker/storage_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/onflow/flow-go/module/blobs" - storagedb "github.com/onflow/flow-go/module/executiondatasync/storage" + edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" ) func randomCid() cid.Cid { @@ -28,7 +28,7 @@ func TestPrune(t *testing.T) { storageDir := t.TempDir() options := badgerds.DefaultOptions options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := storagedb.NewBadgerDBWrapper(storageDir, &options) + storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) require.NoError(t, err) storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { _, ok := expectedPrunedCIDs[c] @@ -86,7 +86,7 @@ func TestPruneNonLatestHeight(t *testing.T) { storageDir := t.TempDir() options := badgerds.DefaultOptions options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := storagedb.NewBadgerDBWrapper(storageDir, &options) + storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) require.NoError(t, err) storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { assert.Fail(t, "unexpected CID pruned: %s", c.String()) @@ -129,7 +129,7 @@ func TestAscendingOrderOfRecords(t *testing.T) { options := badgerds.DefaultOptions options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := storagedb.NewBadgerDBWrapper(storageDir, &options) + storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) require.NoError(t, err) storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { _, ok := expectedPrunedCIDs[c] From 81442ee8f259668b4e54d9bd382e4335a8b729fb Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 18 Jul 2024 11:56:22 +0300 Subject: [PATCH 12/26] Reverted back tracker changes --- .../node_builder/access_node_builder.go | 11 +- cmd/execution_builder.go | 11 +- cmd/observer/node_builder/observer_builder.go | 10 +- integration/go.mod | 1 - integration/go.sum | 2 - module/executiondatasync/tracker/storage.go | 251 ++++++++++-------- .../executiondatasync/tracker/storage_test.go | 120 ++++----- 7 files changed, 209 insertions(+), 197 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 376295e804e..af3191a9376 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -659,17 +659,8 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } trackerDir := filepath.Join(builder.executionDataDir, "tracker") - - // only badger db for tracker now, will change in new PRs - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(trackerDir) - storageDB, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) - if err != nil { - return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) - } - builder.ExecutionDataTracker, err = tracker.OpenStorage( - storageDB, + trackerDir, sealed.Height, node.Logger, tracker.WithPruneCallback(func(c cid.Cid) error { diff --git a/cmd/execution_builder.go b/cmd/execution_builder.go index ad245fc8f34..7617f44b1af 100644 --- a/cmd/execution_builder.go +++ b/cmd/execution_builder.go @@ -78,7 +78,6 @@ import ( "github.com/onflow/flow-go/module/executiondatasync/execution_data" exedataprovider "github.com/onflow/flow-go/module/executiondatasync/provider" "github.com/onflow/flow-go/module/executiondatasync/pruner" - edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" "github.com/onflow/flow-go/module/executiondatasync/tracker" "github.com/onflow/flow-go/module/finalizedreader" finalizer "github.com/onflow/flow-go/module/finalizer/consensus" @@ -947,16 +946,8 @@ func (exeNode *ExecutionNode) LoadExecutionDataPruner( } trackerDir := filepath.Join(exeNode.exeConf.executionDataDir, "tracker") - - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(trackerDir) - badgerDBWrapper, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) - if err != nil { - return nil, fmt.Errorf("could not create BadgerDBWrapper: %w", err) - } - exeNode.executionDataTracker, err = tracker.OpenStorage( - badgerDBWrapper, + trackerDir, sealed.Height, node.Logger, tracker.WithPruneCallback(func(c cid.Cid) error { diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index c7ff020abf6..10cf0b87aac 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -1223,16 +1223,8 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } trackerDir := filepath.Join(builder.executionDataDir, "tracker") - // only badger db for tracker now, will change in new PRs - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(trackerDir) - storageDB, err := edstorage.NewBadgerDBWrapper(trackerDir, &options) - if err != nil { - return nil, fmt.Errorf("could not create tracker BadgerDBWrapper: %w", err) - } - builder.ExecutionDataTracker, err = tracker.OpenStorage( - storageDB, + trackerDir, sealed.Height, node.Logger, tracker.WithPruneCallback(func(c cid.Cid) error { diff --git a/integration/go.mod b/integration/go.mod index 1bc9b516054..4481d89ec90 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -176,7 +176,6 @@ require ( github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect - github.com/ipfs/go-ds-pebble v0.3.1 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect diff --git a/integration/go.sum b/integration/go.sum index 4025803ede8..6e971b529fb 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -1794,8 +1794,6 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= -github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= -github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= diff --git a/module/executiondatasync/tracker/storage.go b/module/executiondatasync/tracker/storage.go index 2f6e42db54c..c7677f79ca7 100644 --- a/module/executiondatasync/tracker/storage.go +++ b/module/executiondatasync/tracker/storage.go @@ -12,7 +12,6 @@ import ( "github.com/rs/zerolog" "github.com/onflow/flow-go/module/blobs" - edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" ) // badger key prefixes @@ -29,6 +28,16 @@ const ( const cidsPerBatch = 16 // number of cids to track per batch +func retryOnConflict(db *badger.DB, fn func(txn *badger.Txn) error) error { + for { + err := db.Update(fn) + if errors.Is(err, badger.ErrConflict) { + continue + } + return err + } +} + const globalStateKeyLength = 2 func makeGlobalStateKey(state byte) []byte { @@ -69,7 +78,7 @@ func makeUint64Value(v uint64) []byte { return value } -func getUint64Value(item edstorage.StorageItem) (uint64, error) { +func getUint64Value(item *badger.Item) (uint64, error) { value, err := item.ValueCopy(nil) if err != nil { return 0, err @@ -80,7 +89,7 @@ func getUint64Value(item edstorage.StorageItem) (uint64, error) { // getBatchItemCountLimit returns the maximum number of items that can be included in a single batch // transaction based on the number / total size of updates per item. -func getBatchItemCountLimit(db edstorage.StorageDB, writeCountPerItem int64, writeSizePerItem int64) int { +func getBatchItemCountLimit(db *badger.DB, writeCountPerItem int64, writeSizePerItem int64) int { totalSizePerItem := 2*writeCountPerItem + writeSizePerItem // 2 bytes per entry for user and internal meta maxItemCountByWriteCount := db.MaxBatchCount() / writeCountPerItem maxItemCountByWriteSize := db.MaxBatchSize() / totalSizePerItem @@ -166,7 +175,7 @@ type storage struct { // we acquire the write lock when we want to perform a prune WRITE mu sync.RWMutex - db edstorage.StorageDB + db *badger.DB pruneCallback PruneCallback logger zerolog.Logger } @@ -179,8 +188,12 @@ func WithPruneCallback(callback PruneCallback) StorageOption { } } -func OpenStorage(db edstorage.StorageDB, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { +func OpenStorage(dbPath string, startHeight uint64, logger zerolog.Logger, opts ...StorageOption) (*storage, error) { lg := logger.With().Str("module", "tracker_storage").Logger() + db, err := badger.Open(badger.LSMOnlyOptions(dbPath)) + if err != nil { + return nil, fmt.Errorf("could not open tracker db: %w", err) + } storage := &storage{ db: db, @@ -223,7 +236,7 @@ func (s *storage) init(startHeight uint64) error { } s.logger.Info().Msgf("finished pruning") } else if errors.Is(fulfilledHeightErr, badger.ErrKeyNotFound) && errors.Is(prunedHeightErr, badger.ErrKeyNotFound) { - // ds is empty, we need to bootstrap it + // db is empty, we need to bootstrap it if err := s.bootstrap(startHeight); err != nil { return fmt.Errorf("failed to bootstrap storage: %w", err) } @@ -241,15 +254,17 @@ func (s *storage) bootstrap(startHeight uint64) error { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) prunedHeightValue := makeUint64Value(startHeight) - if err := s.db.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { - return fmt.Errorf("failed to set fulfilled height value: %w", err) - } + return s.db.Update(func(txn *badger.Txn) error { + if err := txn.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { + return fmt.Errorf("failed to set fulfilled height value: %w", err) + } - if err := s.db.Set(prunedHeightKey, prunedHeightValue); err != nil { - return fmt.Errorf("failed to set pruned height value: %w", err) - } + if err := txn.Set(prunedHeightKey, prunedHeightValue); err != nil { + return fmt.Errorf("failed to set pruned height value: %w", err) + } - return nil + return nil + }) } func (s *storage) Update(f UpdateFn) error { @@ -262,37 +277,45 @@ func (s *storage) SetFulfilledHeight(height uint64) error { fulfilledHeightKey := makeGlobalStateKey(globalStateFulfilledHeight) fulfilledHeightValue := makeUint64Value(height) - if err := s.db.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { - return fmt.Errorf("failed to set fulfilled height value: %w", err) - } + return s.db.Update(func(txn *badger.Txn) error { + if err := txn.Set(fulfilledHeightKey, fulfilledHeightValue); err != nil { + return fmt.Errorf("failed to set fulfilled height value: %w", err) + } - return nil + return nil + }) } func (s *storage) GetFulfilledHeight() (uint64, error) { fulfilledHeightKey := makeGlobalStateKey(globalStateFulfilledHeight) var fulfilledHeight uint64 - item, err := s.db.Get(fulfilledHeightKey) - if err != nil { - return 0, fmt.Errorf("failed to find fulfilled height entry: %w", err) - } + if err := s.db.View(func(txn *badger.Txn) error { + item, err := txn.Get(fulfilledHeightKey) + if err != nil { + return fmt.Errorf("failed to find fulfilled height entry: %w", err) + } - fulfilledHeight, err = getUint64Value(item) - if err != nil { - return 0, fmt.Errorf("failed to retrieve fulfilled height value: %w", err) + fulfilledHeight, err = getUint64Value(item) + if err != nil { + return fmt.Errorf("failed to retrieve fulfilled height value: %w", err) + } + + return nil + }); err != nil { + return 0, err } return fulfilledHeight, nil } -func (s *storage) trackBlob(blockHeight uint64, c cid.Cid) error { - if err := s.db.Set(makeBlobRecordKey(blockHeight, c), nil); err != nil { +func (s *storage) trackBlob(txn *badger.Txn, blockHeight uint64, c cid.Cid) error { + if err := txn.Set(makeBlobRecordKey(blockHeight, c), nil); err != nil { return fmt.Errorf("failed to add blob record: %w", err) } latestHeightKey := makeLatestHeightKey(c) - item, err := s.db.Get(latestHeightKey) + item, err := txn.Get(latestHeightKey) if err != nil { if !errors.Is(err, badger.ErrKeyNotFound) { return fmt.Errorf("failed to get latest height: %w", err) @@ -311,7 +334,7 @@ func (s *storage) trackBlob(blockHeight uint64, c cid.Cid) error { latestHeightValue := makeUint64Value(blockHeight) - if err := s.db.Set(latestHeightKey, latestHeightValue); err != nil { + if err := txn.Set(latestHeightKey, latestHeightValue); err != nil { return fmt.Errorf("failed to set latest height value: %w", err) } @@ -332,16 +355,15 @@ func (s *storage) trackBlobs(blockHeight uint64, cids ...cid.Cid) error { } batch := cids[:batchSize] - err := s.db.RetryOnConflict(func() error { + if err := retryOnConflict(s.db, func(txn *badger.Txn) error { for _, c := range batch { - err := s.trackBlob(blockHeight, c) - if err != nil { + if err := s.trackBlob(txn, blockHeight, c); err != nil { return fmt.Errorf("failed to track blob %s: %w", c.String(), err) } } + return nil - }) - if err != nil { + }); err != nil { return err } @@ -352,19 +374,21 @@ func (s *storage) trackBlobs(blockHeight uint64, cids ...cid.Cid) error { } func (s *storage) batchDelete(deleteInfos []*deleteInfo) error { - for _, dInfo := range deleteInfos { - if err := s.db.Delete(makeBlobRecordKey(dInfo.height, dInfo.cid)); err != nil { - return fmt.Errorf("failed to delete blob record for Cid %s: %w", dInfo.cid.String(), err) - } + return s.db.Update(func(txn *badger.Txn) error { + for _, dInfo := range deleteInfos { + if err := txn.Delete(makeBlobRecordKey(dInfo.height, dInfo.cid)); err != nil { + return fmt.Errorf("failed to delete blob record for Cid %s: %w", dInfo.cid.String(), err) + } - if dInfo.deleteLatestHeightRecord { - if err := s.db.Delete(makeLatestHeightKey(dInfo.cid)); err != nil { - return fmt.Errorf("failed to delete latest height record for Cid %s: %w", dInfo.cid.String(), err) + if dInfo.deleteLatestHeightRecord { + if err := txn.Delete(makeLatestHeightKey(dInfo.cid)); err != nil { + return fmt.Errorf("failed to delete latest height record for Cid %s: %w", dInfo.cid.String(), err) + } } } - } - return nil + return nil + }) } func (s *storage) batchDeleteItemLimit() int { @@ -388,72 +412,82 @@ func (s *storage) PruneUpToHeight(height uint64) error { return err } - keys, err := s.db.Keys(blobRecordPrefix) - if err != nil { - return err - } + if err := s.db.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.IteratorOptions{ + PrefetchValues: false, + Prefix: blobRecordPrefix, + }) + defer it.Close() - // iterate over blob records, calling pruneCallback for any CIDs that should be pruned - // and cleaning up the corresponding tracker records - for _, blobRecordKey := range keys { - blockHeight, blobCid, err := parseBlobRecordKey(blobRecordKey) - if err != nil { - return fmt.Errorf("malformed blob record key %v: %w", blobRecordKey, err) - } + // iterate over blob records, calling pruneCallback for any CIDs that should be pruned + // and cleaning up the corresponding tracker records + for it.Seek(blobRecordPrefix); it.ValidForPrefix(blobRecordPrefix); it.Next() { + blobRecordItem := it.Item() + blobRecordKey := blobRecordItem.Key() - // iteration occurs in key order, so block heights are guaranteed to be ascending - if blockHeight > height { - break - } + blockHeight, blobCid, err := parseBlobRecordKey(blobRecordKey) + if err != nil { + return fmt.Errorf("malformed blob record key %v: %w", blobRecordKey, err) + } - dInfo := &deleteInfo{ - cid: blobCid, - height: blockHeight, - } + // iteration occurs in key order, so block heights are guaranteed to be ascending + if blockHeight > height { + break + } - latestHeightKey := makeLatestHeightKey(blobCid) - latestHeightItem, err := s.db.Get(latestHeightKey) - if err != nil { - return fmt.Errorf("failed to get latest height entry for Cid %s: %w", blobCid.String(), err) - } + dInfo := &deleteInfo{ + cid: blobCid, + height: blockHeight, + } - latestHeight, err := getUint64Value(latestHeightItem) - if err != nil { - return fmt.Errorf("failed to retrieve latest height value for Cid %s: %w", blobCid.String(), err) - } + latestHeightKey := makeLatestHeightKey(blobCid) + latestHeightItem, err := txn.Get(latestHeightKey) + if err != nil { + return fmt.Errorf("failed to get latest height entry for Cid %s: %w", blobCid.String(), err) + } - // a blob is only removable if it is not referenced by any blob tree at a higher height - if latestHeight < blockHeight { - // this should never happen - return fmt.Errorf( - "inconsistency detected: latest height recorded for Cid %s is %d, but blob record exists at height %d", - blobCid.String(), latestHeight, blockHeight, - ) - } + latestHeight, err := getUint64Value(latestHeightItem) + if err != nil { + return fmt.Errorf("failed to retrieve latest height value for Cid %s: %w", blobCid.String(), err) + } - // the current block height is the last to reference this CID, prune the CID and remove - // all tracker records - if latestHeight == blockHeight { - if err := s.pruneCallback(blobCid); err != nil { - return err + // a blob is only removable if it is not referenced by any blob tree at a higher height + if latestHeight < blockHeight { + // this should never happen + return fmt.Errorf( + "inconsistency detected: latest height recorded for Cid %s is %d, but blob record exists at height %d", + blobCid.String(), latestHeight, blockHeight, + ) + } + + // the current block height is the last to reference this CID, prune the CID and remove + // all tracker records + if latestHeight == blockHeight { + if err := s.pruneCallback(blobCid); err != nil { + return err + } + dInfo.deleteLatestHeightRecord = true + } + + // remove tracker records for pruned heights + batch = append(batch, dInfo) + if len(batch) == itemsPerBatch { + if err := s.batchDelete(batch); err != nil { + return err + } + batch = nil } - dInfo.deleteLatestHeightRecord = true } - // remove tracker records for pruned heights - batch = append(batch, dInfo) - if len(batch) == itemsPerBatch { + if len(batch) > 0 { if err := s.batchDelete(batch); err != nil { return err } - batch = nil } - } - if len(batch) > 0 { - if err := s.batchDelete(batch); err != nil { - return err - } + return nil + }); err != nil { + return err } // this is a good time to do garbage collection @@ -468,26 +502,33 @@ func (s *storage) setPrunedHeight(height uint64) error { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) prunedHeightValue := makeUint64Value(height) - if err := s.db.Set(prunedHeightKey, prunedHeightValue); err != nil { - return fmt.Errorf("failed to set pruned height value: %w", err) - } - - return nil + return s.db.Update(func(txn *badger.Txn) error { + if err := txn.Set(prunedHeightKey, prunedHeightValue); err != nil { + return fmt.Errorf("failed to set pruned height value: %w", err) + } + return nil + }) } func (s *storage) GetPrunedHeight() (uint64, error) { prunedHeightKey := makeGlobalStateKey(globalStatePrunedHeight) var prunedHeight uint64 - item, err := s.db.Get(prunedHeightKey) - if err != nil { - return 0, fmt.Errorf("failed to find pruned height entry: %w", err) - } + if err := s.db.View(func(txn *badger.Txn) error { + item, err := txn.Get(prunedHeightKey) + if err != nil { + return fmt.Errorf("failed to find pruned height entry: %w", err) + } - prunedHeight, err = getUint64Value(item) - if err != nil { - return 0, fmt.Errorf("failed to retrieve pruned height value: %w", err) + prunedHeight, err = getUint64Value(item) + if err != nil { + return fmt.Errorf("failed to retrieve pruned height value: %w", err) + } + + return nil + }); err != nil { + return 0, err } return prunedHeight, nil diff --git a/module/executiondatasync/tracker/storage_test.go b/module/executiondatasync/tracker/storage_test.go index e18c53e2e0e..76c7b613ab6 100644 --- a/module/executiondatasync/tracker/storage_test.go +++ b/module/executiondatasync/tracker/storage_test.go @@ -6,13 +6,11 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/ipfs/go-cid" - badgerds "github.com/ipfs/go-ds-badger2" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/onflow/flow-go/module/blobs" - edstorage "github.com/onflow/flow-go/module/executiondatasync/storage" ) func randomCid() cid.Cid { @@ -26,11 +24,7 @@ func randomCid() cid.Cid { func TestPrune(t *testing.T) { expectedPrunedCIDs := make(map[cid.Cid]struct{}) storageDir := t.TempDir() - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) - require.NoError(t, err) - storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { + storage, err := OpenStorage(storageDir, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { _, ok := expectedPrunedCIDs[c] assert.True(t, ok, "unexpected CID pruned: %s", c.String()) delete(expectedPrunedCIDs, c) @@ -61,34 +55,35 @@ func TestPrune(t *testing.T) { assert.Len(t, expectedPrunedCIDs, 0) - _, err = storage.db.Get(makeBlobRecordKey(1, c1)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - _, err = storage.db.Get(makeLatestHeightKey(c1)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - _, err = storage.db.Get(makeBlobRecordKey(1, c2)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - _, err = storage.db.Get(makeLatestHeightKey(c2)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - - _, err = storage.db.Get(makeBlobRecordKey(2, c3)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c3)) - assert.NoError(t, err) - _, err = storage.db.Get(makeBlobRecordKey(2, c4)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c4)) - assert.NoError(t, err) + err = storage.db.View(func(txn *badger.Txn) error { + _, err := txn.Get(makeBlobRecordKey(1, c1)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + _, err = txn.Get(makeLatestHeightKey(c1)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + _, err = txn.Get(makeBlobRecordKey(1, c2)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + _, err = txn.Get(makeLatestHeightKey(c2)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + + _, err = txn.Get(makeBlobRecordKey(2, c3)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c3)) + assert.NoError(t, err) + _, err = txn.Get(makeBlobRecordKey(2, c4)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c4)) + assert.NoError(t, err) + + return nil + }) + require.NoError(t, err) } // TestPruneNonLatestHeight test that when pruning a height at which a CID exists, // if that CID also exists at another height above the pruned height, the CID should not be pruned. func TestPruneNonLatestHeight(t *testing.T) { storageDir := t.TempDir() - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) - require.NoError(t, err) - storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { + storage, err := OpenStorage(storageDir, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { assert.Fail(t, "unexpected CID pruned: %s", c.String()) return nil })) @@ -111,14 +106,19 @@ func TestPruneNonLatestHeight(t *testing.T) { require.NoError(t, err) assert.Equal(t, uint64(1), prunedHeight) - _, err = storage.db.Get(makeBlobRecordKey(2, c1)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c1)) - assert.NoError(t, err) - _, err = storage.db.Get(makeBlobRecordKey(2, c2)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c2)) - assert.NoError(t, err) + err = storage.db.View(func(txn *badger.Txn) error { + _, err = txn.Get(makeBlobRecordKey(2, c1)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c1)) + assert.NoError(t, err) + _, err = txn.Get(makeBlobRecordKey(2, c2)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c2)) + assert.NoError(t, err) + + return nil + }) + require.NoError(t, err) } // TestAscendingOrderOfRecords tests that order of data is ascending and all CIDs appearing at or below the pruned @@ -126,12 +126,7 @@ func TestPruneNonLatestHeight(t *testing.T) { func TestAscendingOrderOfRecords(t *testing.T) { expectedPrunedCIDs := make(map[cid.Cid]struct{}) storageDir := t.TempDir() - - options := badgerds.DefaultOptions - options.Options = badger.LSMOnlyOptions(storageDir) - storageDB, err := edstorage.NewBadgerDBWrapper(storageDir, &options) - require.NoError(t, err) - storage, err := OpenStorage(storageDB, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { + storage, err := OpenStorage(storageDir, 0, zerolog.Nop(), WithPruneCallback(func(c cid.Cid) error { _, ok := expectedPrunedCIDs[c] assert.True(t, ok, "unexpected CID pruned: %s", c.String()) delete(expectedPrunedCIDs, c) @@ -165,21 +160,26 @@ func TestAscendingOrderOfRecords(t *testing.T) { assert.Len(t, expectedPrunedCIDs, 0) - // expected that blob record with height 1 was removed - _, err = storage.db.Get(makeBlobRecordKey(1, c1)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - _, err = storage.db.Get(makeLatestHeightKey(c1)) - assert.ErrorIs(t, err, badger.ErrKeyNotFound) - - // expected that blob record with height 2 exists - _, err = storage.db.Get(makeBlobRecordKey(2, c2)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c2)) - assert.NoError(t, err) - - // expected that blob record with height 256 exists - _, err = storage.db.Get(makeBlobRecordKey(256, c3)) - assert.NoError(t, err) - _, err = storage.db.Get(makeLatestHeightKey(c3)) - assert.NoError(t, err) + err = storage.db.View(func(txn *badger.Txn) error { + // expected that blob record with height 1 was removed + _, err := txn.Get(makeBlobRecordKey(1, c1)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + _, err = txn.Get(makeLatestHeightKey(c1)) + assert.ErrorIs(t, err, badger.ErrKeyNotFound) + + // expected that blob record with height 2 exists + _, err = txn.Get(makeBlobRecordKey(2, c2)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c2)) + assert.NoError(t, err) + + // expected that blob record with height 256 exists + _, err = txn.Get(makeBlobRecordKey(256, c3)) + assert.NoError(t, err) + _, err = txn.Get(makeLatestHeightKey(c3)) + assert.NoError(t, err) + + return nil + }) + require.NoError(t, err) } From 4efe3af746abcfedd9243917a08b321c5adb5b39 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 18 Jul 2024 14:46:11 +0300 Subject: [PATCH 13/26] Reverted back using new pebble ConsumerProgress, updated execution data storage interface --- .../node_builder/access_node_builder.go | 18 +++-------- cmd/observer/node_builder/observer_builder.go | 18 +++-------- .../cohort3/execution_state_sync_test.go | 1 + .../storage/badger_storage_db.go | 27 ----------------- .../storage/pebble_storage_db.go | 30 ------------------- .../executiondatasync/storage/storage_db.go | 6 ---- 6 files changed, 9 insertions(+), 91 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index af3191a9376..9eea24f852e 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -11,8 +11,6 @@ import ( "strings" "time" - "github.com/cockroachdb/pebble" - "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -552,12 +550,12 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess if executionDataDBMode == execution_data.ExecutionDataDBModePebble { builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { - return err + return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) } } else { builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { - return err + return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) } } ds = builder.ExecutionDataDatastore.Datastore() @@ -574,21 +572,13 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) - } else { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) - } + processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) - } else { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) - } + processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 10cf0b87aac..095ac1370d7 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -13,8 +13,6 @@ import ( "strings" "time" - "github.com/cockroachdb/pebble" - "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -1124,12 +1122,12 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS if executionDataDBMode == execution_data.ExecutionDataDBModePebble { builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { - return err + return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) } } else { builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { - return err + return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) } } ds = storageDB.Datastore() @@ -1146,21 +1144,13 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) - } else { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) - } + processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) - } else { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataDatastore.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) - } + processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { diff --git a/integration/tests/access/cohort3/execution_state_sync_test.go b/integration/tests/access/cohort3/execution_state_sync_test.go index 7f3f50f47f7..50c8b092ef0 100644 --- a/integration/tests/access/cohort3/execution_state_sync_test.go +++ b/integration/tests/access/cohort3/execution_state_sync_test.go @@ -82,6 +82,7 @@ func (s *ExecutionStateSyncSuite) buildNetworkConfig() { testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-dir=%s", testnet.DefaultExecutionDataServiceDir)), testnet.WithAdditionalFlag("--execution-data-retry-delay=1s"), testnet.WithAdditionalFlagf("--public-network-execution-data-sync-enabled=true"), + testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-db=%s", execution_data.ExecutionDataDBModePebble.String())), ) // add the ghost (access) node config diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 25437f10665..a139c590fce 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -2,7 +2,6 @@ package storage import ( "context" - "errors" "github.com/dgraph-io/badger/v2" ds "github.com/ipfs/go-datastore" @@ -29,10 +28,6 @@ func (b *BadgerDBWrapper) Datastore() ds.Batching { return b.ds } -func (b *BadgerDBWrapper) DB() interface{} { - return b.ds.DB -} - func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { var keys [][]byte @@ -86,25 +81,3 @@ func (b *BadgerDBWrapper) Delete(key []byte) error { func (b *BadgerDBWrapper) Close() error { return b.ds.Close() } - -func (b *BadgerDBWrapper) RetryOnConflict(fn func() error) error { - for { - err := fn() - if errors.Is(err, badger.ErrConflict) { - continue - } - return err - } -} - -func (b *BadgerDBWrapper) MaxBatchCount() int64 { - return b.ds.DB.MaxBatchCount() -} - -func (b *BadgerDBWrapper) MaxBatchSize() int64 { - return b.ds.DB.MaxBatchSize() -} - -func (b *BadgerDBWrapper) RunValueLogGC(discardRatio float64) error { - return b.ds.DB.RunValueLogGC(discardRatio) -} diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index 75ad33f7de3..7d64137aa73 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -15,15 +15,9 @@ var _ StorageDB = (*PebbleDBWrapper)(nil) // PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. type PebbleDBWrapper struct { ds *pebbleds.Datastore - db *pebble.DB } func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrapper, error) { - db, err := pebble.Open(dbPath, options) - if err != nil { - return nil, fmt.Errorf("failed to open pebble database: %w", err) - } - ds, err := pebbleds.NewDatastore(dbPath, options) if err != nil { return nil, fmt.Errorf("could not open tracker ds: %w", err) @@ -31,7 +25,6 @@ func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrappe return &PebbleDBWrapper{ ds: ds, - db: db, }, nil } @@ -39,10 +32,6 @@ func (p *PebbleDBWrapper) Datastore() ds.Batching { return p.ds } -func (p *PebbleDBWrapper) DB() interface{} { - return p.db -} - func (p *PebbleDBWrapper) Keys(prefix []byte) ([][]byte, error) { var keys [][]byte var q query.Query @@ -89,25 +78,6 @@ func (p *PebbleDBWrapper) Close() error { return p.ds.Close() } -func (p *PebbleDBWrapper) RetryOnConflict(_ func() error) error { - return nil -} - -// TODO: implement -func (p *PebbleDBWrapper) MaxBatchCount() int64 { - return 0 -} - -// TODO: implement -func (p *PebbleDBWrapper) MaxBatchSize() int64 { - return 0 -} - -func (p *PebbleDBWrapper) RunValueLogGC(_ float64) error { - // PebbleDB (go-ds-pebble) does not have a direct equivalent to Badger's value log GC. - return nil -} - var _ StorageItem = (*PebbleItem)(nil) type PebbleItem struct { diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go index 98a2ab39381..587940b4d40 100644 --- a/module/executiondatasync/storage/storage_db.go +++ b/module/executiondatasync/storage/storage_db.go @@ -10,7 +10,6 @@ import ( // StorageDB defines the interface for key-value store operations. type StorageDB interface { Datastore() datastore.Batching - DB() interface{} Get(key []byte) (StorageItem, error) Set(key, val []byte) error @@ -20,11 +19,6 @@ type StorageDB interface { Keys(prefix []byte) ([][]byte, error) CollectGarbage(ctx context.Context) error - - RetryOnConflict(fn func() error) error - MaxBatchCount() int64 - MaxBatchSize() int64 - RunValueLogGC(discardRatio float64) error } type StorageItem interface { From bc2b46cdee411a8f5d991492aec2d77571952480 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 18 Jul 2024 15:00:45 +0300 Subject: [PATCH 14/26] Updated observer builder --- cmd/observer/node_builder/observer_builder.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 095ac1370d7..29eb302f742 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -1089,7 +1089,6 @@ func (builder *ObserverServiceBuilder) Build() (cmd.Node, error) { func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverServiceBuilder { var ds datastore.Batching - var storageDB edstorage.StorageDB var bs network.BlobService var processedBlockHeight storage.ConsumerProgress var processedNotifications storage.ConsumerProgress @@ -1130,7 +1129,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) } } - ds = storageDB.Datastore() + ds = builder.ExecutionDataDatastore.Datastore() builder.ShutdownFunc(func() error { if err := builder.ExecutionDataDatastore.Close(); err != nil { From 6851b551e737e10a54223d80784aabdadf80b137 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 18 Jul 2024 18:16:38 +0300 Subject: [PATCH 15/26] Renamed stogare interface, removed unnecessary calls for it --- .../node_builder/access_node_builder.go | 12 ++-- cmd/observer/node_builder/observer_builder.go | 12 ++-- .../storage/badger_storage_db.go | 51 +------------- .../storage/pebble_storage_db.go | 66 +++---------------- .../executiondatasync/storage/storage_db.go | 17 +---- 5 files changed, 26 insertions(+), 132 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 9eea24f852e..473cbf38848 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -311,7 +311,7 @@ type FlowAccessNodeBuilder struct { IndexerDependencies *cmd.DependencyList collectionExecutedMetric module.CollectionExecutedMetric ExecutionDataPruner *pruner.Pruner - ExecutionDataDatastore edstorage.StorageDB + ExecutionDataStorage edstorage.ExecutionDataStorage ExecutionDataTracker tracker.Storage // The sync engine participants provider is the libp2p peer store for the access node @@ -548,20 +548,20 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) + builder.ExecutionDataStorage, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) } } else { - builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDataStorage, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) } } - ds = builder.ExecutionDataDatastore.Datastore() + ds = builder.ExecutionDataStorage.Datastore() builder.ShutdownFunc(func() error { - if err := builder.ExecutionDataDatastore.Close(); err != nil { + if err := builder.ExecutionDataStorage.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -772,7 +772,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess prunerMetrics, builder.ExecutionDataTracker, pruner.WithPruneCallback(func(ctx context.Context) error { - return builder.ExecutionDataDatastore.CollectGarbage(ctx) + return builder.ExecutionDataStorage.CollectGarbage(ctx) }), pruner.WithHeightRangeTarget(builder.executionDataPrunerHeightRangeTarget), pruner.WithThreshold(builder.executionDataPrunerThreshold), diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 29eb302f742..87c427110c0 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -277,7 +277,7 @@ type ObserverServiceBuilder struct { ExecutionDataStore execution_data.ExecutionDataStore ExecutionDataBlobstore blobs.Blobstore ExecutionDataPruner *pruner.Pruner - ExecutionDataDatastore edstorage.StorageDB + ExecutionDataStorage edstorage.ExecutionDataStorage ExecutionDataTracker tracker.Storage RegistersAsyncStore *execution.RegistersAsyncStore @@ -1119,20 +1119,20 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - builder.ExecutionDataDatastore, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) + builder.ExecutionDataStorage, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) if err != nil { return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) } } else { - builder.ExecutionDataDatastore, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDataStorage, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) if err != nil { return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) } } - ds = builder.ExecutionDataDatastore.Datastore() + ds = builder.ExecutionDataStorage.Datastore() builder.ShutdownFunc(func() error { - if err := builder.ExecutionDataDatastore.Close(); err != nil { + if err := builder.ExecutionDataStorage.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -1335,7 +1335,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS prunerMetrics, builder.ExecutionDataTracker, pruner.WithPruneCallback(func(ctx context.Context) error { - return builder.ExecutionDataDatastore.CollectGarbage(ctx) + return builder.ExecutionDataStorage.CollectGarbage(ctx) }), pruner.WithHeightRangeTarget(builder.executionDataPrunerHeightRangeTarget), pruner.WithThreshold(builder.executionDataPrunerThreshold), diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index a139c590fce..70f87628a33 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -3,7 +3,6 @@ package storage import ( "context" - "github.com/dgraph-io/badger/v2" ds "github.com/ipfs/go-datastore" badgerds "github.com/ipfs/go-ds-badger2" ) @@ -28,56 +27,10 @@ func (b *BadgerDBWrapper) Datastore() ds.Batching { return b.ds } -func (b *BadgerDBWrapper) Keys(prefix []byte) ([][]byte, error) { - var keys [][]byte - - err := b.ds.DB.View(func(txn *badger.Txn) error { - it := txn.NewIterator(badger.IteratorOptions{ - PrefetchValues: false, - Prefix: prefix, - }) - defer it.Close() - - for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { - keys = append(keys, it.Item().KeyCopy(nil)) - } - return nil - }) - if err != nil { - return nil, err - } - return keys, nil +func (b *BadgerDBWrapper) Close() error { + return b.ds.Close() } func (b *BadgerDBWrapper) CollectGarbage(ctx context.Context) error { return b.ds.CollectGarbage(ctx) } - -func (b *BadgerDBWrapper) Get(key []byte) (StorageItem, error) { - var item *badger.Item - var err error - err = b.ds.DB.View(func(txn *badger.Txn) error { - item, err = txn.Get(key) - if err != nil { - return err - } - return nil - }) - return item, err -} - -func (b *BadgerDBWrapper) Set(key, val []byte) error { - return b.ds.DB.Update(func(txn *badger.Txn) error { - return txn.Set(key, val) - }) -} - -func (b *BadgerDBWrapper) Delete(key []byte) error { - return b.ds.DB.Update(func(txn *badger.Txn) error { - return txn.Delete(key) - }) -} - -func (b *BadgerDBWrapper) Close() error { - return b.ds.Close() -} diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index 7d64137aa73..064680b4132 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -6,8 +6,9 @@ import ( "github.com/cockroachdb/pebble" ds "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/query" pebbleds "github.com/ipfs/go-ds-pebble" + + pstorage "github.com/onflow/flow-go/storage/pebble" ) var _ StorageDB = (*PebbleDBWrapper)(nil) @@ -18,6 +19,12 @@ type PebbleDBWrapper struct { } func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrapper, error) { + if options == nil { + cache := pebble.NewCache(pstorage.DefaultPebbleCacheSize) + defer cache.Unref() + options = pstorage.DefaultPebbleOptions(cache, pebble.DefaultComparer) + } + ds, err := pebbleds.NewDatastore(dbPath, options) if err != nil { return nil, fmt.Errorf("could not open tracker ds: %w", err) @@ -32,63 +39,10 @@ func (p *PebbleDBWrapper) Datastore() ds.Batching { return p.ds } -func (p *PebbleDBWrapper) Keys(prefix []byte) ([][]byte, error) { - var keys [][]byte - var q query.Query - q.Prefix = string(prefix[:]) - - result, err := p.ds.Query(context.Background(), q) - if err != nil { - return nil, err - } - - entries, _ := result.Rest() - if err != nil { - return nil, err - } - - for _, entry := range entries { - keys = append(keys, []byte(entry.Key)) - } - - return keys, nil -} - -func (p *PebbleDBWrapper) CollectGarbage(ctx context.Context) error { - return nil -} - -func (p *PebbleDBWrapper) Get(key []byte) (StorageItem, error) { - val, err := p.ds.Get(context.Background(), ds.NewKey(string(key))) - if err != nil { - return &PebbleItem{}, err - } - return &PebbleItem{key: key, val: val}, nil -} - -func (p *PebbleDBWrapper) Set(key, val []byte) error { - return p.ds.Put(context.Background(), ds.NewKey(string(key)), val) -} - -func (p *PebbleDBWrapper) Delete(key []byte) error { - return p.ds.Delete(context.Background(), ds.NewKey(string(key))) -} - func (p *PebbleDBWrapper) Close() error { return p.ds.Close() } -var _ StorageItem = (*PebbleItem)(nil) - -type PebbleItem struct { - key []byte - val []byte -} - -func (i *PebbleItem) ValueCopy(dst []byte) ([]byte, error) { - return append(dst, i.val...), nil -} - -func (i *PebbleItem) Key() []byte { - return i.key +func (p *PebbleDBWrapper) CollectGarbage(_ context.Context) error { + return nil } diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go index 587940b4d40..d6d9d12311a 100644 --- a/module/executiondatasync/storage/storage_db.go +++ b/module/executiondatasync/storage/storage_db.go @@ -6,22 +6,9 @@ import ( "github.com/ipfs/go-datastore" ) -// TODO: rename -// StorageDB defines the interface for key-value store operations. -type StorageDB interface { +// ExecutionDataStorage defines the interface for key-value store operations. +type ExecutionDataStorage interface { Datastore() datastore.Batching - - Get(key []byte) (StorageItem, error) - Set(key, val []byte) error - Delete(key []byte) error Close() error - - Keys(prefix []byte) ([][]byte, error) - CollectGarbage(ctx context.Context) error } - -type StorageItem interface { - ValueCopy(dst []byte) ([]byte, error) - Key() []byte -} From 83c00f016c9ee33216e750f79abf83ca501dbbcd Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 18 Jul 2024 18:18:05 +0300 Subject: [PATCH 16/26] Removed flag from integration test --- integration/tests/access/cohort3/execution_state_sync_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/integration/tests/access/cohort3/execution_state_sync_test.go b/integration/tests/access/cohort3/execution_state_sync_test.go index 50c8b092ef0..7f3f50f47f7 100644 --- a/integration/tests/access/cohort3/execution_state_sync_test.go +++ b/integration/tests/access/cohort3/execution_state_sync_test.go @@ -82,7 +82,6 @@ func (s *ExecutionStateSyncSuite) buildNetworkConfig() { testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-dir=%s", testnet.DefaultExecutionDataServiceDir)), testnet.WithAdditionalFlag("--execution-data-retry-delay=1s"), testnet.WithAdditionalFlagf("--public-network-execution-data-sync-enabled=true"), - testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-db=%s", execution_data.ExecutionDataDBModePebble.String())), ) // add the ghost (access) node config From 78097d53eff9339dbd2e9aeb34ba69a1216dec58 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 23 Jul 2024 15:19:07 +0300 Subject: [PATCH 17/26] Updated pebble and badger wrapper according to renaming --- module/executiondatasync/storage/badger_storage_db.go | 2 +- module/executiondatasync/storage/pebble_storage_db.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 70f87628a33..5368a4cbb4c 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -7,7 +7,7 @@ import ( badgerds "github.com/ipfs/go-ds-badger2" ) -var _ StorageDB = (*BadgerDBWrapper)(nil) +var _ ExecutionDataStorage = (*BadgerDBWrapper)(nil) // BadgerDBWrapper wraps the BadgerDB to implement the StorageDB interface. type BadgerDBWrapper struct { diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index 064680b4132..ab358f20727 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -11,7 +11,7 @@ import ( pstorage "github.com/onflow/flow-go/storage/pebble" ) -var _ StorageDB = (*PebbleDBWrapper)(nil) +var _ ExecutionDataStorage = (*PebbleDBWrapper)(nil) // PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. type PebbleDBWrapper struct { From f53dd08b32a559aba1a992f886f450f573b0784f Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 23 Jul 2024 16:24:34 +0300 Subject: [PATCH 18/26] Updated go-ds-pebble version, updated pebble storage wrapper according to go-ds-pebble, updated creating modules according to pebble version of ConsumerProgress --- cmd/access/node_builder/access_node_builder.go | 14 ++++++++++++-- cmd/observer/node_builder/observer_builder.go | 14 ++++++++++++-- go.mod | 3 +++ go.sum | 4 ++-- insecure/go.mod | 3 +++ insecure/go.sum | 4 ++-- .../executiondatasync/storage/badger_storage_db.go | 4 ++++ .../executiondatasync/storage/pebble_storage_db.go | 13 ++++++++++++- module/executiondatasync/storage/storage_db.go | 1 + 9 files changed, 51 insertions(+), 9 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 9591d6be288..e02d39ab004 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -11,6 +11,8 @@ import ( "strings" "time" + "github.com/cockroachdb/pebble" + "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -574,13 +576,21 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } else { + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) + if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } else { + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 87c427110c0..660b40785ab 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -13,6 +13,8 @@ import ( "strings" "time" + "github.com/cockroachdb/pebble" + "github.com/dgraph-io/badger/v2" "github.com/ipfs/boxo/bitswap" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -1143,13 +1145,21 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterBlockHeight) + if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } else { + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + } return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - processedNotifications = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataRequesterNotification) + if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } else { + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + } return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { diff --git a/go.mod b/go.mod index c73ed0ccc22..0a3a35745a5 100644 --- a/go.mod +++ b/go.mod @@ -331,3 +331,6 @@ require ( // Using custom fork until https://github.com/onflow/flow-go/issues/5338 is resolved replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 + +// TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 diff --git a/go.sum b/go.sum index 792308fd575..a6db9b18e44 100644 --- a/go.sum +++ b/go.sum @@ -989,6 +989,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= @@ -1809,8 +1811,6 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= -github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= -github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= diff --git a/insecure/go.mod b/insecure/go.mod index 99bceee248e..c3312d1e36b 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -309,3 +309,6 @@ require ( ) replace github.com/onflow/flow-go => ../ + +// TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 diff --git a/insecure/go.sum b/insecure/go.sum index fa24d774848..d3e4ed2ca8f 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -989,6 +989,8 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= @@ -1804,8 +1806,6 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= -github.com/ipfs/go-ds-pebble v0.3.1 h1:Jyad1qy+d0NZNisaSGUlBSt3dZNHAPl+JThyYe9Rziw= -github.com/ipfs/go-ds-pebble v0.3.1/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go index 5368a4cbb4c..8f8d25a9581 100644 --- a/module/executiondatasync/storage/badger_storage_db.go +++ b/module/executiondatasync/storage/badger_storage_db.go @@ -27,6 +27,10 @@ func (b *BadgerDBWrapper) Datastore() ds.Batching { return b.ds } +func (b *BadgerDBWrapper) DB() interface{} { + return b.ds.DB +} + func (b *BadgerDBWrapper) Close() error { return b.ds.Close() } diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go index ab358f20727..2176e87daab 100644 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ b/module/executiondatasync/storage/pebble_storage_db.go @@ -16,6 +16,7 @@ var _ ExecutionDataStorage = (*PebbleDBWrapper)(nil) // PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. type PebbleDBWrapper struct { ds *pebbleds.Datastore + db *pebble.DB } func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrapper, error) { @@ -25,13 +26,19 @@ func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrappe options = pstorage.DefaultPebbleOptions(cache, pebble.DefaultComparer) } - ds, err := pebbleds.NewDatastore(dbPath, options) + db, err := pebble.Open(dbPath, options) + if err != nil { + return nil, fmt.Errorf("failed to open db: %w", err) + } + + ds, err := pebbleds.NewDatastore(dbPath, options, pebbleds.WithPebbleDB(db)) if err != nil { return nil, fmt.Errorf("could not open tracker ds: %w", err) } return &PebbleDBWrapper{ ds: ds, + db: db, }, nil } @@ -39,6 +46,10 @@ func (p *PebbleDBWrapper) Datastore() ds.Batching { return p.ds } +func (p *PebbleDBWrapper) DB() interface{} { + return p.db +} + func (p *PebbleDBWrapper) Close() error { return p.ds.Close() } diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go index d6d9d12311a..a6d9f58781c 100644 --- a/module/executiondatasync/storage/storage_db.go +++ b/module/executiondatasync/storage/storage_db.go @@ -9,6 +9,7 @@ import ( // ExecutionDataStorage defines the interface for key-value store operations. type ExecutionDataStorage interface { Datastore() datastore.Batching + DB() interface{} Close() error CollectGarbage(ctx context.Context) error } From b19e1ca7ad4b2cfb0c504003a5eeb106f3a81a5b Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 24 Jul 2024 16:43:54 +0300 Subject: [PATCH 19/26] Renamed new types, added godoc --- .../node_builder/access_node_builder.go | 24 +++--- cmd/observer/node_builder/observer_builder.go | 36 ++++----- .../storage/badger_datastore_manager.go | 60 ++++++++++++++ .../storage/badger_storage_db.go | 40 ---------- .../storage/datastore_manager.go | 29 +++++++ .../storage/pebble_datastore_manager.go | 79 +++++++++++++++++++ .../storage/pebble_storage_db.go | 59 -------------- .../executiondatasync/storage/storage_db.go | 15 ---- 8 files changed, 198 insertions(+), 144 deletions(-) create mode 100644 module/executiondatasync/storage/badger_datastore_manager.go delete mode 100644 module/executiondatasync/storage/badger_storage_db.go create mode 100644 module/executiondatasync/storage/datastore_manager.go create mode 100644 module/executiondatasync/storage/pebble_datastore_manager.go delete mode 100644 module/executiondatasync/storage/pebble_storage_db.go delete mode 100644 module/executiondatasync/storage/storage_db.go diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index e02d39ab004..ddca17a17a3 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -315,7 +315,7 @@ type FlowAccessNodeBuilder struct { IndexerDependencies *cmd.DependencyList collectionExecutedMetric module.CollectionExecutedMetric ExecutionDataPruner *pruner.Pruner - ExecutionDataStorage edstorage.ExecutionDataStorage + ExecutionDatastoreManager edstorage.DatastoreManager ExecutionDataTracker tracker.Storage // The sync engine participants provider is the libp2p peer store for the access node @@ -552,20 +552,20 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - builder.ExecutionDataStorage, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) + builder.ExecutionDatastoreManager, err = edstorage.NewPebbleDatastoreManager(datastoreDir, nil) if err != nil { - return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) + return fmt.Errorf("could not create PebbleDatastoreManager for execution data: %w", err) } } else { - builder.ExecutionDataStorage, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDatastoreManager, err = edstorage.NewBadgerDatastoreManager(datastoreDir, &badgerds.DefaultOptions) if err != nil { - return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) + return fmt.Errorf("could not create BadgerDatastoreManager for execution data: %w", err) } } - ds = builder.ExecutionDataStorage.Datastore() + ds = builder.ExecutionDatastoreManager.Datastore() builder.ShutdownFunc(func() error { - if err := builder.ExecutionDataStorage.Close(); err != nil { + if err := builder.ExecutionDatastoreManager.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -577,9 +577,9 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) } else { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) } return nil }). @@ -587,9 +587,9 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) } else { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) } return nil }). @@ -784,7 +784,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess prunerMetrics, builder.ExecutionDataTracker, pruner.WithPruneCallback(func(ctx context.Context) error { - return builder.ExecutionDataStorage.CollectGarbage(ctx) + return builder.ExecutionDatastoreManager.CollectGarbage(ctx) }), pruner.WithHeightRangeTarget(builder.executionDataPrunerHeightRangeTarget), pruner.WithThreshold(builder.executionDataPrunerThreshold), diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 660b40785ab..497f9af382f 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -274,13 +274,13 @@ type ObserverServiceBuilder struct { TxResultsIndex *index.TransactionResultsIndex IndexerDependencies *cmd.DependencyList - ExecutionDataDownloader execution_data.Downloader - ExecutionDataRequester state_synchronization.ExecutionDataRequester - ExecutionDataStore execution_data.ExecutionDataStore - ExecutionDataBlobstore blobs.Blobstore - ExecutionDataPruner *pruner.Pruner - ExecutionDataStorage edstorage.ExecutionDataStorage - ExecutionDataTracker tracker.Storage + ExecutionDataDownloader execution_data.Downloader + ExecutionDataRequester state_synchronization.ExecutionDataRequester + ExecutionDataStore execution_data.ExecutionDataStore + ExecutionDataBlobstore blobs.Blobstore + ExecutionDataPruner *pruner.Pruner + ExecutionDatastoreManager edstorage.DatastoreManager + ExecutionDataTracker tracker.Storage RegistersAsyncStore *execution.RegistersAsyncStore Reporter *index.Reporter @@ -1121,20 +1121,20 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS } if executionDataDBMode == execution_data.ExecutionDataDBModePebble { - builder.ExecutionDataStorage, err = edstorage.NewPebbleDBWrapper(datastoreDir, nil) + builder.ExecutionDatastoreManager, err = edstorage.NewPebbleDatastoreManager(datastoreDir, nil) if err != nil { - return fmt.Errorf("could not create PebbleDBWrapper for execution data: %w", err) + return fmt.Errorf("could not create PebbleDatastoreManager for execution data: %w", err) } } else { - builder.ExecutionDataStorage, err = edstorage.NewBadgerDBWrapper(datastoreDir, &badgerds.DefaultOptions) + builder.ExecutionDatastoreManager, err = edstorage.NewBadgerDatastoreManager(datastoreDir, &badgerds.DefaultOptions) if err != nil { - return fmt.Errorf("could not create BadgerDBWrapper for execution data: %w", err) + return fmt.Errorf("could not create BadgerDatastoreManager for execution data: %w", err) } } - ds = builder.ExecutionDataStorage.Datastore() + ds = builder.ExecutionDatastoreManager.Datastore() builder.ShutdownFunc(func() error { - if err := builder.ExecutionDataStorage.Close(); err != nil { + if err := builder.ExecutionDatastoreManager.Close(); err != nil { return fmt.Errorf("could not close execution data datastore: %w", err) } return nil @@ -1146,9 +1146,9 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) } else { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) } return nil }). @@ -1156,9 +1156,9 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) } else { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDataStorage.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) } return nil }). @@ -1345,7 +1345,7 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS prunerMetrics, builder.ExecutionDataTracker, pruner.WithPruneCallback(func(ctx context.Context) error { - return builder.ExecutionDataStorage.CollectGarbage(ctx) + return builder.ExecutionDatastoreManager.CollectGarbage(ctx) }), pruner.WithHeightRangeTarget(builder.executionDataPrunerHeightRangeTarget), pruner.WithThreshold(builder.executionDataPrunerThreshold), diff --git a/module/executiondatasync/storage/badger_datastore_manager.go b/module/executiondatasync/storage/badger_datastore_manager.go new file mode 100644 index 00000000000..9bd7ebe7cc5 --- /dev/null +++ b/module/executiondatasync/storage/badger_datastore_manager.go @@ -0,0 +1,60 @@ +package storage + +import ( + "context" + + ds "github.com/ipfs/go-datastore" + badgerds "github.com/ipfs/go-ds-badger2" +) + +var _ DatastoreManager = (*BadgerDatastoreManager)(nil) + +// BadgerDatastoreManager wraps the Badger datastore to implement the +// DatastoreManager interface. It provides access to a Badger datastore +// instance and implements the required methods for managing it. +type BadgerDatastoreManager struct { + ds *badgerds.Datastore +} + +// NewBadgerDatastoreManager creates a new instance of BadgerDatastoreManager +// with the specified datastore path and options. +// +// Parameters: +// - path: The path where the datastore files will be stored. +// - options: Configuration options for the Badger datastore. +// +// No errors are expected during normal operations. +func NewBadgerDatastoreManager(path string, options *badgerds.Options) (*BadgerDatastoreManager, error) { + ds, err := badgerds.NewDatastore(path, options) + if err != nil { + return nil, err + } + + return &BadgerDatastoreManager{ds}, nil +} + +// Datastore provides access to the datastore for performing batched +// read and write operations. +func (b *BadgerDatastoreManager) Datastore() ds.Batching { + return b.ds +} + +// DB returns the raw database object, allowing for more direct +// access to the underlying database features and operations. +func (b *BadgerDatastoreManager) DB() interface{} { + return b.ds.DB +} + +// Close terminates the connection to the datastore and releases +// any resources associated with it. This method should be called +// when you are finished using the datastore to ensure resources +// are properly cleaned up. +func (b *BadgerDatastoreManager) Close() error { + return b.ds.Close() +} + +// CollectGarbage initiates garbage collection on the Badger datastore +// to reclaim unused space and optimize performance. +func (b *BadgerDatastoreManager) CollectGarbage(ctx context.Context) error { + return b.ds.CollectGarbage(ctx) +} diff --git a/module/executiondatasync/storage/badger_storage_db.go b/module/executiondatasync/storage/badger_storage_db.go deleted file mode 100644 index 8f8d25a9581..00000000000 --- a/module/executiondatasync/storage/badger_storage_db.go +++ /dev/null @@ -1,40 +0,0 @@ -package storage - -import ( - "context" - - ds "github.com/ipfs/go-datastore" - badgerds "github.com/ipfs/go-ds-badger2" -) - -var _ ExecutionDataStorage = (*BadgerDBWrapper)(nil) - -// BadgerDBWrapper wraps the BadgerDB to implement the StorageDB interface. -type BadgerDBWrapper struct { - ds *badgerds.Datastore -} - -func NewBadgerDBWrapper(datastorePath string, options *badgerds.Options) (*BadgerDBWrapper, error) { - ds, err := badgerds.NewDatastore(datastorePath, options) - if err != nil { - return nil, err - } - - return &BadgerDBWrapper{ds}, nil -} - -func (b *BadgerDBWrapper) Datastore() ds.Batching { - return b.ds -} - -func (b *BadgerDBWrapper) DB() interface{} { - return b.ds.DB -} - -func (b *BadgerDBWrapper) Close() error { - return b.ds.Close() -} - -func (b *BadgerDBWrapper) CollectGarbage(ctx context.Context) error { - return b.ds.CollectGarbage(ctx) -} diff --git a/module/executiondatasync/storage/datastore_manager.go b/module/executiondatasync/storage/datastore_manager.go new file mode 100644 index 00000000000..28eff68ebc6 --- /dev/null +++ b/module/executiondatasync/storage/datastore_manager.go @@ -0,0 +1,29 @@ +package storage + +import ( + "context" + + "github.com/ipfs/go-datastore" +) + +// DatastoreManager is an interface that defines the methods for managing +// a datastore used for handling execution data. It provides methods to +// access the underlying datastore, perform garbage collection, and handle +// closing operations. Implementations of this interface are expected to +// wrap around different types of datastore's. +type DatastoreManager interface { + // Datastore provides access to the datastore for performing batched + // read and write operations. + Datastore() datastore.Batching + // DB returns the raw database object, allowing for more direct + // access to the underlying database features and operations. + DB() interface{} + // Close terminates the connection to the datastore and releases + // any resources associated with it. This method should be called + // when you are finished using the datastore to ensure resources + // are properly cleaned up. + Close() error + // CollectGarbage initiates garbage collection on the datastore + // to reclaim unused space and optimize performance. + CollectGarbage(ctx context.Context) error +} diff --git a/module/executiondatasync/storage/pebble_datastore_manager.go b/module/executiondatasync/storage/pebble_datastore_manager.go new file mode 100644 index 00000000000..62a1378fd29 --- /dev/null +++ b/module/executiondatasync/storage/pebble_datastore_manager.go @@ -0,0 +1,79 @@ +package storage + +import ( + "context" + "fmt" + + "github.com/cockroachdb/pebble" + ds "github.com/ipfs/go-datastore" + pebbleds "github.com/ipfs/go-ds-pebble" + + pstorage "github.com/onflow/flow-go/storage/pebble" +) + +var _ DatastoreManager = (*PebbleDatastoreManager)(nil) + +// PebbleDatastoreManager wraps the PebbleDB to implement the StorageDB interface. +type PebbleDatastoreManager struct { + ds *pebbleds.Datastore + db *pebble.DB +} + +// NewPebbleDatastoreManager creates and returns a new instance of PebbleDatastoreManager. +// It initializes the PebbleDB database with the specified path and options. +// If no options are provided, default options are used. +// +// Parameters: +// - path: The path to the directory where the PebbleDB files will be stored. +// - options: Configuration options for the PebbleDB database. If nil, default +// options are applied. +// +// No errors are expected during normal operations. +func NewPebbleDatastoreManager(path string, options *pebble.Options) (*PebbleDatastoreManager, error) { + if options == nil { + cache := pebble.NewCache(pstorage.DefaultPebbleCacheSize) + defer cache.Unref() + options = pstorage.DefaultPebbleOptions(cache, pebble.DefaultComparer) + } + + db, err := pebble.Open(path, options) + if err != nil { + return nil, fmt.Errorf("failed to open db: %w", err) + } + + ds, err := pebbleds.NewDatastore(path, options, pebbleds.WithPebbleDB(db)) + if err != nil { + return nil, fmt.Errorf("could not open tracker ds: %w", err) + } + + return &PebbleDatastoreManager{ + ds: ds, + db: db, + }, nil +} + +// Datastore provides access to the datastore for performing batched +// read and write operations. +func (p *PebbleDatastoreManager) Datastore() ds.Batching { + return p.ds +} + +// DB returns the raw database object, allowing for more direct +// access to the underlying database features and operations. +func (p *PebbleDatastoreManager) DB() interface{} { + return p.db +} + +// Close terminates the connection to the datastore and releases +// any resources associated with it. This method should be called +// when you are finished using the datastore to ensure resources +// are properly cleaned up. +func (p *PebbleDatastoreManager) Close() error { + return p.ds.Close() +} + +// CollectGarbage initiates garbage collection on the datastore +// to reclaim unused space and optimize performance. +func (p *PebbleDatastoreManager) CollectGarbage(_ context.Context) error { + return nil +} diff --git a/module/executiondatasync/storage/pebble_storage_db.go b/module/executiondatasync/storage/pebble_storage_db.go deleted file mode 100644 index 2176e87daab..00000000000 --- a/module/executiondatasync/storage/pebble_storage_db.go +++ /dev/null @@ -1,59 +0,0 @@ -package storage - -import ( - "context" - "fmt" - - "github.com/cockroachdb/pebble" - ds "github.com/ipfs/go-datastore" - pebbleds "github.com/ipfs/go-ds-pebble" - - pstorage "github.com/onflow/flow-go/storage/pebble" -) - -var _ ExecutionDataStorage = (*PebbleDBWrapper)(nil) - -// PebbleDBWrapper wraps the PebbleDB to implement the StorageDB interface. -type PebbleDBWrapper struct { - ds *pebbleds.Datastore - db *pebble.DB -} - -func NewPebbleDBWrapper(dbPath string, options *pebble.Options) (*PebbleDBWrapper, error) { - if options == nil { - cache := pebble.NewCache(pstorage.DefaultPebbleCacheSize) - defer cache.Unref() - options = pstorage.DefaultPebbleOptions(cache, pebble.DefaultComparer) - } - - db, err := pebble.Open(dbPath, options) - if err != nil { - return nil, fmt.Errorf("failed to open db: %w", err) - } - - ds, err := pebbleds.NewDatastore(dbPath, options, pebbleds.WithPebbleDB(db)) - if err != nil { - return nil, fmt.Errorf("could not open tracker ds: %w", err) - } - - return &PebbleDBWrapper{ - ds: ds, - db: db, - }, nil -} - -func (p *PebbleDBWrapper) Datastore() ds.Batching { - return p.ds -} - -func (p *PebbleDBWrapper) DB() interface{} { - return p.db -} - -func (p *PebbleDBWrapper) Close() error { - return p.ds.Close() -} - -func (p *PebbleDBWrapper) CollectGarbage(_ context.Context) error { - return nil -} diff --git a/module/executiondatasync/storage/storage_db.go b/module/executiondatasync/storage/storage_db.go deleted file mode 100644 index a6d9f58781c..00000000000 --- a/module/executiondatasync/storage/storage_db.go +++ /dev/null @@ -1,15 +0,0 @@ -package storage - -import ( - "context" - - "github.com/ipfs/go-datastore" -) - -// ExecutionDataStorage defines the interface for key-value store operations. -type ExecutionDataStorage interface { - Datastore() datastore.Batching - DB() interface{} - Close() error - CollectGarbage(ctx context.Context) error -} From 8e145f9b8acbe896d5aedd9dd99706606df80189 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 24 Jul 2024 16:47:43 +0300 Subject: [PATCH 20/26] Added intergration test for pebble db --- integration/go.mod | 4 +++ integration/go.sum | 2 ++ .../cohort3/execution_state_sync_test.go | 32 ++++++++++++++++--- .../pebble_execution_state_sync_test.go | 27 ++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 integration/tests/access/cohort3/pebble_execution_state_sync_test.go diff --git a/integration/go.mod b/integration/go.mod index e44e89f7816..c94b2147d03 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -18,6 +18,7 @@ require ( github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-badger2 v0.1.3 + github.com/ipfs/go-ds-pebble v0.3.1 github.com/libp2p/go-libp2p v0.32.2 github.com/onflow/cadence v1.0.0-preview.38 github.com/onflow/crypto v0.25.1 @@ -358,3 +359,6 @@ require ( replace github.com/onflow/flow-go => ../ replace github.com/onflow/flow-go/insecure => ../insecure + +// TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 diff --git a/integration/go.sum b/integration/go.sum index 41c47576042..0ce26d6c89c 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -999,6 +999,8 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= +github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= diff --git a/integration/tests/access/cohort3/execution_state_sync_test.go b/integration/tests/access/cohort3/execution_state_sync_test.go index 7f3f50f47f7..4ff4e77383e 100644 --- a/integration/tests/access/cohort3/execution_state_sync_test.go +++ b/integration/tests/access/cohort3/execution_state_sync_test.go @@ -6,7 +6,9 @@ import ( "path/filepath" "testing" + "github.com/ipfs/go-datastore" badgerds "github.com/ipfs/go-ds-badger2" + pebbleds "github.com/ipfs/go-ds-pebble" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,14 +43,20 @@ type ExecutionStateSyncSuite struct { ctx context.Context cancel context.CancelFunc - net *testnet.FlowNetwork + net *testnet.FlowNetwork + executionDataDBMode execution_data.ExecutionDataDBMode } func (s *ExecutionStateSyncSuite) SetupTest() { + s.setup(execution_data.ExecutionDataDBModeBadger) +} + +func (s *ExecutionStateSyncSuite) setup(executionDataDBMode execution_data.ExecutionDataDBMode) { s.log = unittest.LoggerForTest(s.Suite.T(), zerolog.InfoLevel) s.log.Info().Msg("================> SetupTest") s.ctx, s.cancel = context.WithCancel(context.Background()) + s.executionDataDBMode = executionDataDBMode s.buildNetworkConfig() // start the network @@ -82,6 +90,7 @@ func (s *ExecutionStateSyncSuite) buildNetworkConfig() { testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-dir=%s", testnet.DefaultExecutionDataServiceDir)), testnet.WithAdditionalFlag("--execution-data-retry-delay=1s"), testnet.WithAdditionalFlagf("--public-network-execution-data-sync-enabled=true"), + testnet.WithAdditionalFlag(fmt.Sprintf("--execution-data-db=%s", s.executionDataDBMode.String())), ) // add the ghost (access) node config @@ -121,6 +130,7 @@ func (s *ExecutionStateSyncSuite) buildNetworkConfig() { fmt.Sprintf("--execution-data-dir=%s", testnet.DefaultExecutionDataServiceDir), "--execution-data-sync-enabled=true", "--event-query-mode=execution-nodes-only", + fmt.Sprintf("--execution-data-db=%s", s.executionDataDBMode.String()), }, }} @@ -128,9 +138,13 @@ func (s *ExecutionStateSyncSuite) buildNetworkConfig() { s.net = testnet.PrepareFlowNetwork(s.T(), conf, flow.Localnet) } -// TestHappyPath tests that Execution Nodes generate execution data, and Access Nodes are able to -// successfully sync the data -func (s *ExecutionStateSyncSuite) TestHappyPath() { +// TestBadgerDBHappyPath tests that Execution Nodes generate execution data, and Access Nodes are able to +// successfully sync the data to badger DB +func (s *ExecutionStateSyncSuite) TestBadgerDBHappyPath() { + s.executionStateSyncTest() +} + +func (s *ExecutionStateSyncSuite) executionStateSyncTest() { // Let the network run for this many blocks runBlocks := uint64(60) @@ -203,7 +217,15 @@ func (s *ExecutionStateSyncSuite) TestHappyPath() { } func (s *ExecutionStateSyncSuite) nodeExecutionDataStore(node *testnet.Container) execution_data.ExecutionDataStore { - ds, err := badgerds.NewDatastore(filepath.Join(node.ExecutionDataDBPath(), "blobstore"), &badgerds.DefaultOptions) + var ds datastore.Batching + var err error + dsPath := filepath.Join(node.ExecutionDataDBPath(), "blobstore") + + if s.executionDataDBMode == execution_data.ExecutionDataDBModePebble { + ds, err = pebbleds.NewDatastore(dsPath, nil) + } else { + ds, err = badgerds.NewDatastore(dsPath, &badgerds.DefaultOptions) + } require.NoError(s.T(), err, "could not get execution datastore") return execution_data.NewExecutionDataStore(blobs.NewBlobstore(ds), execution_data.DefaultSerializer) diff --git a/integration/tests/access/cohort3/pebble_execution_state_sync_test.go b/integration/tests/access/cohort3/pebble_execution_state_sync_test.go new file mode 100644 index 00000000000..6d2920ab950 --- /dev/null +++ b/integration/tests/access/cohort3/pebble_execution_state_sync_test.go @@ -0,0 +1,27 @@ +package cohort3 + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/onflow/flow-go/module/executiondatasync/execution_data" +) + +func TestPebbleExecutionStateSync(t *testing.T) { + suite.Run(t, new(PebbleExecutionStateSync)) +} + +type PebbleExecutionStateSync struct { + ExecutionStateSyncSuite +} + +func (s *PebbleExecutionStateSync) SetupTest() { + s.setup(execution_data.ExecutionDataDBModePebble) +} + +// TestBadgerDBHappyPath tests that Execution Nodes generate execution data, and Access Nodes are able to +// successfully sync the data to pebble DB +func (s *PebbleExecutionStateSync) TestPebbleDBHappyPath() { + s.executionStateSyncTest() +} From 2199e2e48e5e8bed4feb8f826654ab266a324daf Mon Sep 17 00:00:00 2001 From: Uliana Andrukhiv Date: Thu, 25 Jul 2024 12:49:35 +0300 Subject: [PATCH 21/26] Updated documentation Co-authored-by: Andrii Slisarchuk --- module/executiondatasync/storage/datastore_manager.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/module/executiondatasync/storage/datastore_manager.go b/module/executiondatasync/storage/datastore_manager.go index 28eff68ebc6..f66d1af2554 100644 --- a/module/executiondatasync/storage/datastore_manager.go +++ b/module/executiondatasync/storage/datastore_manager.go @@ -19,9 +19,8 @@ type DatastoreManager interface { // access to the underlying database features and operations. DB() interface{} // Close terminates the connection to the datastore and releases - // any resources associated with it. This method should be called - // when you are finished using the datastore to ensure resources - // are properly cleaned up. + // any associated resources. This method should be called + // when finished using the datastore to ensure proper resource cleanup. Close() error // CollectGarbage initiates garbage collection on the datastore // to reclaim unused space and optimize performance. From 105e26bd68d6ac0b9c44f60a230d633b07d7e98d Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Thu, 25 Jul 2024 12:52:26 +0300 Subject: [PATCH 22/26] Updated godoc according to comments --- module/executiondatasync/storage/badger_datastore_manager.go | 5 ++--- module/executiondatasync/storage/pebble_datastore_manager.go | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/module/executiondatasync/storage/badger_datastore_manager.go b/module/executiondatasync/storage/badger_datastore_manager.go index 9bd7ebe7cc5..3c0cec6ab67 100644 --- a/module/executiondatasync/storage/badger_datastore_manager.go +++ b/module/executiondatasync/storage/badger_datastore_manager.go @@ -46,9 +46,8 @@ func (b *BadgerDatastoreManager) DB() interface{} { } // Close terminates the connection to the datastore and releases -// any resources associated with it. This method should be called -// when you are finished using the datastore to ensure resources -// are properly cleaned up. +// any associated resources. This method should be called +// when finished using the datastore to ensure proper resource cleanup. func (b *BadgerDatastoreManager) Close() error { return b.ds.Close() } diff --git a/module/executiondatasync/storage/pebble_datastore_manager.go b/module/executiondatasync/storage/pebble_datastore_manager.go index 62a1378fd29..9d1e7b1a814 100644 --- a/module/executiondatasync/storage/pebble_datastore_manager.go +++ b/module/executiondatasync/storage/pebble_datastore_manager.go @@ -65,9 +65,8 @@ func (p *PebbleDatastoreManager) DB() interface{} { } // Close terminates the connection to the datastore and releases -// any resources associated with it. This method should be called -// when you are finished using the datastore to ensure resources -// are properly cleaned up. +// any associated resources. This method should be called +// when finished using the datastore to ensure proper resource cleanup. func (p *PebbleDatastoreManager) Close() error { return p.ds.Close() } From 9bf6848a5f042b89a82e9feec9b6ce7c64af6e7d Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 30 Jul 2024 11:58:38 +0300 Subject: [PATCH 23/26] Updated according to comments --- cmd/access/node_builder/access_node_builder.go | 2 +- cmd/observer/node_builder/observer_builder.go | 2 +- module/executiondatasync/execution_data/execution_data.go | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 05181fbe0ab..12086db5eea 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -1296,7 +1296,7 @@ func (builder *FlowAccessNodeBuilder) extraFlags() { flags.StringVar(&builder.executionDataDBMode, "execution-data-db", defaultConfig.executionDataDBMode, - "[experimental] the DB name for execution data name. One of [badger, pebble]") + "[experimental] the DB type for execution datastore. One of [badger, pebble]") flags.Uint64Var(&builder.executionDataPrunerHeightRangeTarget, "execution-data-height-range-target", defaultConfig.executionDataPrunerHeightRangeTarget, diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 36293ca922c..ed05d3edfae 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -687,7 +687,7 @@ func (builder *ObserverServiceBuilder) extraFlags() { flags.StringVar(&builder.executionDataDBMode, "execution-data-db", defaultConfig.executionDataDBMode, - "[experimental] the DB name for execution data name. One of [badger, pebble]") + "[experimental] the DB type for execution datastore. One of [badger, pebble]") // Execution data pruner flags.Uint64Var(&builder.executionDataPrunerHeightRangeTarget, diff --git a/module/executiondatasync/execution_data/execution_data.go b/module/executiondatasync/execution_data/execution_data.go index 83239075857..46f6e741738 100644 --- a/module/executiondatasync/execution_data/execution_data.go +++ b/module/executiondatasync/execution_data/execution_data.go @@ -15,7 +15,6 @@ const ( ExecutionDataDBModeBadger ExecutionDataDBMode = iota + 1 // ExecutionDataDBModePebble uses pebble db - // execution nodes ExecutionDataDBModePebble ) From 513d6be32f3ea8cb18d34cdeb8470e02d47aeee4 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 30 Jul 2024 15:08:28 +0300 Subject: [PATCH 24/26] Updated documentation for integration test --- .../tests/access/cohort3/pebble_execution_state_sync_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/tests/access/cohort3/pebble_execution_state_sync_test.go b/integration/tests/access/cohort3/pebble_execution_state_sync_test.go index 6d2920ab950..aa345276ff9 100644 --- a/integration/tests/access/cohort3/pebble_execution_state_sync_test.go +++ b/integration/tests/access/cohort3/pebble_execution_state_sync_test.go @@ -20,7 +20,7 @@ func (s *PebbleExecutionStateSync) SetupTest() { s.setup(execution_data.ExecutionDataDBModePebble) } -// TestBadgerDBHappyPath tests that Execution Nodes generate execution data, and Access Nodes are able to +// TestPebbleDBHappyPath+ tests that Execution Nodes generate execution data, and Access Nodes are able to // successfully sync the data to pebble DB func (s *PebbleExecutionStateSync) TestPebbleDBHappyPath() { s.executionStateSyncTest() From cb4b8ae1034b056166931386f3aa848a365a9d57 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Tue, 30 Jul 2024 17:55:26 +0300 Subject: [PATCH 25/26] Added comment for pebble CillectGarbage --- module/executiondatasync/storage/pebble_datastore_manager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/module/executiondatasync/storage/pebble_datastore_manager.go b/module/executiondatasync/storage/pebble_datastore_manager.go index 9d1e7b1a814..dc738a16e17 100644 --- a/module/executiondatasync/storage/pebble_datastore_manager.go +++ b/module/executiondatasync/storage/pebble_datastore_manager.go @@ -74,5 +74,6 @@ func (p *PebbleDatastoreManager) Close() error { // CollectGarbage initiates garbage collection on the datastore // to reclaim unused space and optimize performance. func (p *PebbleDatastoreManager) CollectGarbage(_ context.Context) error { + // In PebbleDB, there's no direct equivalent to manual value log garbage collection return nil } From 46303a45944ebc2947fd4b17f5e30c5991664de5 Mon Sep 17 00:00:00 2001 From: UlyanaAndrukhiv Date: Wed, 31 Jul 2024 16:53:24 +0300 Subject: [PATCH 26/26] Updated the replace --- go.mod | 2 +- go.sum | 4 ++-- insecure/go.mod | 2 +- insecure/go.sum | 4 ++-- integration/go.mod | 2 +- integration/go.sum | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 23241570c47..461b6409e83 100644 --- a/go.mod +++ b/go.mod @@ -333,4 +333,4 @@ require ( replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 // TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged -replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c diff --git a/go.sum b/go.sum index 6bab6e27216..f95922616e6 100644 --- a/go.sum +++ b/go.sum @@ -989,8 +989,6 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= @@ -2194,6 +2192,8 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.5 h1:6o+pgYGqwXdEhqSJxu2BdnDXkOQVOkfGAb6IiXB+NPM= github.com/onflow/flow/protobuf/go/flow v0.4.5/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c h1:T0jDCm7k7uqDo26JiiujQ5oryl30itPnlmZQywTu9ng= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/onflow/go-ethereum v1.14.7 h1:gg3awYqI02e3AypRdpJKEvNTJ6kz/OhAqRti0h54Wlc= github.com/onflow/go-ethereum v1.14.7/go.mod h1:zV14QLrXyYu5ucvcwHUA0r6UaqveqbXaehAVQJlSW+I= github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 h1:sxyWLqGm/p4EKT6DUlQESDG1ZNMN9GjPCm1gTq7NGfc= diff --git a/insecure/go.mod b/insecure/go.mod index 8e7f6c41104..aa07e28403e 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -311,4 +311,4 @@ require ( replace github.com/onflow/flow-go => ../ // TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged -replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c diff --git a/insecure/go.sum b/insecure/go.sum index f50c10f738e..f62e459dd6a 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -989,8 +989,6 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= @@ -2182,6 +2180,8 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.5 h1:6o+pgYGqwXdEhqSJxu2BdnDXkOQVOkfGAb6IiXB+NPM= github.com/onflow/flow/protobuf/go/flow v0.4.5/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c h1:T0jDCm7k7uqDo26JiiujQ5oryl30itPnlmZQywTu9ng= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/onflow/go-ethereum v1.14.7 h1:gg3awYqI02e3AypRdpJKEvNTJ6kz/OhAqRti0h54Wlc= github.com/onflow/go-ethereum v1.14.7/go.mod h1:zV14QLrXyYu5ucvcwHUA0r6UaqveqbXaehAVQJlSW+I= github.com/onflow/sdks v0.5.1-0.20230912225508-b35402f12bba/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= diff --git a/integration/go.mod b/integration/go.mod index 2031070c54d..59ff0f7c404 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -361,4 +361,4 @@ replace github.com/onflow/flow-go => ../ replace github.com/onflow/flow-go/insecure => ../insecure // TODO: remove it when https://github.com/ipfs/go-ds-pebble/pull/36 merged -replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 +replace github.com/ipfs/go-ds-pebble v0.3.1 => github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c diff --git a/integration/go.sum b/integration/go.sum index d8be133ff80..07ea61eb5ff 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -999,8 +999,6 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6 h1:J+ITD5qVZL6X/8NrIg0SkerHVEl9w2jSIOt47IxeRZE= -github.com/The-K-R-O-K/go-ds-pebble v0.0.0-20240723100149-b11ba40ed8c6/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= @@ -2168,6 +2166,8 @@ github.com/onflow/flow-nft/lib/go/templates v1.2.0/go.mod h1:p+2hRvtjLUR3MW1NsoJ github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231121210617-52ee94b830c2/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= github.com/onflow/flow/protobuf/go/flow v0.4.5 h1:6o+pgYGqwXdEhqSJxu2BdnDXkOQVOkfGAb6IiXB+NPM= github.com/onflow/flow/protobuf/go/flow v0.4.5/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c h1:T0jDCm7k7uqDo26JiiujQ5oryl30itPnlmZQywTu9ng= +github.com/onflow/go-ds-pebble v0.0.0-20240731130313-f186539f382c/go.mod h1:XYnWtulwJvHVOr2B0WVA/UC3dvRgFevjp8Pn9a3E1xo= github.com/onflow/go-ethereum v1.14.7 h1:gg3awYqI02e3AypRdpJKEvNTJ6kz/OhAqRti0h54Wlc= github.com/onflow/go-ethereum v1.14.7/go.mod h1:zV14QLrXyYu5ucvcwHUA0r6UaqveqbXaehAVQJlSW+I= github.com/onflow/sdks v0.5.1-0.20230912225508-b35402f12bba/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU=