mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Merge branch 'develop' into Bronek/vault_enable
This commit is contained in:
1
.github/actions/dependencies/action.yml
vendored
1
.github/actions/dependencies/action.yml
vendored
@@ -12,7 +12,6 @@ runs:
|
|||||||
conan export --version 1.1.10 external/snappy
|
conan export --version 1.1.10 external/snappy
|
||||||
conan export --version 9.7.3 external/rocksdb
|
conan export --version 9.7.3 external/rocksdb
|
||||||
conan export --version 4.0.3 external/soci
|
conan export --version 4.0.3 external/soci
|
||||||
conan export --version 2.0.8 external/nudb
|
|
||||||
- name: add Ripple Conan remote
|
- name: add Ripple Conan remote
|
||||||
if: env.CONAN_URL != ''
|
if: env.CONAN_URL != ''
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
9
.github/workflows/clang-format.yml
vendored
9
.github/workflows/clang-format.yml
vendored
@@ -11,6 +11,15 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
container: ghcr.io/xrplf/ci/tools-rippled-clang-format
|
container: ghcr.io/xrplf/ci/tools-rippled-clang-format
|
||||||
steps:
|
steps:
|
||||||
|
# For jobs running in containers, $GITHUB_WORKSPACE and ${{ github.workspace }} might not be the
|
||||||
|
# same directory. The actions/checkout step is *supposed* to checkout into $GITHUB_WORKSPACE and
|
||||||
|
# then add it to safe.directory (see instructions at https://github.com/actions/checkout)
|
||||||
|
# but that's apparently not happening for some container images. We can't be sure what is actually
|
||||||
|
# happening, so let's pre-emptively add both directories to safe.directory. There's a
|
||||||
|
# Github issue opened in 2022 and not resolved in 2025 https://github.com/actions/runner/issues/2058 ¯\_(ツ)_/¯
|
||||||
|
- run: |
|
||||||
|
git config --global --add safe.directory $GITHUB_WORKSPACE
|
||||||
|
git config --global --add safe.directory ${{ github.workspace }}
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Format first-party sources
|
- name: Format first-party sources
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
7
.github/workflows/macos.yml
vendored
7
.github/workflows/macos.yml
vendored
@@ -24,6 +24,8 @@ env:
|
|||||||
CONAN_GLOBAL_CONF: |
|
CONAN_GLOBAL_CONF: |
|
||||||
core.download:parallel={{os.cpu_count()}}
|
core.download:parallel={{os.cpu_count()}}
|
||||||
core.upload:parallel={{os.cpu_count()}}
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
|
core:default_build_profile=libxrpl
|
||||||
|
core:default_profile=libxrpl
|
||||||
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
||||||
tools.build:verbosity=verbose
|
tools.build:verbosity=verbose
|
||||||
tools.compilation:verbosity=verbose
|
tools.compilation:verbosity=verbose
|
||||||
@@ -40,7 +42,7 @@ jobs:
|
|||||||
- Ninja
|
- Ninja
|
||||||
configuration:
|
configuration:
|
||||||
- Release
|
- Release
|
||||||
runs-on: [self-hosted, macOS]
|
runs-on: [self-hosted, macOS, mac-runner-m1]
|
||||||
env:
|
env:
|
||||||
# The `build` action requires these variables.
|
# The `build` action requires these variables.
|
||||||
build_dir: .build
|
build_dir: .build
|
||||||
@@ -87,7 +89,7 @@ jobs:
|
|||||||
clang --version
|
clang --version
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
run : |
|
run : |
|
||||||
echo "${CONAN_GLOBAL_CONF}" > global.conf
|
echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf
|
||||||
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
conan profile show
|
conan profile show
|
||||||
- name: export custom recipes
|
- name: export custom recipes
|
||||||
@@ -96,7 +98,6 @@ jobs:
|
|||||||
conan export --version 1.1.10 external/snappy
|
conan export --version 1.1.10 external/snappy
|
||||||
conan export --version 9.7.3 external/rocksdb
|
conan export --version 9.7.3 external/rocksdb
|
||||||
conan export --version 4.0.3 external/soci
|
conan export --version 4.0.3 external/soci
|
||||||
conan export --version 2.0.8 external/nudb
|
|
||||||
- name: add Ripple Conan remote
|
- name: add Ripple Conan remote
|
||||||
if: env.CONAN_URL != ''
|
if: env.CONAN_URL != ''
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
21
.github/workflows/nix.yml
vendored
21
.github/workflows/nix.yml
vendored
@@ -25,6 +25,8 @@ env:
|
|||||||
CONAN_GLOBAL_CONF: |
|
CONAN_GLOBAL_CONF: |
|
||||||
core.download:parallel={{ os.cpu_count() }}
|
core.download:parallel={{ os.cpu_count() }}
|
||||||
core.upload:parallel={{ os.cpu_count() }}
|
core.upload:parallel={{ os.cpu_count() }}
|
||||||
|
core:default_build_profile=libxrpl
|
||||||
|
core:default_profile=libxrpl
|
||||||
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
||||||
tools.build:verbosity=verbose
|
tools.build:verbosity=verbose
|
||||||
tools.compilation:verbosity=verbose
|
tools.compilation:verbosity=verbose
|
||||||
@@ -91,7 +93,8 @@ jobs:
|
|||||||
env | sort
|
env | sort
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
run: |
|
run: |
|
||||||
echo "${CONAN_GLOBAL_CONF}" >> ${CONAN_HOME}/global.conf
|
echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf
|
||||||
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
conan profile show
|
conan profile show
|
||||||
- name: archive profile
|
- name: archive profile
|
||||||
# Create this archive before dependencies are added to the local cache.
|
# Create this archive before dependencies are added to the local cache.
|
||||||
@@ -164,6 +167,16 @@ jobs:
|
|||||||
generator: Ninja
|
generator: Ninja
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration }}
|
||||||
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
|
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
|
||||||
|
- name: check linking
|
||||||
|
run: |
|
||||||
|
cd ${build_dir}
|
||||||
|
ldd ./rippled
|
||||||
|
if [ "$(ldd ./rippled | grep -E '(libstdc\+\+|libgcc)' | wc -l)" -eq 0 ]; then
|
||||||
|
echo 'The binary is statically linked.'
|
||||||
|
else
|
||||||
|
echo 'The binary is dynamically linked.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
cd ${build_dir}
|
cd ${build_dir}
|
||||||
@@ -220,6 +233,7 @@ jobs:
|
|||||||
cd ${build_dir}
|
cd ${build_dir}
|
||||||
./rippled --unittest --unittest-jobs $(nproc)
|
./rippled --unittest --unittest-jobs $(nproc)
|
||||||
ctest -j $(nproc) --output-on-failure
|
ctest -j $(nproc) --output-on-failure
|
||||||
|
|
||||||
coverage:
|
coverage:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -296,7 +310,6 @@ jobs:
|
|||||||
attempt_limit: 5
|
attempt_limit: 5
|
||||||
attempt_delay: 210000 # in milliseconds
|
attempt_delay: 210000 # in milliseconds
|
||||||
|
|
||||||
|
|
||||||
conan:
|
conan:
|
||||||
needs: dependencies
|
needs: dependencies
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: [self-hosted, heavy]
|
||||||
@@ -313,7 +326,6 @@ jobs:
|
|||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
||||||
with:
|
with:
|
||||||
name: ${{ env.platform }}-${{ env.compiler }}-${{ env.configuration }}
|
name: ${{ env.platform }}-${{ env.compiler }}-${{ env.configuration }}
|
||||||
|
|
||||||
- name: extract cache
|
- name: extract cache
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ${CONAN_HOME}
|
mkdir -p ${CONAN_HOME}
|
||||||
@@ -370,7 +382,8 @@ jobs:
|
|||||||
|
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
run: |
|
run: |
|
||||||
echo "${CONAN_GLOBAL_CONF}" >> ${CONAN_HOME}/global.conf
|
echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf
|
||||||
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
conan profile show
|
conan profile show
|
||||||
- name: build dependencies
|
- name: build dependencies
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
6
.github/workflows/windows.yml
vendored
6
.github/workflows/windows.yml
vendored
@@ -27,6 +27,8 @@ env:
|
|||||||
CONAN_GLOBAL_CONF: |
|
CONAN_GLOBAL_CONF: |
|
||||||
core.download:parallel={{os.cpu_count()}}
|
core.download:parallel={{os.cpu_count()}}
|
||||||
core.upload:parallel={{os.cpu_count()}}
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
|
core:default_build_profile=libxrpl
|
||||||
|
core:default_profile=libxrpl
|
||||||
tools.build:jobs=24
|
tools.build:jobs=24
|
||||||
tools.build:verbosity=verbose
|
tools.build:verbosity=verbose
|
||||||
tools.compilation:verbosity=verbose
|
tools.compilation:verbosity=verbose
|
||||||
@@ -82,8 +84,7 @@ jobs:
|
|||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "${CONAN_GLOBAL_CONF}" > global.conf
|
echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf
|
||||||
mv conan/profiles/libxrpl conan/profiles/default
|
|
||||||
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
conan profile show
|
conan profile show
|
||||||
- name: export custom recipes
|
- name: export custom recipes
|
||||||
@@ -92,7 +93,6 @@ jobs:
|
|||||||
conan export --version 1.1.10 external/snappy
|
conan export --version 1.1.10 external/snappy
|
||||||
conan export --version 9.7.3 external/rocksdb
|
conan export --version 9.7.3 external/rocksdb
|
||||||
conan export --version 4.0.3 external/soci
|
conan export --version 4.0.3 external/soci
|
||||||
conan export --version 2.0.8 external/nudb
|
|
||||||
- name: add Ripple Conan remote
|
- name: add Ripple Conan remote
|
||||||
if: env.CONAN_URL != ''
|
if: env.CONAN_URL != ''
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
17
BUILD.md
17
BUILD.md
@@ -167,8 +167,6 @@ It does not explicitly link the C++ standard library,
|
|||||||
which allows you to statically link it with GCC, if you want.
|
which allows you to statically link it with GCC, if you want.
|
||||||
|
|
||||||
```
|
```
|
||||||
# Conan 1.x
|
|
||||||
conan export external/snappy snappy/1.1.10@
|
|
||||||
# Conan 2.x
|
# Conan 2.x
|
||||||
conan export --version 1.1.10 external/snappy
|
conan export --version 1.1.10 external/snappy
|
||||||
```
|
```
|
||||||
@@ -177,8 +175,6 @@ Export our [Conan recipe for RocksDB](./external/rocksdb).
|
|||||||
It does not override paths to dependencies when building with Visual Studio.
|
It does not override paths to dependencies when building with Visual Studio.
|
||||||
|
|
||||||
```
|
```
|
||||||
# Conan 1.x
|
|
||||||
conan export external/rocksdb rocksdb/9.7.3@
|
|
||||||
# Conan 2.x
|
# Conan 2.x
|
||||||
conan export --version 9.7.3 external/rocksdb
|
conan export --version 9.7.3 external/rocksdb
|
||||||
```
|
```
|
||||||
@@ -187,23 +183,10 @@ Export our [Conan recipe for SOCI](./external/soci).
|
|||||||
It patches their CMake to correctly import its dependencies.
|
It patches their CMake to correctly import its dependencies.
|
||||||
|
|
||||||
```
|
```
|
||||||
# Conan 1.x
|
|
||||||
conan export external/soci soci/4.0.3@
|
|
||||||
# Conan 2.x
|
# Conan 2.x
|
||||||
conan export --version 4.0.3 external/soci
|
conan export --version 4.0.3 external/soci
|
||||||
```
|
```
|
||||||
|
|
||||||
Export our [Conan recipe for NuDB](./external/nudb).
|
|
||||||
It fixes some source files to add missing `#include`s.
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
# Conan 1.x
|
|
||||||
conan export external/nudb nudb/2.0.8@
|
|
||||||
# Conan 2.x
|
|
||||||
conan export --version 2.0.8 external/nudb
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build and Test
|
### Build and Test
|
||||||
|
|
||||||
1. Create a build directory and move into it.
|
1. Create a build directory and move into it.
|
||||||
|
|||||||
@@ -6,10 +6,6 @@
|
|||||||
{% set compiler_version = detect_api.default_compiler_version(compiler, version) %}
|
{% set compiler_version = detect_api.default_compiler_version(compiler, version) %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if os == "Linux" %}
|
|
||||||
include(default)
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
os={{ os }}
|
os={{ os }}
|
||||||
arch={{ arch }}
|
arch={{ arch }}
|
||||||
|
|||||||
16
conanfile.py
16
conanfile.py
@@ -25,9 +25,9 @@ class Xrpl(ConanFile):
|
|||||||
|
|
||||||
requires = [
|
requires = [
|
||||||
'grpc/1.50.1',
|
'grpc/1.50.1',
|
||||||
'libarchive/3.7.6',
|
'libarchive/3.8.1',
|
||||||
'nudb/2.0.8',
|
'nudb/2.0.9',
|
||||||
'openssl/1.1.1v',
|
'openssl/1.1.1w',
|
||||||
'soci/4.0.3',
|
'soci/4.0.3',
|
||||||
'zlib/1.3.1',
|
'zlib/1.3.1',
|
||||||
]
|
]
|
||||||
@@ -37,7 +37,7 @@ class Xrpl(ConanFile):
|
|||||||
]
|
]
|
||||||
|
|
||||||
tool_requires = [
|
tool_requires = [
|
||||||
'protobuf/3.21.9',
|
'protobuf/3.21.12',
|
||||||
]
|
]
|
||||||
|
|
||||||
default_options = {
|
default_options = {
|
||||||
@@ -105,15 +105,15 @@ class Xrpl(ConanFile):
|
|||||||
# Conan 2 requires transitive headers to be specified
|
# Conan 2 requires transitive headers to be specified
|
||||||
transitive_headers_opt = {'transitive_headers': True} if conan_version.split('.')[0] == '2' else {}
|
transitive_headers_opt = {'transitive_headers': True} if conan_version.split('.')[0] == '2' else {}
|
||||||
self.requires('boost/1.83.0', force=True, **transitive_headers_opt)
|
self.requires('boost/1.83.0', force=True, **transitive_headers_opt)
|
||||||
self.requires('date/3.0.3', **transitive_headers_opt)
|
self.requires('date/3.0.4', **transitive_headers_opt)
|
||||||
self.requires('lz4/1.10.0', force=True)
|
self.requires('lz4/1.10.0', force=True)
|
||||||
self.requires('protobuf/3.21.9', force=True)
|
self.requires('protobuf/3.21.12', force=True)
|
||||||
self.requires('sqlite3/3.47.0', force=True)
|
self.requires('sqlite3/3.49.1', force=True)
|
||||||
if self.options.jemalloc:
|
if self.options.jemalloc:
|
||||||
self.requires('jemalloc/5.3.0')
|
self.requires('jemalloc/5.3.0')
|
||||||
if self.options.rocksdb:
|
if self.options.rocksdb:
|
||||||
self.requires('rocksdb/9.7.3')
|
self.requires('rocksdb/9.7.3')
|
||||||
self.requires('xxhash/0.8.2', **transitive_headers_opt)
|
self.requires('xxhash/0.8.3', **transitive_headers_opt)
|
||||||
|
|
||||||
exports_sources = (
|
exports_sources = (
|
||||||
'CMakeLists.txt',
|
'CMakeLists.txt',
|
||||||
|
|||||||
10
external/nudb/conandata.yml
vendored
10
external/nudb/conandata.yml
vendored
@@ -1,10 +0,0 @@
|
|||||||
sources:
|
|
||||||
"2.0.8":
|
|
||||||
url: "https://github.com/CPPAlliance/NuDB/archive/2.0.8.tar.gz"
|
|
||||||
sha256: "9b71903d8ba111cd893ab064b9a8b6ac4124ed8bd6b4f67250205bc43c7f13a8"
|
|
||||||
patches:
|
|
||||||
"2.0.8":
|
|
||||||
- patch_file: "patches/2.0.8-0001-add-include-stdexcept-for-msvc.patch"
|
|
||||||
patch_description: "Fix build for MSVC by including stdexcept"
|
|
||||||
patch_type: "portability"
|
|
||||||
patch_source: "https://github.com/cppalliance/NuDB/pull/100/files"
|
|
||||||
72
external/nudb/conanfile.py
vendored
72
external/nudb/conanfile.py
vendored
@@ -1,72 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
from conan import ConanFile
|
|
||||||
from conan.tools.build import check_min_cppstd
|
|
||||||
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get
|
|
||||||
from conan.tools.layout import basic_layout
|
|
||||||
|
|
||||||
required_conan_version = ">=1.52.0"
|
|
||||||
|
|
||||||
|
|
||||||
class NudbConan(ConanFile):
|
|
||||||
name = "nudb"
|
|
||||||
description = "A fast key/value insert-only database for SSD drives in C++11"
|
|
||||||
license = "BSL-1.0"
|
|
||||||
url = "https://github.com/conan-io/conan-center-index"
|
|
||||||
homepage = "https://github.com/CPPAlliance/NuDB"
|
|
||||||
topics = ("header-only", "KVS", "insert-only")
|
|
||||||
|
|
||||||
package_type = "header-library"
|
|
||||||
settings = "os", "arch", "compiler", "build_type"
|
|
||||||
no_copy_source = True
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _min_cppstd(self):
|
|
||||||
return 11
|
|
||||||
|
|
||||||
def export_sources(self):
|
|
||||||
export_conandata_patches(self)
|
|
||||||
|
|
||||||
def layout(self):
|
|
||||||
basic_layout(self, src_folder="src")
|
|
||||||
|
|
||||||
def requirements(self):
|
|
||||||
self.requires("boost/1.83.0")
|
|
||||||
|
|
||||||
def package_id(self):
|
|
||||||
self.info.clear()
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
if self.settings.compiler.cppstd:
|
|
||||||
check_min_cppstd(self, self._min_cppstd)
|
|
||||||
|
|
||||||
def source(self):
|
|
||||||
get(self, **self.conan_data["sources"][self.version], strip_root=True)
|
|
||||||
|
|
||||||
def build(self):
|
|
||||||
apply_conandata_patches(self)
|
|
||||||
|
|
||||||
def package(self):
|
|
||||||
copy(self, "LICENSE*",
|
|
||||||
dst=os.path.join(self.package_folder, "licenses"),
|
|
||||||
src=self.source_folder)
|
|
||||||
copy(self, "*",
|
|
||||||
dst=os.path.join(self.package_folder, "include"),
|
|
||||||
src=os.path.join(self.source_folder, "include"))
|
|
||||||
|
|
||||||
def package_info(self):
|
|
||||||
self.cpp_info.bindirs = []
|
|
||||||
self.cpp_info.libdirs = []
|
|
||||||
|
|
||||||
self.cpp_info.set_property("cmake_target_name", "NuDB")
|
|
||||||
self.cpp_info.set_property("cmake_target_aliases", ["NuDB::nudb"])
|
|
||||||
self.cpp_info.set_property("cmake_find_mode", "both")
|
|
||||||
|
|
||||||
self.cpp_info.components["core"].set_property("cmake_target_name", "nudb")
|
|
||||||
self.cpp_info.components["core"].names["cmake_find_package"] = "nudb"
|
|
||||||
self.cpp_info.components["core"].names["cmake_find_package_multi"] = "nudb"
|
|
||||||
self.cpp_info.components["core"].requires = ["boost::thread", "boost::system"]
|
|
||||||
|
|
||||||
# TODO: to remove in conan v2 once cmake_find_package_* generators removed
|
|
||||||
self.cpp_info.names["cmake_find_package"] = "NuDB"
|
|
||||||
self.cpp_info.names["cmake_find_package_multi"] = "NuDB"
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
diff --git a/include/nudb/detail/stream.hpp b/include/nudb/detail/stream.hpp
|
|
||||||
index 6c07bf1..e0ce8ed 100644
|
|
||||||
--- a/include/nudb/detail/stream.hpp
|
|
||||||
+++ b/include/nudb/detail/stream.hpp
|
|
||||||
@@ -14,6 +14,7 @@
|
|
||||||
#include <cstdint>
|
|
||||||
#include <cstring>
|
|
||||||
#include <memory>
|
|
||||||
+#include <stdexcept>
|
|
||||||
|
|
||||||
namespace nudb {
|
|
||||||
namespace detail {
|
|
||||||
diff --git a/include/nudb/impl/context.ipp b/include/nudb/impl/context.ipp
|
|
||||||
index beb7058..ffde0b3 100644
|
|
||||||
--- a/include/nudb/impl/context.ipp
|
|
||||||
+++ b/include/nudb/impl/context.ipp
|
|
||||||
@@ -9,6 +9,7 @@
|
|
||||||
#define NUDB_IMPL_CONTEXT_IPP
|
|
||||||
|
|
||||||
#include <nudb/detail/store_base.hpp>
|
|
||||||
+#include <stdexcept>
|
|
||||||
|
|
||||||
namespace nudb {
|
|
||||||
|
|
||||||
@@ -31,38 +31,28 @@ namespace beast {
|
|||||||
|
|
||||||
template <class Generator>
|
template <class Generator>
|
||||||
void
|
void
|
||||||
rngfill(void* buffer, std::size_t bytes, Generator& g)
|
rngfill(void* const buffer, std::size_t const bytes, Generator& g)
|
||||||
{
|
{
|
||||||
using result_type = typename Generator::result_type;
|
using result_type = typename Generator::result_type;
|
||||||
|
constexpr std::size_t result_size = sizeof(result_type);
|
||||||
|
|
||||||
while (bytes >= sizeof(result_type))
|
std::uint8_t* const buffer_start = static_cast<std::uint8_t*>(buffer);
|
||||||
|
std::size_t const complete_iterations = bytes / result_size;
|
||||||
|
std::size_t const bytes_remaining = bytes % result_size;
|
||||||
|
|
||||||
|
for (std::size_t count = 0; count < complete_iterations; ++count)
|
||||||
{
|
{
|
||||||
auto const v = g();
|
result_type const v = g();
|
||||||
std::memcpy(buffer, &v, sizeof(v));
|
std::size_t const offset = count * result_size;
|
||||||
buffer = reinterpret_cast<std::uint8_t*>(buffer) + sizeof(v);
|
std::memcpy(buffer_start + offset, &v, result_size);
|
||||||
bytes -= sizeof(v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XRPL_ASSERT(
|
if (bytes_remaining > 0)
|
||||||
bytes < sizeof(result_type), "beast::rngfill(void*) : maximum bytes");
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
// gcc 11.1 (falsely) warns about an array-bounds overflow in release mode.
|
|
||||||
// gcc 12.1 (also falsely) warns about an string overflow in release mode.
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
||||||
#pragma GCC diagnostic ignored "-Wstringop-overflow"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bytes > 0)
|
|
||||||
{
|
{
|
||||||
auto const v = g();
|
result_type const v = g();
|
||||||
std::memcpy(buffer, &v, bytes);
|
std::size_t const offset = complete_iterations * result_size;
|
||||||
|
std::memcpy(buffer_start + offset, &v, bytes_remaining);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <
|
template <
|
||||||
|
|||||||
@@ -169,6 +169,8 @@ enum warning_code_i {
|
|||||||
warnRPC_AMENDMENT_BLOCKED = 1002,
|
warnRPC_AMENDMENT_BLOCKED = 1002,
|
||||||
warnRPC_EXPIRED_VALIDATOR_LIST = 1003,
|
warnRPC_EXPIRED_VALIDATOR_LIST = 1003,
|
||||||
// unused = 1004
|
// unused = 1004
|
||||||
|
warnRPC_FIELDS_DEPRECATED = 2004, // rippled needs to maintain
|
||||||
|
// compatibility with Clio on this code.
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -711,6 +711,7 @@ class LedgerRPC_test : public beast::unit_test::suite
|
|||||||
env.close();
|
env.close();
|
||||||
|
|
||||||
std::string index;
|
std::string index;
|
||||||
|
int hashesLedgerEntryIndex = -1;
|
||||||
{
|
{
|
||||||
Json::Value jvParams;
|
Json::Value jvParams;
|
||||||
jvParams[jss::ledger_index] = 3u;
|
jvParams[jss::ledger_index] = 3u;
|
||||||
@@ -721,11 +722,27 @@ class LedgerRPC_test : public beast::unit_test::suite
|
|||||||
env.rpc("json", "ledger", to_string(jvParams))[jss::result];
|
env.rpc("json", "ledger", to_string(jvParams))[jss::result];
|
||||||
BEAST_EXPECT(jrr[jss::ledger].isMember(jss::accountState));
|
BEAST_EXPECT(jrr[jss::ledger].isMember(jss::accountState));
|
||||||
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].isArray());
|
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].isArray());
|
||||||
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].size() == 1u);
|
|
||||||
|
for (auto i = 0; i < jrr[jss::ledger][jss::accountState].size();
|
||||||
|
i++)
|
||||||
|
if (jrr[jss::ledger][jss::accountState][i]["LedgerEntryType"] ==
|
||||||
|
jss::LedgerHashes)
|
||||||
|
{
|
||||||
|
index = jrr[jss::ledger][jss::accountState][i]["index"]
|
||||||
|
.asString();
|
||||||
|
hashesLedgerEntryIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto const& object : jrr[jss::ledger][jss::accountState])
|
||||||
|
if (object["LedgerEntryType"] == jss::LedgerHashes)
|
||||||
|
index = object["index"].asString();
|
||||||
|
|
||||||
|
// jss::type is a deprecated field
|
||||||
BEAST_EXPECT(
|
BEAST_EXPECT(
|
||||||
jrr[jss::ledger][jss::accountState][0u]["LedgerEntryType"] ==
|
jrr.isMember(jss::warnings) && jrr[jss::warnings].isArray() &&
|
||||||
jss::LedgerHashes);
|
jrr[jss::warnings].size() == 1 &&
|
||||||
index = jrr[jss::ledger][jss::accountState][0u]["index"].asString();
|
jrr[jss::warnings][0u][jss::id].asInt() ==
|
||||||
|
warnRPC_FIELDS_DEPRECATED);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Json::Value jvParams;
|
Json::Value jvParams;
|
||||||
@@ -737,8 +754,17 @@ class LedgerRPC_test : public beast::unit_test::suite
|
|||||||
env.rpc("json", "ledger", to_string(jvParams))[jss::result];
|
env.rpc("json", "ledger", to_string(jvParams))[jss::result];
|
||||||
BEAST_EXPECT(jrr[jss::ledger].isMember(jss::accountState));
|
BEAST_EXPECT(jrr[jss::ledger].isMember(jss::accountState));
|
||||||
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].isArray());
|
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].isArray());
|
||||||
BEAST_EXPECT(jrr[jss::ledger][jss::accountState].size() == 1u);
|
BEAST_EXPECT(
|
||||||
BEAST_EXPECT(jrr[jss::ledger][jss::accountState][0u] == index);
|
hashesLedgerEntryIndex > 0 &&
|
||||||
|
jrr[jss::ledger][jss::accountState][hashesLedgerEntryIndex] ==
|
||||||
|
index);
|
||||||
|
|
||||||
|
// jss::type is a deprecated field
|
||||||
|
BEAST_EXPECT(
|
||||||
|
jrr.isMember(jss::warnings) && jrr[jss::warnings].isArray() &&
|
||||||
|
jrr[jss::warnings].size() == 1 &&
|
||||||
|
jrr[jss::warnings][0u][jss::id].asInt() ==
|
||||||
|
warnRPC_FIELDS_DEPRECATED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,9 +37,8 @@ struct LedgerFill
|
|||||||
ReadView const& l,
|
ReadView const& l,
|
||||||
RPC::Context* ctx,
|
RPC::Context* ctx,
|
||||||
int o = 0,
|
int o = 0,
|
||||||
std::vector<TxQ::TxDetails> q = {},
|
std::vector<TxQ::TxDetails> q = {})
|
||||||
LedgerEntryType t = ltANY)
|
: ledger(l), options(o), txQueue(std::move(q)), context(ctx)
|
||||||
: ledger(l), options(o), txQueue(std::move(q)), type(t), context(ctx)
|
|
||||||
{
|
{
|
||||||
if (context)
|
if (context)
|
||||||
closeTime = context->ledgerMaster.getCloseTimeBySeq(ledger.seq());
|
closeTime = context->ledgerMaster.getCloseTimeBySeq(ledger.seq());
|
||||||
@@ -58,7 +57,6 @@ struct LedgerFill
|
|||||||
ReadView const& ledger;
|
ReadView const& ledger;
|
||||||
int options;
|
int options;
|
||||||
std::vector<TxQ::TxDetails> txQueue;
|
std::vector<TxQ::TxDetails> txQueue;
|
||||||
LedgerEntryType type;
|
|
||||||
RPC::Context* context;
|
RPC::Context* context;
|
||||||
std::optional<NetClock::time_point> closeTime;
|
std::optional<NetClock::time_point> closeTime;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -268,19 +268,16 @@ fillJsonState(Object& json, LedgerFill const& fill)
|
|||||||
|
|
||||||
for (auto const& sle : ledger.sles)
|
for (auto const& sle : ledger.sles)
|
||||||
{
|
{
|
||||||
if (fill.type == ltANY || sle->getType() == fill.type)
|
if (binary)
|
||||||
{
|
{
|
||||||
if (binary)
|
auto&& obj = appendObject(array);
|
||||||
{
|
obj[jss::hash] = to_string(sle->key());
|
||||||
auto&& obj = appendObject(array);
|
obj[jss::tx_blob] = serializeHex(*sle);
|
||||||
obj[jss::hash] = to_string(sle->key());
|
|
||||||
obj[jss::tx_blob] = serializeHex(*sle);
|
|
||||||
}
|
|
||||||
else if (expanded)
|
|
||||||
array.append(sle->getJson(JsonOptions::none));
|
|
||||||
else
|
|
||||||
array.append(to_string(sle->key()));
|
|
||||||
}
|
}
|
||||||
|
else if (expanded)
|
||||||
|
array.append(sle->getJson(JsonOptions::none));
|
||||||
|
else
|
||||||
|
array.append(to_string(sle->key()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ class ValidatorList
|
|||||||
TimeKeeper& timeKeeper_;
|
TimeKeeper& timeKeeper_;
|
||||||
boost::filesystem::path const dataPath_;
|
boost::filesystem::path const dataPath_;
|
||||||
beast::Journal const j_;
|
beast::Journal const j_;
|
||||||
boost::shared_mutex mutable mutex_;
|
std::shared_mutex mutable mutex_;
|
||||||
using lock_guard = std::lock_guard<decltype(mutex_)>;
|
using lock_guard = std::lock_guard<decltype(mutex_)>;
|
||||||
using shared_lock = std::shared_lock<decltype(mutex_)>;
|
using shared_lock = std::shared_lock<decltype(mutex_)>;
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ private:
|
|||||||
// Node public key of peer.
|
// Node public key of peer.
|
||||||
PublicKey const publicKey_;
|
PublicKey const publicKey_;
|
||||||
std::string name_;
|
std::string name_;
|
||||||
boost::shared_mutex mutable nameMutex_;
|
std::shared_mutex mutable nameMutex_;
|
||||||
|
|
||||||
// The indices of the smallest and largest ledgers this peer has available
|
// The indices of the smallest and largest ledgers this peer has available
|
||||||
//
|
//
|
||||||
@@ -214,7 +214,7 @@ private:
|
|||||||
total_bytes() const;
|
total_bytes() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
boost::shared_mutex mutable mutex_;
|
std::shared_mutex mutable mutex_;
|
||||||
boost::circular_buffer<std::uint64_t> rollingAvg_{30, 0ull};
|
boost::circular_buffer<std::uint64_t> rollingAvg_{30, 0ull};
|
||||||
clock_type::time_point intervalStart_{clock_type::now()};
|
clock_type::time_point intervalStart_{clock_type::now()};
|
||||||
std::uint64_t totalBytes_{0};
|
std::uint64_t totalBytes_{0};
|
||||||
|
|||||||
@@ -54,10 +54,6 @@ LedgerHandler::check()
|
|||||||
bool const binary = params[jss::binary].asBool();
|
bool const binary = params[jss::binary].asBool();
|
||||||
bool const owner_funds = params[jss::owner_funds].asBool();
|
bool const owner_funds = params[jss::owner_funds].asBool();
|
||||||
bool const queue = params[jss::queue].asBool();
|
bool const queue = params[jss::queue].asBool();
|
||||||
auto type = chooseLedgerEntryType(params);
|
|
||||||
if (type.first)
|
|
||||||
return type.first;
|
|
||||||
type_ = type.second;
|
|
||||||
|
|
||||||
options_ = (full ? LedgerFill::full : 0) |
|
options_ = (full ? LedgerFill::full : 0) |
|
||||||
(expand ? LedgerFill::expand : 0) |
|
(expand ? LedgerFill::expand : 0) |
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ private:
|
|||||||
std::vector<TxQ::TxDetails> queueTxs_;
|
std::vector<TxQ::TxDetails> queueTxs_;
|
||||||
Json::Value result_;
|
Json::Value result_;
|
||||||
int options_ = 0;
|
int options_ = 0;
|
||||||
LedgerEntryType type_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -91,7 +90,7 @@ LedgerHandler::writeResult(Object& value)
|
|||||||
if (ledger_)
|
if (ledger_)
|
||||||
{
|
{
|
||||||
Json::copyFrom(value, result_);
|
Json::copyFrom(value, result_);
|
||||||
addJson(value, {*ledger_, &context_, options_, queueTxs_, type_});
|
addJson(value, {*ledger_, &context_, options_, queueTxs_});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -105,6 +104,21 @@ LedgerHandler::writeResult(Object& value)
|
|||||||
addJson(open, {*master.getCurrentLedger(), &context_, 0});
|
addJson(open, {*master.getCurrentLedger(), &context_, 0});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Json::Value warnings{Json::arrayValue};
|
||||||
|
if (context_.params.isMember(jss::type))
|
||||||
|
{
|
||||||
|
Json::Value& w = warnings.append(Json::objectValue);
|
||||||
|
w[jss::id] = warnRPC_FIELDS_DEPRECATED;
|
||||||
|
w[jss::message] =
|
||||||
|
"Some fields from your request are deprecated. Please check the "
|
||||||
|
"documentation at "
|
||||||
|
"https://xrpl.org/docs/references/http-websocket-apis/ "
|
||||||
|
"and update your request. Field `type` is deprecated.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (warnings.size())
|
||||||
|
value[jss::warnings] = std::move(warnings);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace RPC
|
} // namespace RPC
|
||||||
|
|||||||
Reference in New Issue
Block a user