diff --git a/conanfile.py b/conanfile.py index 9da2f057a..de4a8a9ff 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,7 +2,7 @@ class HomestoreConan(ConanFile): name = "homestore" - version = "3.8.6" + version = "3.8.7" homepage = "https://github.corp.ebay.com/SDS/homestore" description = "HomeStore" diff --git a/locks/base.lock b/locks/base.lock index 839ff43ab..9291bb59a 100644 --- a/locks/base.lock +++ b/locks/base.lock @@ -2,7 +2,7 @@ "graph_lock": { "nodes": { "0": { - "ref": "homestore/3.8.6", + "ref": "homestore/3.8.7", "requires": [ "1", "2", diff --git a/locks/debug_deps.lock b/locks/debug_deps.lock index 6a9010012..2d3ea7ad1 100644 --- a/locks/debug_deps.lock +++ b/locks/debug_deps.lock @@ -2,7 +2,7 @@ "graph_lock": { "nodes": { "0": { - "ref": "homestore/3.8.6", + "ref": "homestore/3.8.7", "options": "coverage=False\nfPIC=True\nsanitize=False\nshared=False\nskip_testing=False\ntesting=epoll_mode\nabseil:fPIC=True\nabseil:shared=False\nboost:addr2line_location=/usr/bin/addr2line\nboost:asio_no_deprecated=False\nboost:buildid=None\nboost:bzip2=True\nboost:debug_level=0\nboost:diagnostic_definitions=False\nboost:error_code_header_only=False\nboost:extra_b2_flags=None\nboost:fPIC=True\nboost:filesystem_no_deprecated=False\nboost:filesystem_version=None\nboost:header_only=False\nboost:i18n_backend=deprecated\nboost:i18n_backend_iconv=libc\nboost:i18n_backend_icu=False\nboost:layout=system\nboost:lzma=False\nboost:magic_autolink=False\nboost:multithreading=True\nboost:namespace=boost\nboost:namespace_alias=False\nboost:numa=True\nboost:pch=True\nboost:python_executable=None\nboost:python_version=None\nboost:segmented_stacks=False\nboost:shared=False\nboost:system_no_deprecated=False\nboost:system_use_utf8=False\nboost:visibility=hidden\nboost:with_stacktrace_backtrace=True\nboost:without_atomic=False\nboost:without_chrono=False\nboost:without_container=False\nboost:without_context=False\nboost:without_contract=False\nboost:without_coroutine=False\nboost:without_date_time=False\nboost:without_exception=False\nboost:without_fiber=False\nboost:without_filesystem=False\nboost:without_graph=False\nboost:without_graph_parallel=True\nboost:without_iostreams=False\nboost:without_json=False\nboost:without_locale=False\nboost:without_log=False\nboost:without_math=False\nboost:without_mpi=True\nboost:without_nowide=False\nboost:without_program_options=False\nboost:without_python=True\nboost:without_random=False\nboost:without_regex=False\nboost:without_serialization=False\nboost:without_stacktrace=False\nboost:without_system=False\nboost:without_test=False\nboost:without_thread=False\nboost:without_timer=False\nboost:without_type_erasure=False\nboost:without_wave=False\nboost:zlib=True\nboost:zstd=False\nbreakpad:fPIC=True\nbzip2:build_executable=True\nbzip2:fPIC=True\nbzip2:shared=False\nc-ares:fPIC=True\nc-ares:shared=False\nc-ares:tools=True\ncivetweb:fPIC=True\ncivetweb:shared=False\ncivetweb:ssl_dynamic_loading=False\ncivetweb:with_caching=True\ncivetweb:with_cgi=True\ncivetweb:with_cxx=True\ncivetweb:with_duktape=False\ncivetweb:with_ipv6=True\ncivetweb:with_lua=False\ncivetweb:with_server_stats=False\ncivetweb:with_ssl=True\ncivetweb:with_static_files=True\ncivetweb:with_third_party_output=False\ncivetweb:with_websockets=True\ncivetweb:with_zlib=False\ncpr:fPIC=True\ncpr:shared=False\ncpr:signal=True\ncpr:with_ssl=auto\ncxxopts:unicode=False\ndate:fPIC=True\ndate:header_only=False\ndate:shared=False\ndate:use_system_tz_db=False\ndate:use_tz_db_in_dot=False\ndouble-conversion:fPIC=True\ndouble-conversion:shared=False\ndpdk:fPIC=True\ndpdk:native_build=False\ndpdk:numa=False\ndpdk:shared=False\nfarmhash:fPIC=True\nfarmhash:no_builtin_expect=False\nfarmhash:shared=False\nfio:native_build=False\nflatbuffers:fPIC=True\nflatbuffers:header_only=False\nflatbuffers:shared=False\nfmt:fPIC=True\nfmt:header_only=False\nfmt:shared=False\nfmt:with_fmt_alias=False\nfmt:with_os_api=True\nfolly:fPIC=True\nfolly:shared=False\nfolly:use_sse4_2=False\ngflags:fPIC=True\ngflags:namespace=gflags\ngflags:nothreads=True\ngflags:shared=False\nglog:fPIC=True\nglog:shared=False\nglog:with_gflags=True\nglog:with_threads=True\ngperftools:fPIC=True\ngperftools:shared=False\ngrpc:codegen=True\ngrpc:cpp_plugin=True\ngrpc:csharp_ext=False\ngrpc:csharp_plugin=True\ngrpc:fPIC=True\ngrpc:node_plugin=True\ngrpc:objective_c_plugin=True\ngrpc:php_plugin=True\ngrpc:python_plugin=True\ngrpc:ruby_plugin=True\ngrpc:secure=False\ngrpc:shared=False\niomgr:coverage=False\niomgr:fPIC=True\niomgr:sanitize=False\niomgr:shared=False\niomgr:testing=epoll_mode\nisa-l:fPIC=True\nisa-l:shared=False\nlibbacktrace:fPIC=True\nlibbacktrace:shared=False\nlibcap:fPIC=True\nlibcap:psx_syscals=False\nlibcap:shared=False\nlibcurl:fPIC=True\nlibcurl:shared=False\nlibcurl:with_brotli=False\nlibcurl:with_c_ares=False\nlibcurl:with_ca_bundle=auto\nlibcurl:with_ca_fallback=False\nlibcurl:with_ca_path=auto\nlibcurl:with_cookies=True\nlibcurl:with_crypto_auth=True\nlibcurl:with_dict=True\nlibcurl:with_docs=False\nlibcurl:with_file=True\nlibcurl:with_ftp=True\nlibcurl:with_gopher=True\nlibcurl:with_http=True\nlibcurl:with_imap=True\nlibcurl:with_ipv6=True\nlibcurl:with_largemaxwritesize=False\nlibcurl:with_ldap=False\nlibcurl:with_libgsasl=False\nlibcurl:with_libidn=False\nlibcurl:with_libpsl=False\nlibcurl:with_librtmp=False\nlibcurl:with_libssh2=False\nlibcurl:with_mqtt=True\nlibcurl:with_nghttp2=False\nlibcurl:with_ntlm=True\nlibcurl:with_ntlm_wb=True\nlibcurl:with_pop3=True\nlibcurl:with_proxy=True\nlibcurl:with_rtsp=True\nlibcurl:with_smb=True\nlibcurl:with_smtp=True\nlibcurl:with_ssl=openssl\nlibcurl:with_symbol_hiding=False\nlibcurl:with_telnet=True\nlibcurl:with_tftp=True\nlibcurl:with_threaded_resolver=True\nlibcurl:with_unix_sockets=True\nlibcurl:with_verbose_debug=True\nlibcurl:with_verbose_strings=True\nlibcurl:with_zlib=True\nlibcurl:with_zstd=False\nlibdwarf:fPIC=True\nlibdwarf:shared=False\nlibdwarf:with_dwarfgen=False\nlibelf:fPIC=True\nlibelf:shared=False\nlibevent:disable_threads=False\nlibevent:fPIC=True\nlibevent:shared=False\nlibevent:with_openssl=True\nlibiberty:fPIC=True\nlibmount:fPIC=True\nlibmount:shared=False\nlibselinux:fPIC=True\nlibselinux:shared=False\nlibsodium:PIE=False\nlibsodium:fPIC=True\nlibsodium:shared=False\nlibsodium:use_soname=True\nlibsystemd:fPIC=True\nlibsystemd:shared=False\nlibsystemd:with_lz4=True\nlibsystemd:with_selinux=True\nlibsystemd:with_xz=True\nlibsystemd:with_zstd=True\nlibunwind:coredump=True\nlibunwind:fPIC=True\nlibunwind:minidebuginfo=True\nlibunwind:ptrace=True\nlibunwind:setjmp=True\nlibunwind:shared=False\nlibunwind:zlibdebuginfo=True\nliburing:fPIC=True\nliburing:shared=False\nlibxcrypt:fPIC=True\nlibxcrypt:shared=False\nlz4:fPIC=True\nlz4:shared=False\nopenssl:386=False\nopenssl:enable_trace=False\nopenssl:enable_weak_ssl_ciphers=False\nopenssl:fPIC=True\nopenssl:no_apps=False\nopenssl:no_aria=False\nopenssl:no_asm=False\nopenssl:no_async=False\nopenssl:no_autoload_config=False\nopenssl:no_bf=False\nopenssl:no_blake2=False\nopenssl:no_camellia=False\nopenssl:no_cast=False\nopenssl:no_chacha=False\nopenssl:no_cms=False\nopenssl:no_comp=False\nopenssl:no_ct=False\nopenssl:no_deprecated=False\nopenssl:no_des=False\nopenssl:no_dgram=False\nopenssl:no_dh=False\nopenssl:no_dsa=False\nopenssl:no_dso=False\nopenssl:no_ec=False\nopenssl:no_ecdh=False\nopenssl:no_ecdsa=False\nopenssl:no_engine=False\nopenssl:no_filenames=False\nopenssl:no_fips=False\nopenssl:no_gost=False\nopenssl:no_idea=False\nopenssl:no_legacy=False\nopenssl:no_md2=True\nopenssl:no_md4=False\nopenssl:no_mdc2=False\nopenssl:no_module=False\nopenssl:no_ocsp=False\nopenssl:no_pinshared=False\nopenssl:no_rc2=False\nopenssl:no_rc4=False\nopenssl:no_rc5=False\nopenssl:no_rfc3779=False\nopenssl:no_rmd160=False\nopenssl:no_seed=False\nopenssl:no_sm2=False\nopenssl:no_sm3=False\nopenssl:no_sm4=False\nopenssl:no_sock=False\nopenssl:no_srp=False\nopenssl:no_srtp=False\nopenssl:no_sse2=False\nopenssl:no_ssl=False\nopenssl:no_ssl3=False\nopenssl:no_stdio=False\nopenssl:no_threads=False\nopenssl:no_tls1=False\nopenssl:no_ts=False\nopenssl:no_whirlpool=False\nopenssl:no_zlib=False\nopenssl:openssldir=None\nopenssl:shared=False\nopenssl:tls_security_level=None\npcre2:build_pcre2_16=True\npcre2:build_pcre2_32=True\npcre2:build_pcre2_8=True\npcre2:build_pcre2grep=True\npcre2:fPIC=True\npcre2:grep_support_callout_fork=True\npcre2:link_size=2\npcre2:shared=False\npcre2:support_jit=False\npcre2:with_bzip2=True\npcre2:with_zlib=True\npistache:fPIC=True\npistache:shared=False\npistache:with_ssl=True\nprometheus-cpp:fPIC=True\nprometheus-cpp:shared=False\nprometheus-cpp:with_compression=True\nprometheus-cpp:with_pull=True\nprometheus-cpp:with_push=True\nprotobuf:debug_suffix=True\nprotobuf:fPIC=True\nprotobuf:lite=False\nprotobuf:shared=False\nprotobuf:with_rtti=True\nprotobuf:with_zlib=True\nre2:fPIC=True\nre2:shared=False\nre2:with_icu=False\nsisl:coverage=False\nsisl:fPIC=True\nsisl:malloc_impl=tcmalloc\nsisl:prerelease=True\nsisl:sanitize=False\nsisl:shared=False\nsnappy:fPIC=True\nsnappy:shared=False\nsnappy:with_bmi2=auto\nsnappy:with_ssse3=auto\nspdk:fPIC=True\nspdk:native_build=True\nspdk:shared=False\nspdlog:fPIC=True\nspdlog:header_only=False\nspdlog:no_exceptions=False\nspdlog:shared=False\nspdlog:wchar_filenames=False\nspdlog:wchar_support=False\nuserspace-rcu:fPIC=True\nuserspace-rcu:model=generic\nuserspace-rcu:shared=False\nxz_utils:fPIC=True\nxz_utils:shared=False\nzlib:fPIC=True\nzlib:shared=False\nzmarok-semver:fPIC=True\nzmarok-semver:shared=False\nzstd:fPIC=True\nzstd:shared=False\nzstd:threading=True", "requires": [ "1", diff --git a/locks/release_deps.lock b/locks/release_deps.lock index a0c6dbd71..b20a4bb67 100644 --- a/locks/release_deps.lock +++ b/locks/release_deps.lock @@ -2,7 +2,7 @@ "graph_lock": { "nodes": { "0": { - "ref": "homestore/3.8.6", + "ref": "homestore/3.8.7", "options": "coverage=False\nfPIC=True\nsanitize=False\nshared=False\nskip_testing=False\ntesting=epoll_mode\nabseil:fPIC=True\nabseil:shared=False\nboost:addr2line_location=/usr/bin/addr2line\nboost:asio_no_deprecated=False\nboost:buildid=None\nboost:bzip2=True\nboost:debug_level=0\nboost:diagnostic_definitions=False\nboost:error_code_header_only=False\nboost:extra_b2_flags=None\nboost:fPIC=True\nboost:filesystem_no_deprecated=False\nboost:filesystem_version=None\nboost:header_only=False\nboost:i18n_backend=deprecated\nboost:i18n_backend_iconv=libc\nboost:i18n_backend_icu=False\nboost:layout=system\nboost:lzma=False\nboost:magic_autolink=False\nboost:multithreading=True\nboost:namespace=boost\nboost:namespace_alias=False\nboost:numa=True\nboost:pch=True\nboost:python_executable=None\nboost:python_version=None\nboost:segmented_stacks=False\nboost:shared=False\nboost:system_no_deprecated=False\nboost:system_use_utf8=False\nboost:visibility=hidden\nboost:with_stacktrace_backtrace=True\nboost:without_atomic=False\nboost:without_chrono=False\nboost:without_container=False\nboost:without_context=False\nboost:without_contract=False\nboost:without_coroutine=False\nboost:without_date_time=False\nboost:without_exception=False\nboost:without_fiber=False\nboost:without_filesystem=False\nboost:without_graph=False\nboost:without_graph_parallel=True\nboost:without_iostreams=False\nboost:without_json=False\nboost:without_locale=False\nboost:without_log=False\nboost:without_math=False\nboost:without_mpi=True\nboost:without_nowide=False\nboost:without_program_options=False\nboost:without_python=True\nboost:without_random=False\nboost:without_regex=False\nboost:without_serialization=False\nboost:without_stacktrace=False\nboost:without_system=False\nboost:without_test=False\nboost:without_thread=False\nboost:without_timer=False\nboost:without_type_erasure=False\nboost:without_wave=False\nboost:zlib=True\nboost:zstd=False\nbreakpad:fPIC=True\nbzip2:build_executable=True\nbzip2:fPIC=True\nbzip2:shared=False\nc-ares:fPIC=True\nc-ares:shared=False\nc-ares:tools=True\ncivetweb:fPIC=True\ncivetweb:shared=False\ncivetweb:ssl_dynamic_loading=False\ncivetweb:with_caching=True\ncivetweb:with_cgi=True\ncivetweb:with_cxx=True\ncivetweb:with_duktape=False\ncivetweb:with_ipv6=True\ncivetweb:with_lua=False\ncivetweb:with_server_stats=False\ncivetweb:with_ssl=True\ncivetweb:with_static_files=True\ncivetweb:with_third_party_output=False\ncivetweb:with_websockets=True\ncivetweb:with_zlib=False\ncpr:fPIC=True\ncpr:shared=False\ncpr:signal=True\ncpr:with_ssl=auto\ncxxopts:unicode=False\ndate:fPIC=True\ndate:header_only=False\ndate:shared=False\ndate:use_system_tz_db=False\ndate:use_tz_db_in_dot=False\ndouble-conversion:fPIC=True\ndouble-conversion:shared=False\ndpdk:fPIC=True\ndpdk:native_build=False\ndpdk:numa=False\ndpdk:shared=False\nfarmhash:fPIC=True\nfarmhash:no_builtin_expect=False\nfarmhash:shared=False\nfio:native_build=False\nflatbuffers:fPIC=True\nflatbuffers:header_only=False\nflatbuffers:shared=False\nfmt:fPIC=True\nfmt:header_only=False\nfmt:shared=False\nfmt:with_fmt_alias=False\nfmt:with_os_api=True\nfolly:fPIC=True\nfolly:shared=False\nfolly:use_sse4_2=False\ngflags:fPIC=True\ngflags:namespace=gflags\ngflags:nothreads=True\ngflags:shared=False\nglog:fPIC=True\nglog:shared=False\nglog:with_gflags=True\nglog:with_threads=True\ngperftools:fPIC=True\ngperftools:shared=False\ngrpc:codegen=True\ngrpc:cpp_plugin=True\ngrpc:csharp_ext=False\ngrpc:csharp_plugin=True\ngrpc:fPIC=True\ngrpc:node_plugin=True\ngrpc:objective_c_plugin=True\ngrpc:php_plugin=True\ngrpc:python_plugin=True\ngrpc:ruby_plugin=True\ngrpc:secure=False\ngrpc:shared=False\niomgr:coverage=False\niomgr:fPIC=True\niomgr:sanitize=False\niomgr:shared=False\niomgr:testing=epoll_mode\nisa-l:fPIC=True\nisa-l:shared=False\nlibbacktrace:fPIC=True\nlibbacktrace:shared=False\nlibcap:fPIC=True\nlibcap:psx_syscals=False\nlibcap:shared=False\nlibcurl:fPIC=True\nlibcurl:shared=False\nlibcurl:with_brotli=False\nlibcurl:with_c_ares=False\nlibcurl:with_ca_bundle=auto\nlibcurl:with_ca_fallback=False\nlibcurl:with_ca_path=auto\nlibcurl:with_cookies=True\nlibcurl:with_crypto_auth=True\nlibcurl:with_dict=True\nlibcurl:with_docs=False\nlibcurl:with_file=True\nlibcurl:with_ftp=True\nlibcurl:with_gopher=True\nlibcurl:with_http=True\nlibcurl:with_imap=True\nlibcurl:with_ipv6=True\nlibcurl:with_largemaxwritesize=False\nlibcurl:with_ldap=False\nlibcurl:with_libgsasl=False\nlibcurl:with_libidn=False\nlibcurl:with_libpsl=False\nlibcurl:with_librtmp=False\nlibcurl:with_libssh2=False\nlibcurl:with_mqtt=True\nlibcurl:with_nghttp2=False\nlibcurl:with_ntlm=True\nlibcurl:with_ntlm_wb=True\nlibcurl:with_pop3=True\nlibcurl:with_proxy=True\nlibcurl:with_rtsp=True\nlibcurl:with_smb=True\nlibcurl:with_smtp=True\nlibcurl:with_ssl=openssl\nlibcurl:with_symbol_hiding=False\nlibcurl:with_telnet=True\nlibcurl:with_tftp=True\nlibcurl:with_threaded_resolver=True\nlibcurl:with_unix_sockets=True\nlibcurl:with_verbose_debug=True\nlibcurl:with_verbose_strings=True\nlibcurl:with_zlib=True\nlibcurl:with_zstd=False\nlibdwarf:fPIC=True\nlibdwarf:shared=False\nlibdwarf:with_dwarfgen=False\nlibelf:fPIC=True\nlibelf:shared=False\nlibevent:disable_threads=False\nlibevent:fPIC=True\nlibevent:shared=False\nlibevent:with_openssl=True\nlibiberty:fPIC=True\nlibmount:fPIC=True\nlibmount:shared=False\nlibselinux:fPIC=True\nlibselinux:shared=False\nlibsodium:PIE=False\nlibsodium:fPIC=True\nlibsodium:shared=False\nlibsodium:use_soname=True\nlibsystemd:fPIC=True\nlibsystemd:shared=False\nlibsystemd:with_lz4=True\nlibsystemd:with_selinux=True\nlibsystemd:with_xz=True\nlibsystemd:with_zstd=True\nlibunwind:coredump=True\nlibunwind:fPIC=True\nlibunwind:minidebuginfo=True\nlibunwind:ptrace=True\nlibunwind:setjmp=True\nlibunwind:shared=False\nlibunwind:zlibdebuginfo=True\nliburing:fPIC=True\nliburing:shared=False\nlibxcrypt:fPIC=True\nlibxcrypt:shared=False\nlz4:fPIC=True\nlz4:shared=False\nopenssl:386=False\nopenssl:enable_trace=False\nopenssl:enable_weak_ssl_ciphers=False\nopenssl:fPIC=True\nopenssl:no_apps=False\nopenssl:no_aria=False\nopenssl:no_asm=False\nopenssl:no_async=False\nopenssl:no_autoload_config=False\nopenssl:no_bf=False\nopenssl:no_blake2=False\nopenssl:no_camellia=False\nopenssl:no_cast=False\nopenssl:no_chacha=False\nopenssl:no_cms=False\nopenssl:no_comp=False\nopenssl:no_ct=False\nopenssl:no_deprecated=False\nopenssl:no_des=False\nopenssl:no_dgram=False\nopenssl:no_dh=False\nopenssl:no_dsa=False\nopenssl:no_dso=False\nopenssl:no_ec=False\nopenssl:no_ecdh=False\nopenssl:no_ecdsa=False\nopenssl:no_engine=False\nopenssl:no_filenames=False\nopenssl:no_fips=False\nopenssl:no_gost=False\nopenssl:no_idea=False\nopenssl:no_legacy=False\nopenssl:no_md2=True\nopenssl:no_md4=False\nopenssl:no_mdc2=False\nopenssl:no_module=False\nopenssl:no_ocsp=False\nopenssl:no_pinshared=False\nopenssl:no_rc2=False\nopenssl:no_rc4=False\nopenssl:no_rc5=False\nopenssl:no_rfc3779=False\nopenssl:no_rmd160=False\nopenssl:no_seed=False\nopenssl:no_sm2=False\nopenssl:no_sm3=False\nopenssl:no_sm4=False\nopenssl:no_sock=False\nopenssl:no_srp=False\nopenssl:no_srtp=False\nopenssl:no_sse2=False\nopenssl:no_ssl=False\nopenssl:no_ssl3=False\nopenssl:no_stdio=False\nopenssl:no_threads=False\nopenssl:no_tls1=False\nopenssl:no_ts=False\nopenssl:no_whirlpool=False\nopenssl:no_zlib=False\nopenssl:openssldir=None\nopenssl:shared=False\nopenssl:tls_security_level=None\npcre2:build_pcre2_16=True\npcre2:build_pcre2_32=True\npcre2:build_pcre2_8=True\npcre2:build_pcre2grep=True\npcre2:fPIC=True\npcre2:grep_support_callout_fork=True\npcre2:link_size=2\npcre2:shared=False\npcre2:support_jit=False\npcre2:with_bzip2=True\npcre2:with_zlib=True\npistache:fPIC=True\npistache:shared=False\npistache:with_ssl=True\nprometheus-cpp:fPIC=True\nprometheus-cpp:shared=False\nprometheus-cpp:with_compression=True\nprometheus-cpp:with_pull=True\nprometheus-cpp:with_push=True\nprotobuf:debug_suffix=True\nprotobuf:fPIC=True\nprotobuf:lite=False\nprotobuf:shared=False\nprotobuf:with_rtti=True\nprotobuf:with_zlib=True\nre2:fPIC=True\nre2:shared=False\nre2:with_icu=False\nsisl:coverage=False\nsisl:fPIC=True\nsisl:malloc_impl=tcmalloc\nsisl:prerelease=False\nsisl:sanitize=False\nsisl:shared=False\nsnappy:fPIC=True\nsnappy:shared=False\nsnappy:with_bmi2=auto\nsnappy:with_ssse3=auto\nspdk:fPIC=True\nspdk:native_build=True\nspdk:shared=False\nspdlog:fPIC=True\nspdlog:header_only=False\nspdlog:no_exceptions=False\nspdlog:shared=False\nspdlog:wchar_filenames=False\nspdlog:wchar_support=False\nuserspace-rcu:fPIC=True\nuserspace-rcu:model=generic\nuserspace-rcu:shared=False\nxz_utils:fPIC=True\nxz_utils:shared=False\nzlib:fPIC=True\nzlib:shared=False\nzmarok-semver:fPIC=True\nzmarok-semver:shared=False\nzstd:fPIC=True\nzstd:shared=False\nzstd:threading=True", "requires": [ "1", diff --git a/locks/sanitize_deps.lock b/locks/sanitize_deps.lock index 4328a7ecc..cd3a152be 100644 --- a/locks/sanitize_deps.lock +++ b/locks/sanitize_deps.lock @@ -2,7 +2,7 @@ "graph_lock": { "nodes": { "0": { - "ref": "homestore/3.8.6", + "ref": "homestore/3.8.7", "options": "coverage=False\nfPIC=True\nsanitize=True\nshared=False\nskip_testing=False\ntesting=epoll_mode\nabseil:fPIC=True\nabseil:shared=False\nboost:addr2line_location=/usr/bin/addr2line\nboost:asio_no_deprecated=False\nboost:buildid=None\nboost:bzip2=True\nboost:debug_level=0\nboost:diagnostic_definitions=False\nboost:error_code_header_only=False\nboost:extra_b2_flags=None\nboost:fPIC=True\nboost:filesystem_no_deprecated=False\nboost:filesystem_version=None\nboost:header_only=False\nboost:i18n_backend=deprecated\nboost:i18n_backend_iconv=libc\nboost:i18n_backend_icu=False\nboost:layout=system\nboost:lzma=False\nboost:magic_autolink=False\nboost:multithreading=True\nboost:namespace=boost\nboost:namespace_alias=False\nboost:numa=True\nboost:pch=True\nboost:python_executable=None\nboost:python_version=None\nboost:segmented_stacks=False\nboost:shared=False\nboost:system_no_deprecated=False\nboost:system_use_utf8=False\nboost:visibility=hidden\nboost:with_stacktrace_backtrace=True\nboost:without_atomic=False\nboost:without_chrono=False\nboost:without_container=False\nboost:without_context=False\nboost:without_contract=False\nboost:without_coroutine=False\nboost:without_date_time=False\nboost:without_exception=False\nboost:without_fiber=False\nboost:without_filesystem=False\nboost:without_graph=False\nboost:without_graph_parallel=True\nboost:without_iostreams=False\nboost:without_json=False\nboost:without_locale=False\nboost:without_log=False\nboost:without_math=False\nboost:without_mpi=True\nboost:without_nowide=False\nboost:without_program_options=False\nboost:without_python=True\nboost:without_random=False\nboost:without_regex=False\nboost:without_serialization=False\nboost:without_stacktrace=False\nboost:without_system=False\nboost:without_test=False\nboost:without_thread=False\nboost:without_timer=False\nboost:without_type_erasure=False\nboost:without_wave=False\nboost:zlib=True\nboost:zstd=False\nbreakpad:fPIC=True\nbzip2:build_executable=True\nbzip2:fPIC=True\nbzip2:shared=False\nc-ares:fPIC=True\nc-ares:shared=False\nc-ares:tools=True\ncivetweb:fPIC=True\ncivetweb:shared=False\ncivetweb:ssl_dynamic_loading=False\ncivetweb:with_caching=True\ncivetweb:with_cgi=True\ncivetweb:with_cxx=True\ncivetweb:with_duktape=False\ncivetweb:with_ipv6=True\ncivetweb:with_lua=False\ncivetweb:with_server_stats=False\ncivetweb:with_ssl=True\ncivetweb:with_static_files=True\ncivetweb:with_third_party_output=False\ncivetweb:with_websockets=True\ncivetweb:with_zlib=False\ncpr:fPIC=True\ncpr:shared=False\ncpr:signal=True\ncpr:with_ssl=auto\ncxxopts:unicode=False\ndate:fPIC=True\ndate:header_only=False\ndate:shared=False\ndate:use_system_tz_db=False\ndate:use_tz_db_in_dot=False\ndouble-conversion:fPIC=True\ndouble-conversion:shared=False\ndpdk:fPIC=True\ndpdk:native_build=False\ndpdk:numa=False\ndpdk:shared=False\nfarmhash:fPIC=True\nfarmhash:no_builtin_expect=False\nfarmhash:shared=False\nfio:native_build=False\nflatbuffers:fPIC=True\nflatbuffers:header_only=False\nflatbuffers:shared=False\nfmt:fPIC=True\nfmt:header_only=False\nfmt:shared=False\nfmt:with_fmt_alias=False\nfmt:with_os_api=True\nfolly:fPIC=True\nfolly:shared=False\nfolly:use_sse4_2=False\ngflags:fPIC=True\ngflags:namespace=gflags\ngflags:nothreads=True\ngflags:shared=False\nglog:fPIC=True\nglog:shared=False\nglog:with_gflags=True\nglog:with_threads=True\ngrpc:codegen=True\ngrpc:cpp_plugin=True\ngrpc:csharp_ext=False\ngrpc:csharp_plugin=True\ngrpc:fPIC=True\ngrpc:node_plugin=True\ngrpc:objective_c_plugin=True\ngrpc:php_plugin=True\ngrpc:python_plugin=True\ngrpc:ruby_plugin=True\ngrpc:secure=False\ngrpc:shared=False\niomgr:coverage=False\niomgr:fPIC=True\niomgr:sanitize=False\niomgr:shared=False\niomgr:testing=epoll_mode\nisa-l:fPIC=True\nisa-l:shared=False\nlibbacktrace:fPIC=True\nlibbacktrace:shared=False\nlibcap:fPIC=True\nlibcap:psx_syscals=False\nlibcap:shared=False\nlibcurl:fPIC=True\nlibcurl:shared=False\nlibcurl:with_brotli=False\nlibcurl:with_c_ares=False\nlibcurl:with_ca_bundle=auto\nlibcurl:with_ca_fallback=False\nlibcurl:with_ca_path=auto\nlibcurl:with_cookies=True\nlibcurl:with_crypto_auth=True\nlibcurl:with_dict=True\nlibcurl:with_docs=False\nlibcurl:with_file=True\nlibcurl:with_ftp=True\nlibcurl:with_gopher=True\nlibcurl:with_http=True\nlibcurl:with_imap=True\nlibcurl:with_ipv6=True\nlibcurl:with_largemaxwritesize=False\nlibcurl:with_ldap=False\nlibcurl:with_libgsasl=False\nlibcurl:with_libidn=False\nlibcurl:with_libpsl=False\nlibcurl:with_librtmp=False\nlibcurl:with_libssh2=False\nlibcurl:with_mqtt=True\nlibcurl:with_nghttp2=False\nlibcurl:with_ntlm=True\nlibcurl:with_ntlm_wb=True\nlibcurl:with_pop3=True\nlibcurl:with_proxy=True\nlibcurl:with_rtsp=True\nlibcurl:with_smb=True\nlibcurl:with_smtp=True\nlibcurl:with_ssl=openssl\nlibcurl:with_symbol_hiding=False\nlibcurl:with_telnet=True\nlibcurl:with_tftp=True\nlibcurl:with_threaded_resolver=True\nlibcurl:with_unix_sockets=True\nlibcurl:with_verbose_debug=True\nlibcurl:with_verbose_strings=True\nlibcurl:with_zlib=True\nlibcurl:with_zstd=False\nlibdwarf:fPIC=True\nlibdwarf:shared=False\nlibdwarf:with_dwarfgen=False\nlibelf:fPIC=True\nlibelf:shared=False\nlibevent:disable_threads=False\nlibevent:fPIC=True\nlibevent:shared=False\nlibevent:with_openssl=True\nlibiberty:fPIC=True\nlibmount:fPIC=True\nlibmount:shared=False\nlibselinux:fPIC=True\nlibselinux:shared=False\nlibsodium:PIE=False\nlibsodium:fPIC=True\nlibsodium:shared=False\nlibsodium:use_soname=True\nlibsystemd:fPIC=True\nlibsystemd:shared=False\nlibsystemd:with_lz4=True\nlibsystemd:with_selinux=True\nlibsystemd:with_xz=True\nlibsystemd:with_zstd=True\nlibunwind:coredump=True\nlibunwind:fPIC=True\nlibunwind:minidebuginfo=True\nlibunwind:ptrace=True\nlibunwind:setjmp=True\nlibunwind:shared=False\nlibunwind:zlibdebuginfo=True\nliburing:fPIC=True\nliburing:shared=False\nlibxcrypt:fPIC=True\nlibxcrypt:shared=False\nlz4:fPIC=True\nlz4:shared=False\nopenssl:386=False\nopenssl:enable_trace=False\nopenssl:enable_weak_ssl_ciphers=False\nopenssl:fPIC=True\nopenssl:no_apps=False\nopenssl:no_aria=False\nopenssl:no_asm=False\nopenssl:no_async=False\nopenssl:no_autoload_config=False\nopenssl:no_bf=False\nopenssl:no_blake2=False\nopenssl:no_camellia=False\nopenssl:no_cast=False\nopenssl:no_chacha=False\nopenssl:no_cms=False\nopenssl:no_comp=False\nopenssl:no_ct=False\nopenssl:no_deprecated=False\nopenssl:no_des=False\nopenssl:no_dgram=False\nopenssl:no_dh=False\nopenssl:no_dsa=False\nopenssl:no_dso=False\nopenssl:no_ec=False\nopenssl:no_ecdh=False\nopenssl:no_ecdsa=False\nopenssl:no_engine=False\nopenssl:no_filenames=False\nopenssl:no_fips=False\nopenssl:no_gost=False\nopenssl:no_idea=False\nopenssl:no_legacy=False\nopenssl:no_md2=True\nopenssl:no_md4=False\nopenssl:no_mdc2=False\nopenssl:no_module=False\nopenssl:no_ocsp=False\nopenssl:no_pinshared=False\nopenssl:no_rc2=False\nopenssl:no_rc4=False\nopenssl:no_rc5=False\nopenssl:no_rfc3779=False\nopenssl:no_rmd160=False\nopenssl:no_seed=False\nopenssl:no_sm2=False\nopenssl:no_sm3=False\nopenssl:no_sm4=False\nopenssl:no_sock=False\nopenssl:no_srp=False\nopenssl:no_srtp=False\nopenssl:no_sse2=False\nopenssl:no_ssl=False\nopenssl:no_ssl3=False\nopenssl:no_stdio=False\nopenssl:no_threads=False\nopenssl:no_tls1=False\nopenssl:no_ts=False\nopenssl:no_whirlpool=False\nopenssl:no_zlib=False\nopenssl:openssldir=None\nopenssl:shared=False\nopenssl:tls_security_level=None\npcre2:build_pcre2_16=True\npcre2:build_pcre2_32=True\npcre2:build_pcre2_8=True\npcre2:build_pcre2grep=True\npcre2:fPIC=True\npcre2:grep_support_callout_fork=True\npcre2:link_size=2\npcre2:shared=False\npcre2:support_jit=False\npcre2:with_bzip2=True\npcre2:with_zlib=True\npistache:fPIC=True\npistache:shared=False\npistache:with_ssl=True\nprometheus-cpp:fPIC=True\nprometheus-cpp:shared=False\nprometheus-cpp:with_compression=True\nprometheus-cpp:with_pull=True\nprometheus-cpp:with_push=True\nprotobuf:debug_suffix=True\nprotobuf:fPIC=True\nprotobuf:lite=False\nprotobuf:shared=False\nprotobuf:with_rtti=True\nprotobuf:with_zlib=True\nre2:fPIC=True\nre2:shared=False\nre2:with_icu=False\nsisl:coverage=False\nsisl:fPIC=True\nsisl:malloc_impl=libc\nsisl:prerelease=True\nsisl:sanitize=False\nsisl:shared=False\nsnappy:fPIC=True\nsnappy:shared=False\nsnappy:with_bmi2=auto\nsnappy:with_ssse3=auto\nspdk:fPIC=True\nspdk:native_build=True\nspdk:shared=False\nspdlog:fPIC=True\nspdlog:header_only=False\nspdlog:no_exceptions=False\nspdlog:shared=False\nspdlog:wchar_filenames=False\nspdlog:wchar_support=False\nuserspace-rcu:fPIC=True\nuserspace-rcu:model=generic\nuserspace-rcu:shared=False\nxz_utils:fPIC=True\nxz_utils:shared=False\nzlib:fPIC=True\nzlib:shared=False\nzmarok-semver:fPIC=True\nzmarok-semver:shared=False\nzstd:fPIC=True\nzstd:shared=False\nzstd:threading=True", "requires": [ "1", diff --git a/src/api/vol_interface.hpp b/src/api/vol_interface.hpp index 53627911b..2ccec9541 100644 --- a/src/api/vol_interface.hpp +++ b/src/api/vol_interface.hpp @@ -316,7 +316,7 @@ class VolInterface { virtual const char* get_name(const VolumePtr& vol) = 0; virtual uint64_t get_size(const VolumePtr& vol) = 0; - virtual std::map get_used_size(const VolumePtr& vol) = 0; + virtual std::map< boost::uuids::uuid, uint64_t > get_used_size(const VolumePtr& vol) = 0; virtual uint64_t get_page_size(const VolumePtr& vol) = 0; virtual boost::uuids::uuid get_uuid(std::shared_ptr< Volume > vol) = 0; virtual sisl::blob at_offset(const boost::intrusive_ptr< BlkBuffer >& buf, uint32_t offset) = 0; diff --git a/src/engine/blkalloc/blk_allocator.h b/src/engine/blkalloc/blk_allocator.h index 09857b613..042bc7693 100644 --- a/src/engine/blkalloc/blk_allocator.h +++ b/src/engine/blkalloc/blk_allocator.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -134,7 +135,7 @@ struct blk_alloc_hints { is_contiguous{false}, multiplier{1}, max_blks_per_entry{BlkId::max_blks_in_op()}, - stream_info{(uintptr_t) nullptr} {} + stream_info{(uintptr_t)nullptr} {} blk_temp_t desired_temp; // Temperature hint for the device uint32_t dev_id_hint; // which physical device to pick (hint if any) -1 for don't care @@ -342,6 +343,21 @@ class BlkAllocator { std::atomic< bool > is_disk_bm_dirty{true}; // initially disk_bm treated as dirty }; +class FixedBlkAllocMetrics : public sisl::MetricsGroup { +public: + explicit FixedBlkAllocMetrics(const char* const inst_name) : sisl::MetricsGroup("FixedBlkAlloc", inst_name) { + REGISTER_COUNTER(num_alloc, "Number of blks alloc attempts"); + REGISTER_COUNTER(num_alloc_failure, "Number of blk alloc failures"); + REGISTER_GAUGE(blk_alloc_memory_size, "Memory used by block allocator internal structures in bytes"); + register_me_to_farm(); + } + FixedBlkAllocMetrics(const FixedBlkAllocMetrics&) = delete; + FixedBlkAllocMetrics(FixedBlkAllocMetrics&&) noexcept = delete; + FixedBlkAllocMetrics& operator=(const FixedBlkAllocMetrics&) = delete; + FixedBlkAllocMetrics& operator=(FixedBlkAllocMetrics&&) noexcept = delete; + ~FixedBlkAllocMetrics() { deregister_me_from_farm(); } +}; + /* FixedBlkAllocator is a fast allocator where it allocates only 1 size block and ALL free blocks are cached instead * of selectively caching few blks which are free. Thus there is no sweeping of bitmap or other to refill the cache. * It does not support temperature of blocks and allocates simply on first come first serve basis @@ -372,6 +388,7 @@ class FixedBlkAllocator : public BlkAllocator { private: folly::MPMCQueue< BlkId > m_blk_q; + FixedBlkAllocMetrics m_metrics; }; } // namespace homestore diff --git a/src/engine/blkalloc/blk_cache_queue.cpp b/src/engine/blkalloc/blk_cache_queue.cpp index 6af2b23dd..a2644acde 100644 --- a/src/engine/blkalloc/blk_cache_queue.cpp +++ b/src/engine/blkalloc/blk_cache_queue.cpp @@ -19,7 +19,7 @@ #include "blk_cache_queue.h" namespace homestore { -FreeBlkCacheQueue::FreeBlkCacheQueue(const SlabCacheConfig& cfg, BlkAllocMetrics* const metrics) : +FreeBlkCacheQueue::FreeBlkCacheQueue(const SlabCacheConfig& cfg, VarsizeBlkAllocMetrics* const metrics) : m_cfg{cfg}, m_metrics{metrics} { #ifndef NDEBUG blk_count_t slab_size{1}; @@ -176,6 +176,14 @@ blk_cap_t FreeBlkCacheQueue::total_free_blks() const { return count; } +blk_cap_t FreeBlkCacheQueue::total_slab_capacity() const { + blk_cap_t count{0}; + for (const auto& sq : m_slab_queues) { + count += sq->entry_capacity(); + } + return count; +} + BlkAllocStatus FreeBlkCacheQueue::try_alloc_in_slab(const slab_idx_t slab_idx, const blk_cache_alloc_req& req, blk_cache_alloc_resp& resp) { if (resp.nblks_alloced >= req.nblks) { return BlkAllocStatus::SUCCESS; } @@ -294,7 +302,7 @@ std::optional< blk_temp_t > FreeBlkCacheQueue::pop_slab(const slab_idx_t slab_id } SlabCacheQueue::SlabCacheQueue(const blk_count_t slab_size, const std::vector< blk_cap_t >& level_limits, - const float refill_pct, BlkAllocMetrics* parent_metrics) : + const float refill_pct, VarsizeBlkAllocMetrics* parent_metrics) : m_slab_size{slab_size}, m_metrics{m_slab_size, this, parent_metrics} { for (auto& limit : level_limits) { auto ptr{std::make_unique< folly::MPMCQueue< blk_cache_entry > >(limit)}; @@ -306,8 +314,8 @@ SlabCacheQueue::SlabCacheQueue(const blk_count_t slab_size, const std::vector< b } std::optional< blk_temp_t > SlabCacheQueue::push(const blk_cache_entry& entry, const bool only_this_level) { - const blk_temp_t start_level{ - static_cast< blk_temp_t >((entry.get_temperature() >= m_level_queues.size()) ? m_level_queues.size() - 1 : entry.get_temperature())}; + const blk_temp_t start_level{static_cast< blk_temp_t >( + (entry.get_temperature() >= m_level_queues.size()) ? m_level_queues.size() - 1 : entry.get_temperature())}; blk_temp_t level{start_level}; bool pushed{m_level_queues[start_level]->write(entry)}; @@ -370,7 +378,8 @@ void SlabCacheQueue::close_session(const uint64_t session_id) { m_refill_session.compare_exchange_strong(expected_session_id, 0, std::memory_order_acq_rel); } -SlabMetrics::SlabMetrics(const blk_count_t slab_size, SlabCacheQueue* const slab_queue, BlkAllocMetrics* const parent) : +SlabMetrics::SlabMetrics(const blk_count_t slab_size, SlabCacheQueue* const slab_queue, + VarsizeBlkAllocMetrics* const parent) : sisl::MetricsGroup{"SlabMetrics", fmt::format("{}_slab_{:03d}", parent->instance_name(), slab_size)}, m_slab_queue{slab_queue} { REGISTER_COUNTER(num_slab_alloc, "Number of alloc attempts in this slab"); diff --git a/src/engine/blkalloc/blk_cache_queue.h b/src/engine/blkalloc/blk_cache_queue.h index b00b6e13d..30137695a 100644 --- a/src/engine/blkalloc/blk_cache_queue.h +++ b/src/engine/blkalloc/blk_cache_queue.h @@ -29,10 +29,10 @@ namespace homestore { class SlabCacheQueue; -class BlkAllocMetrics; +class VarsizeBlkAllocMetrics; class SlabMetrics : public sisl::MetricsGroup { public: - SlabMetrics(const blk_count_t slab_size, SlabCacheQueue* const slab_queue, BlkAllocMetrics* const parent); + SlabMetrics(const blk_count_t slab_size, SlabCacheQueue* const slab_queue, VarsizeBlkAllocMetrics* const parent); SlabMetrics(const SlabMetrics&) = delete; SlabMetrics(SlabMetrics&&) noexcept = delete; SlabMetrics& operator=(const SlabMetrics&) = delete; @@ -48,7 +48,7 @@ class SlabMetrics : public sisl::MetricsGroup { class SlabCacheQueue { public: SlabCacheQueue(const blk_count_t slab_size, const std::vector< blk_cap_t >& level_limits, const float refill_pct, - BlkAllocMetrics* metrics); + VarsizeBlkAllocMetrics* metrics); SlabCacheQueue(const SlabCacheQueue&) = delete; SlabCacheQueue(SlabCacheQueue&&) noexcept = delete; SlabCacheQueue& operator=(const SlabCacheQueue&) = delete; @@ -82,7 +82,7 @@ class SlabCacheQueue { class FreeBlkCacheQueue : public FreeBlkCache { public: - FreeBlkCacheQueue(const SlabCacheConfig& cfg, BlkAllocMetrics* metrics); + FreeBlkCacheQueue(const SlabCacheConfig& cfg, VarsizeBlkAllocMetrics* metrics); virtual ~FreeBlkCacheQueue() override = default; FreeBlkCacheQueue(FreeBlkCacheQueue&&) noexcept = delete; FreeBlkCacheQueue& operator=(const FreeBlkCacheQueue&) = delete; @@ -97,6 +97,7 @@ class FreeBlkCacheQueue : public FreeBlkCache { blk_cache_fill_session& fill_session) override; [[nodiscard]] blk_cap_t total_free_blks() const override; + [[nodiscard]] blk_cap_t total_slab_capacity() const; [[nodiscard]] std::shared_ptr< blk_cache_fill_session > create_cache_fill_session(const bool fill_entire_cache); void close_cache_fill_session(blk_cache_fill_session& fill_session); @@ -121,7 +122,7 @@ class FreeBlkCacheQueue : public FreeBlkCache { private: std::vector< std::unique_ptr< SlabCacheQueue > > m_slab_queues; SlabCacheConfig m_cfg; - BlkAllocMetrics* m_metrics; + VarsizeBlkAllocMetrics* m_metrics; }; } // namespace homestore diff --git a/src/engine/blkalloc/fixed_blk_allocator.cpp b/src/engine/blkalloc/fixed_blk_allocator.cpp index 9e8d9d827..6040c5931 100644 --- a/src/engine/blkalloc/fixed_blk_allocator.cpp +++ b/src/engine/blkalloc/fixed_blk_allocator.cpp @@ -22,7 +22,10 @@ namespace homestore { FixedBlkAllocator::FixedBlkAllocator(const BlkAllocConfig& cfg, const bool init, const chunk_num_t chunk_id) : - BlkAllocator(cfg, chunk_id), m_blk_q{cfg.get_total_blks()} { + BlkAllocator(cfg, chunk_id), m_blk_q{cfg.get_total_blks()}, m_metrics{cfg.get_name().c_str()} { + // folly::MPMCQueue slot for BlkId: 6B item + 6B MPMC sequence field = 12B (confirmed via GDB) + static constexpr uint64_t k_mpmc_slot_bytes{12}; + GAUGE_UPDATE(m_metrics, blk_alloc_memory_size, m_blk_q.capacity() * k_mpmc_slot_bytes); LOGINFO("total blks: {}", cfg.get_total_blks()); if (init) { inited(); } } @@ -72,8 +75,12 @@ BlkAllocStatus FixedBlkAllocator::alloc(const blk_count_t nblks, const blk_alloc } BlkAllocStatus FixedBlkAllocator::alloc(BlkId& out_blkid) { + COUNTER_INCREMENT(m_metrics, num_alloc, 1); #ifdef _PRERELEASE - if (homestore_flip->test_flip("fixed_blkalloc_no_blks")) { return BlkAllocStatus::SPACE_FULL; } + if (homestore_flip->test_flip("fixed_blkalloc_no_blks")) { + COUNTER_INCREMENT(m_metrics, num_alloc_failure, 1); + return BlkAllocStatus::SPACE_FULL; + } #endif const auto ret{m_blk_q.read(out_blkid)}; if (ret) { @@ -81,6 +88,7 @@ BlkAllocStatus FixedBlkAllocator::alloc(BlkId& out_blkid) { alloc_on_realtime(out_blkid); return BlkAllocStatus::SUCCESS; } else { + COUNTER_INCREMENT(m_metrics, num_alloc_failure, 1); return BlkAllocStatus::SPACE_FULL; } } diff --git a/src/engine/blkalloc/test_blk_cache_queue.cpp b/src/engine/blkalloc/test_blk_cache_queue.cpp index 622fcdaf7..c64b81546 100644 --- a/src/engine/blkalloc/test_blk_cache_queue.cpp +++ b/src/engine/blkalloc/test_blk_cache_queue.cpp @@ -34,7 +34,7 @@ SISL_LOGGING_INIT(HOMESTORE_LOG_MODS) using namespace homestore; -std::unique_ptr< BlkAllocMetrics > g_metrics; +std::unique_ptr< VarsizeBlkAllocMetrics > g_metrics; struct BlkCacheQueueTest : public ::testing::Test { protected: @@ -52,8 +52,8 @@ struct BlkCacheQueueTest : public ::testing::Test { virtual ~BlkCacheQueueTest() override = default; protected: - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; void SetUp(const uint32_t nslabs, const uint32_t count_per_slab) { m_nslabs = nslabs; @@ -286,7 +286,7 @@ int main(int argc, char* argv[]) { sisl::logging::SetLogger("test_blkalloc"); spdlog::set_pattern("[%D %T%z] [%^%l%$] [%n] [%t] %v"); - g_metrics = std::make_unique< BlkAllocMetrics >("BlkCacheQueueTest"); + g_metrics = std::make_unique< VarsizeBlkAllocMetrics >("BlkCacheQueueTest"); const int result{RUN_ALL_TESTS()}; g_metrics.reset(); return result; diff --git a/src/engine/blkalloc/test_blkalloc.cpp b/src/engine/blkalloc/test_blkalloc.cpp index e965ebd2d..86159e5df 100644 --- a/src/engine/blkalloc/test_blkalloc.cpp +++ b/src/engine/blkalloc/test_blkalloc.cpp @@ -380,8 +380,8 @@ struct FixedBlkAllocatorTest : public ::testing::Test, BlkAllocatorTest { FixedBlkAllocatorTest& operator=(FixedBlkAllocatorTest&&) noexcept = delete; virtual ~FixedBlkAllocatorTest() override = default; - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; [[nodiscard]] bool alloc_blk(const BlkAllocStatus exp_status, BlkId& bid, const bool track_block_group) { const auto ret{m_allocator->alloc(bid)}; @@ -425,8 +425,8 @@ struct VarsizeBlkAllocatorTest : public ::testing::Test, BlkAllocatorTest { VarsizeBlkAllocatorTest& operator=(VarsizeBlkAllocatorTest&&) noexcept = delete; virtual ~VarsizeBlkAllocatorTest() override = default; - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; void create_allocator(const bool use_slabs = true) { VarsizeBlkAllocConfig cfg{4096, 4096, 4096u, static_cast< uint64_t >(m_total_count) * 4096, "", false}; diff --git a/src/engine/blkalloc/varsize_blk_allocator.cpp b/src/engine/blkalloc/varsize_blk_allocator.cpp index 874d4680f..dd7971a0e 100644 --- a/src/engine/blkalloc/varsize_blk_allocator.cpp +++ b/src/engine/blkalloc/varsize_blk_allocator.cpp @@ -75,6 +75,11 @@ VarsizeBlkAllocator::VarsizeBlkAllocator(const VarsizeBlkAllocConfig& cfg, const if (m_cfg.get_use_slabs()) { m_fb_cache = std::make_unique< FreeBlkCacheQueue >(cfg.m_slab_config, &m_metrics); + // folly::MPMCQueue slot for blk_cache_entry: 6B item + 6B MPMC sequence field = 12B (confirmed via GDB) + static constexpr uint64_t k_mpmc_slot_bytes{12}; + const auto* q{static_cast< FreeBlkCacheQueue* >(m_fb_cache.get())}; + GAUGE_UPDATE(m_metrics, blk_alloc_memory_size, q->total_slab_capacity() * k_mpmc_slot_bytes); + LOGINFO("m_fb_cache total free blks: {}", m_fb_cache->total_free_blks()); } diff --git a/src/engine/blkalloc/varsize_blk_allocator.h b/src/engine/blkalloc/varsize_blk_allocator.h index 456902e47..0fc04bf70 100644 --- a/src/engine/blkalloc/varsize_blk_allocator.h +++ b/src/engine/blkalloc/varsize_blk_allocator.h @@ -42,6 +42,7 @@ typedef blk_num_t seg_num_t; class VarsizeBlkAllocConfig : public BlkAllocConfig { friend class VarsizeBlkAllocator; + private: uint32_t m_phys_page_size; seg_num_t m_nsegments; @@ -188,14 +189,15 @@ class BlkAllocSegment { [[nodiscard]] seg_num_t get_seg_num() const { return m_seg_num; } }; -class BlkAllocMetrics : public sisl::MetricsGroup { +class VarsizeBlkAllocMetrics : public sisl::MetricsGroup { public: - explicit BlkAllocMetrics(const char* const inst_name) : sisl::MetricsGroup("BlkAlloc", inst_name) { + explicit VarsizeBlkAllocMetrics(const char* const inst_name) : sisl::MetricsGroup("VarsizeBlkAlloc", inst_name) { REGISTER_COUNTER(num_alloc, "Number of blks alloc attempts"); REGISTER_COUNTER(num_alloc_failure, "Number of blk alloc failures"); REGISTER_COUNTER(num_alloc_partial, "Number of blk alloc partial allocations"); REGISTER_COUNTER(num_retries, "Number of times it retried because of empty cache"); REGISTER_COUNTER(num_blks_alloc_direct, "Number of blks alloc attempt directly because of empty cache"); + REGISTER_GAUGE(blk_alloc_memory_size, "Memory used by block allocator internal structures in bytes"); #ifndef NDEBUG REGISTER_HISTOGRAM(frag_pct_distribution, "Distribution of fragmentation percentage", HistogramBucketsType(LinearUpto64Buckets)); @@ -203,11 +205,11 @@ class BlkAllocMetrics : public sisl::MetricsGroup { register_me_to_farm(); } - BlkAllocMetrics(const BlkAllocMetrics&) = delete; - BlkAllocMetrics(BlkAllocMetrics&&) noexcept = delete; - BlkAllocMetrics& operator=(const BlkAllocMetrics&) = delete; - BlkAllocMetrics& operator=(BlkAllocMetrics&&) noexcept = delete; - ~BlkAllocMetrics() { deregister_me_from_farm(); } + VarsizeBlkAllocMetrics(const VarsizeBlkAllocMetrics&) = delete; + VarsizeBlkAllocMetrics(VarsizeBlkAllocMetrics&&) noexcept = delete; + VarsizeBlkAllocMetrics& operator=(const VarsizeBlkAllocMetrics&) = delete; + VarsizeBlkAllocMetrics& operator=(VarsizeBlkAllocMetrics&&) noexcept = delete; + ~VarsizeBlkAllocMetrics() { deregister_me_from_farm(); } }; /* VarsizeBlkAllocator provides a flexibility in allocation. It provides following features: @@ -270,7 +272,7 @@ class VarsizeBlkAllocator : public BlkAllocator { std::shared_ptr< blk_cache_fill_session > m_cur_fill_session; // Cache fill requirements while sweeping std::uniform_int_distribution< blk_num_t > m_rand_portion_num_generator; - BlkAllocMetrics m_metrics; + VarsizeBlkAllocMetrics m_metrics; // TODO: this fields needs to be passed in from hints and persisted in volume's sb; blk_num_t m_start_portion_num{INVALID_PORTION_NUM}; diff --git a/src/engine/blkstore/blkbuffer.hpp b/src/engine/blkstore/blkbuffer.hpp index 65b7ade56..f97e9095c 100644 --- a/src/engine/blkstore/blkbuffer.hpp +++ b/src/engine/blkstore/blkbuffer.hpp @@ -38,7 +38,7 @@ class BlkBuffer : public CacheBuffer< BlkId > { BlkBuffer& operator=(BlkBuffer&&) noexcept = delete; virtual ~BlkBuffer() override = default; - virtual void init() override{}; + virtual void init() override {}; template < typename... Args > static BlkBuffer* make_object(Args&&... args) { diff --git a/src/engine/blkstore/blkstore.hpp b/src/engine/blkstore/blkstore.hpp index b9a658360..3b28757be 100644 --- a/src/engine/blkstore/blkstore.hpp +++ b/src/engine/blkstore/blkstore.hpp @@ -168,8 +168,10 @@ class BlkStoreMetrics : public sisl::MetricsGroupWrapper { HistogramBucketsType(LinearUpto64Buckets)) REGISTER_HISTOGRAM(blkstore_cache_read_latency, "BlkStore cache read latency"); REGISTER_HISTOGRAM(blkstore_cache_write_latency, "BlkStore cache write latency"); - REGISTER_HISTOGRAM(blkstore_drive_write_latency, "BlkStore drive write latency", HistogramBucketsType(OpLatecyBuckets)); - REGISTER_HISTOGRAM(blkstore_drive_read_latency, "BlkStore drive read latency", HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(blkstore_drive_write_latency, "BlkStore drive write latency", + HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(blkstore_drive_read_latency, "BlkStore drive read latency", + HistogramBucketsType(OpLatecyBuckets)); register_me_to_farm(); } diff --git a/src/engine/cache/cache.h b/src/engine/cache/cache.h index 41279ceb3..fa44fac24 100644 --- a/src/engine/cache/cache.h +++ b/src/engine/cache/cache.h @@ -67,7 +67,7 @@ class CacheRecord : public homeds::HashNode, sisl::ObjLifeCounter< CacheRecord > /* Number of entries we ideally want to have per hash bucket. This number if small, will reduce contention and * speed of read/writes, but at the cost of increased memory */ -//#define ENTRIES_PER_BUCKET 2 +// #define ENTRIES_PER_BUCKET 2 /* Number of eviction partitions. More the partitions better the parallelization of requests, but lesser the * effectiveness of cache, since it could get evicted sooner than expected, if distribution of key hashing is not @@ -422,7 +422,17 @@ class CacheBuffer : public CacheRecord { static uint32_t get_size(const CurrentEvictor::EvictRecordType* const rec) { const CacheBufferType* cbuf{static_cast< CacheBufferType* >(rec->cache_buffer)}; - return cbuf->get_cache_size(); + // Actual memory cost per cached entry includes overhead beyond the raw data buffer: + // sizeof(CacheBufferType): CacheBuffer base class + derived class (e.g., BtreeNode) members + // sizeof(homeds::MemVector): MemVector object holding buffer metadata (80 bytes measured via GDB) + // sizeof(homeds::MemPiece): MemPiece[1] array for contiguous buffer tracking (32 bytes, tcmalloc rounds + // 18→32) + // m_cache_size tracks only the raw data buffer (e.g., 512B or 4096B for btree nodes) + // For btree nodes, empirical validation via GDB: 832B total = 512B data + 320B overhead + // This formula ensures cache_size metric and eviction threshold reflect true RSS cost + static constexpr uint32_t k_overhead{sizeof(CacheBufferType) + sizeof(homeds::MemVector) + + sizeof(homeds::MemPiece)}; + return cbuf->get_cache_size() + k_overhead; } }; diff --git a/src/engine/cache/test_cache.cpp b/src/engine/cache/test_cache.cpp index cdbdb162a..dd16387fb 100644 --- a/src/engine/cache/test_cache.cpp +++ b/src/engine/cache/test_cache.cpp @@ -89,9 +89,9 @@ struct CacheTest : public ::testing::Test { virtual ~CacheTest() override { m_cache.reset(); } - virtual void SetUp() override{}; + virtual void SetUp() override {}; - virtual void TearDown() override{}; + virtual void TearDown() override {}; [[nodiscard]] bool insert_one(const uint64_t id, const uint32_t size) { boost::intrusive_ptr< homestore::CacheBuffer< blk_id > > cbuf; diff --git a/src/engine/cache/unused/evictable_mem_alloc.cpp b/src/engine/cache/unused/evictable_mem_alloc.cpp index 97d285522..a25b523f8 100644 --- a/src/engine/cache/unused/evictable_mem_alloc.cpp +++ b/src/engine/cache/unused/evictable_mem_alloc.cpp @@ -22,8 +22,7 @@ namespace omstore { template < ssize_t MinAllocSize > EvictableMemAllocator::EvictableMemAllocator(uint64_t mem_size, CanEvictCallback& can_evict_cb, AllocEvictCallback& alloc_cb) : - m_evict_cb(can_evict_cb), - m_alloc_cb(alloc_cb) { + m_evict_cb(can_evict_cb), m_alloc_cb(alloc_cb) { // First add all entries as max alloc cbs m_buf = std::make_unique< uint8_t[] >(mem_size); @@ -61,9 +60,7 @@ bool EvictableMemAllocator::alloc(uint32_t size, uint32_t max_pieces, EvictRecor } } - if (!found) { - throw std::bad_alloc(); - } + if (!found) { throw std::bad_alloc(); } return found; } diff --git a/src/engine/cache/unused/evictable_mem_alloc.h b/src/engine/cache/unused/evictable_mem_alloc.h index c9c74ff0c..725b12be7 100644 --- a/src/engine/cache/unused/evictable_mem_alloc.h +++ b/src/engine/cache/unused/evictable_mem_alloc.h @@ -26,7 +26,7 @@ namespace omstore { -#define round_off(val, rnd) ((((val)-1) / (rnd)) + 1) +#define round_off(val, rnd) ((((val) - 1) / (rnd)) + 1) template < int SizeMultiplier > struct MemPiece { diff --git a/src/engine/cache/unused/eviction.cpp b/src/engine/cache/unused/eviction.cpp index 3d671be81..9bc479b33 100644 --- a/src/engine/cache/unused/eviction.cpp +++ b/src/engine/cache/unused/eviction.cpp @@ -26,11 +26,7 @@ namespace homestore { template < typename EvictionPolicy > Evictor< EvictionPolicy >::Evictor(uint64_t max_size, Evictor< EvictionPolicy >::CanEvictCallback cb, Evictor< EvictionPolicy >::GetSizeCallback gs_cb) : - m_evict_policy(cb, gs_cb), - m_can_evict_cb(cb), - m_get_size_cb(gs_cb), - m_cur_size(0), - m_max_size(max_size) {} + m_evict_policy(cb, gs_cb), m_can_evict_cb(cb), m_get_size_cb(gs_cb), m_cur_size(0), m_max_size(max_size) {} template < typename EvictionPolicy > EvictRecord* Evictor< EvictionPolicy >::add_record(EvictRecord& r) { diff --git a/src/engine/common/homestore_utils.cpp b/src/engine/common/homestore_utils.cpp index fa60cbb3a..29f56a08c 100644 --- a/src/engine/common/homestore_utils.cpp +++ b/src/engine/common/homestore_utils.cpp @@ -90,15 +90,12 @@ std::string hs_utils::encodeBase64(const uint8_t* first, std::size_t size) { return encoded.append(bytes_to_pad, '='); } -std::string hs_utils::encodeBase64(const sisl::byte_view& b){ - return encodeBase64(b.bytes(), b.size()); -} +std::string hs_utils::encodeBase64(const sisl::byte_view& b) { return encodeBase64(b.bytes(), b.size()); } -template -void hs_utils::decodeBase64(const std::string &encoded_data, T out) -{ +template < typename T > +void hs_utils::decodeBase64(const std::string& encoded_data, T out) { using BinaryFromBase64 = boost::archive::iterators::transform_width< - boost::archive::iterators::binary_from_base64, + boost::archive::iterators::binary_from_base64< std::string::const_iterator >, 8, // get a view of 8 bit 6 // from a sequence of 6 bit >; @@ -107,14 +104,13 @@ void hs_utils::decodeBase64(const std::string &encoded_data, T out) std::replace(begin(unpadded_data), end(unpadded_data), '=', 'A'); // A_64 == \0 std::string decoded_data{BinaryFromBase64{begin(unpadded_data)}, - BinaryFromBase64{begin(unpadded_data) + unpadded_data.length()}}; + BinaryFromBase64{begin(unpadded_data) + unpadded_data.length()}}; decoded_data.erase(end(decoded_data) - bytes_to_pad, end(decoded_data)); std::copy(begin(decoded_data), end(decoded_data), out); } -std::string hs_utils::decodeBase64(const std::string &encoded_data) -{ +std::string hs_utils::decodeBase64(const std::string& encoded_data) { std::string rv; decodeBase64(encoded_data, std::back_inserter(rv)); return rv; diff --git a/src/engine/common/homestore_utils.hpp b/src/engine/common/homestore_utils.hpp index b1313df96..967fbea9b 100644 --- a/src/engine/common/homestore_utils.hpp +++ b/src/engine/common/homestore_utils.hpp @@ -40,8 +40,9 @@ class hs_utils { static hs_uuid_t gen_system_uuid(); static std::string encodeBase64(const uint8_t* first, std::size_t size); static std::string encodeBase64(const sisl::byte_view& b); - template static void decodeBase64(const std::string &encoded_data, T out); - static std::string decodeBase64(const std::string &encoded_data); + template < typename T > + static void decodeBase64(const std::string& encoded_data, T out); + static std::string decodeBase64(const std::string& encoded_data); }; static constexpr hs_uuid_t INVALID_SYSTEM_UUID{0}; diff --git a/src/engine/device/device.h b/src/engine/device/device.h index aa5d38281..8e7dc06fd 100644 --- a/src/engine/device/device.h +++ b/src/engine/device/device.h @@ -450,8 +450,10 @@ class PhysicalDevMetrics : public sisl::MetricsGroupWrapper { REGISTER_COUNTER(drive_spurios_events, "Total number of spurious events per drive"); REGISTER_COUNTER(drive_skipped_chunk_bm_writes, "Total number of skipped writes for chunk bitmap"); - REGISTER_HISTOGRAM(drive_write_latency, "BlkStore drive write latency in us", HistogramBucketsType(OpLatecyBuckets)); - REGISTER_HISTOGRAM(drive_read_latency, "BlkStore drive read latency in us", HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(drive_write_latency, "BlkStore drive write latency in us", + HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(drive_read_latency, "BlkStore drive read latency in us", + HistogramBucketsType(OpLatecyBuckets)); REGISTER_HISTOGRAM(write_io_sizes, "Write IO Sizes", "io_sizes", {"io_direction", "write"}, HistogramBucketsType(ExponentialOfTwoBuckets)); diff --git a/src/engine/homeds/btree/btree.hpp b/src/engine/homeds/btree/btree.hpp index 9cfb309cf..18abd369b 100644 --- a/src/engine/homeds/btree/btree.hpp +++ b/src/engine/homeds/btree/btree.hpp @@ -742,14 +742,51 @@ class Btree { * @return : true if btree is not corrupted. * false if btree is corrupted; */ - bool verify_tree(bool update_debug_bm) { + bool verify_tree(bool update_debug_bm, bool recursive = false) { m_btree_lock.read_lock(); - bool ret = verify_node(m_root_node, nullptr, -1, update_debug_bm); + LOGINFO("Starting btree verification for: {}", m_btree_cfg.get_name()); + bool ret = verify_node(m_root_node, nullptr, -1, update_debug_bm, recursive); m_btree_lock.unlock(); - + LOGINFO("Completed btree verification for: {}, result={}", m_btree_cfg.get_name(), ret); return ret; } + /** + * @brief Statistics from release_cached_tree() + */ + struct EvictionStats { + uint64_t total_nodes_checked; + uint64_t nodes_evicted; + uint64_t nodes_with_refs; + uint64_t nodes_dirty; + uint64_t nodes_locked; + uint64_t nodes_not_in_cache; + + EvictionStats() : + total_nodes_checked(0), + nodes_evicted(0), + nodes_with_refs(0), + nodes_dirty(0), + nodes_locked(0), + nodes_not_in_cache(0) {} + }; + + EvictionStats release_cached_tree() { + EvictionStats stats; + + LOGINFO("RELEASE_CACHE: Starting safe cache release for btree: {}", m_btree_cfg.get_name()); + + m_btree_lock.read_lock(); + release_cached_nodes_recursive(m_root_node, stats); + m_btree_lock.unlock(); + + LOGINFO("RELEASE_CACHE: Completed for btree: {} - total={} evicted={} with_refs={} not_in_cache={}", + m_btree_cfg.get_name(), stats.total_nodes_checked, stats.nodes_evicted, stats.nodes_with_refs, + stats.nodes_not_in_cache); + + return stats; + } + /** * @brief : get the status of this btree; * @@ -1149,6 +1186,14 @@ class Btree { nlohmann::json get_metrics_in_json(bool updated = true) { return m_metrics.get_result_in_json(updated); } private: + bool verify_node(bnodeid_t bnodeid, BtreeNodePtr parent_node, uint32_t indx, bool update_debug_bm, + bool recursive = false) { + if (recursive) { + return verify_node_recursive(bnodeid, parent_node, indx, update_debug_bm); + } else { + return verify_node_fowarding(bnodeid, parent_node, indx, update_debug_bm); + } + } /** * @brief : verify the btree node is corrupted or not; * @@ -1162,7 +1207,7 @@ class Btree { * @return : true if this node including all its children are not corrupted; * false if not; */ - bool verify_node(bnodeid_t bnodeid, BtreeNodePtr parent_node, uint32_t indx, bool update_debug_bm) { + bool verify_node_recursive(bnodeid_t bnodeid, BtreeNodePtr parent_node, uint32_t indx, bool update_debug_bm) { homeds::thread::locktype acq_lock = homeds::thread::locktype::LOCKTYPE_READ; BtreeNodePtr my_node; if (read_and_lock_node(bnodeid, my_node, acq_lock, acq_lock, nullptr) != btree_status_t::success) { @@ -1183,7 +1228,7 @@ class Btree { if (!my_node->is_leaf()) { BtreeNodeInfo child; my_node->get(i, &child, false); - success = verify_node(child.bnode_id(), my_node, i, update_debug_bm); + success = verify_node_recursive(child.bnode_id(), my_node, i, update_debug_bm); if (!success) { goto exit_on_error; } if (i > 0) { @@ -1261,7 +1306,8 @@ class Btree { } if (my_node->has_valid_edge()) { - success = verify_node(my_node->get_edge_id(), my_node, my_node->get_total_entries(), update_debug_bm); + success = + verify_node_recursive(my_node->get_edge_id(), my_node, my_node->get_total_entries(), update_debug_bm); if (!success) { goto exit_on_error; } } @@ -1269,6 +1315,226 @@ class Btree { unlock_node(my_node, acq_lock); return success; } + /** + * @brief : Iterative btree verification - avoids holding ancestor locks during subtree traversal + * + * This iterative implementation releases each node's lock and reference immediately after + * processing, rather than holding them on the call stack during recursion. Benefits: + * - Reduces lock contention: ancestor nodes unlocked while processing descendants + * - Enables cache eviction during traversal: ref_count drops to 1 immediately per node + * - Lower peak stack depth for deep trees + * + * Note: This does NOT solve cross-volume cache accumulation during recovery. When multiple + * volumes are verified sequentially, cache accumulation occurs across volumes, not within + * a single volume's traversal. The solution is force_evict() after each volume completes. + * + * @param bnodeid : node id + * @param parent_node : parent node ptr (unused in iterative - parent info passed via queue) + * @param indx : index within parent (unused in iterative) + * @param update_debug_bm : true or false + * + * @return : true if this node including all its children are not corrupted; false if not + */ + bool verify_node_fowarding(bnodeid_t bnodeid, BtreeNodePtr parent_node, uint32_t indx, bool update_debug_bm) { + struct NodeToVerify { + bnodeid_t node_id; + uint32_t parent_index; + bool has_parent; + K parent_key; + K parent_prev_key; + uint32_t parent_total_entries; + bool validate_with_parent; + + NodeToVerify(bnodeid_t nid, uint32_t idx, bool hp, const K* pkey, const K* pprev, uint32_t ptotal, + bool validate) : + node_id(nid), + parent_index(idx), + has_parent(hp), + parent_total_entries(ptotal), + validate_with_parent(validate) { + if (pkey) parent_key = *pkey; + if (pprev) parent_prev_key = *pprev; + } + }; + + std::queue< NodeToVerify > work_queue; + work_queue.push(NodeToVerify(bnodeid, indx, false, nullptr, nullptr, 0, false)); + + while (!work_queue.empty()) { + NodeToVerify current = work_queue.front(); + work_queue.pop(); + + homeds::thread::locktype acq_lock = homeds::thread::locktype::LOCKTYPE_READ; + BtreeNodePtr my_node; + + if (read_and_lock_node(current.node_id, my_node, acq_lock, acq_lock, nullptr) != btree_status_t::success) { + LOGERROR("VERIFY_NODE_FAIL: read_and_lock_node failed for node_id={}", current.node_id); + return false; + } + + if (update_debug_bm && + (btree_store_t::update_debug_bm(m_btree_store.get(), my_node) != btree_status_t::success)) { + LOGERROR("bitmap update failed for node {}", my_node->to_string()); + unlock_node(my_node, acq_lock); + return false; + } + + K prev_key; + + for (uint32_t i = 0; i < my_node->get_total_entries(); ++i) { + K key; + my_node->get_nth_key(i, &key, false); + + if (!my_node->is_leaf()) { + BtreeNodeInfo child; + my_node->get(i, &child, false); + + K* pprev = (i > 0) ? &prev_key : nullptr; + bool validate = (my_node->get_total_entries() != i); + + work_queue.push( + NodeToVerify(child.bnode_id(), i, true, &key, pprev, my_node->get_total_entries(), validate)); + + if (i > 0) { + BT_LOG_ASSERT_CMP(prev_key.compare(&key), <, 0, my_node); + if (prev_key.compare(&key) >= 0) { + LOGERROR( + "VERIFY_NODE_FAIL: Interior node key ordering violation at index {}: prev_key >= key", + i); + unlock_node(my_node, acq_lock); + return false; + } + } + } + + if (my_node->is_leaf() && i > 0) { + BT_LOG_ASSERT_CMP(prev_key.compare_start(&key), <, 0, my_node); + if (prev_key.compare_start(&key) >= 0) { + LOGERROR("VERIFY_NODE_FAIL: Leaf node key ordering violation at index {}: " + "prev_key.compare_start(key) >= 0", + i); + unlock_node(my_node, acq_lock); + return false; + } + } + prev_key = key; + } + + if (current.has_parent && current.validate_with_parent && my_node->get_total_entries() > 0) { + K last_key; + my_node->get_nth_key(my_node->get_total_entries() - 1, &last_key, false); + + if (!my_node->is_leaf()) { + if (last_key.compare(¤t.parent_key) != 0) { + LOGERROR("Interior node last key {} != parent key {}", last_key.to_string(), + current.parent_key.to_string()); + unlock_node(my_node, acq_lock); + return false; + } + } else { + if (last_key.compare(¤t.parent_key) > 0) { + LOGERROR("Leaf node last key {} > parent key {}", last_key.to_string(), + current.parent_key.to_string()); + unlock_node(my_node, acq_lock); + return false; + } + if (current.parent_key.compare_start(&last_key) < 0) { + LOGERROR("Parent key compare_start with last key failed"); + unlock_node(my_node, acq_lock); + return false; + } + } + } + + if (current.has_parent && current.parent_index != 0 && my_node->get_total_entries() > 0) { + K first_key; + my_node->get_nth_key(0, &first_key, false); + + if (first_key.compare(¤t.parent_prev_key) <= 0) { + LOGERROR("First key {} <= parent prev key {}", first_key.to_string(), + current.parent_prev_key.to_string()); + unlock_node(my_node, acq_lock); + return false; + } + + if (current.parent_prev_key.compare_start(&first_key) >= 0) { + LOGERROR("Parent prev key compare_start with first key failed"); + unlock_node(my_node, acq_lock); + return false; + } + } + + if (my_node->has_valid_edge()) { + K last_key; + my_node->get_nth_key(my_node->get_total_entries() - 1, &last_key, false); + work_queue.push(NodeToVerify(my_node->get_edge_id(), my_node->get_total_entries(), true, &last_key, + &last_key, my_node->get_total_entries(), false)); + } + + unlock_node(my_node, acq_lock); + } + + return true; + } + + void release_cached_nodes_recursive(bnodeid_t root_bnodeid, EvictionStats& stats) { + std::queue< bnodeid_t > work_queue; + work_queue.push(root_bnodeid); + + while (!work_queue.empty()) { + bnodeid_t current_id = work_queue.front(); + work_queue.pop(); + + stats.total_nodes_checked++; + + BtreeNodePtr my_node; + homeds::thread::locktype acq_lock = homeds::thread::locktype::LOCKTYPE_READ; + + if (read_and_lock_node(current_id, my_node, acq_lock, acq_lock, nullptr) != btree_status_t::success) { + stats.nodes_not_in_cache++; + continue; + } + + std::vector< bnodeid_t > child_ids; + if (!my_node->is_leaf()) { + for (uint32_t i = 0; i < my_node->get_total_entries(); ++i) { + BtreeNodeInfo child; + my_node->get(i, &child, false); + child_ids.push_back(child.bnode_id()); + } + if (my_node->has_valid_edge()) { child_ids.push_back(my_node->get_edge_id()); } + } + + for (const auto& child_id : child_ids) { + work_queue.push(child_id); + } + + unlock_node(my_node, acq_lock); + my_node.reset(); + + BtreeNodePtr check_node; + if (read_and_lock_node(current_id, check_node, acq_lock, acq_lock, nullptr) == btree_status_t::success) { + if constexpr (BtreeStoreType == btree_store_type::SSD_BTREE) { + unlock_node(check_node, acq_lock); + check_node.reset(); + + const uint32_t node_size = m_btree_store->get_node_size(); + bool evicted = btree_store_t::free_node_from_cache(current_id, node_size); + + if (evicted) { + stats.nodes_evicted++; + } else { + stats.nodes_with_refs++; + } + } else { + stats.nodes_with_refs++; + unlock_node(check_node, acq_lock); + } + } else { + stats.nodes_evicted++; + } + } + } void to_string(bnodeid_t bnodeid, std::string& buf) { BtreeNodePtr node; diff --git a/src/engine/homeds/btree/btree_internal.h b/src/engine/homeds/btree/btree_internal.h index bc7d8c395..18894a425 100644 --- a/src/engine/homeds/btree/btree_internal.h +++ b/src/engine/homeds/btree/btree_internal.h @@ -108,7 +108,7 @@ struct blkalloc_cp_id; #define BT_DBG_ASSERT_CMP(...) BT_ASSERT_CMP(DEBUG_ASSERT_CMP, ##__VA_ARGS__) #define BT_REL_ASSERT_CMP(...) BT_ASSERT_CMP(RELEASE_ASSERT_CMP, ##__VA_ARGS__) #define BT_LOG_ASSERT_CMP(...) BT_ASSERT_CMP(RELEASE_ASSERT_CMP, ##__VA_ARGS__) -//#define BT_LOG_ASSERT_CMP(...) BT_ASSERT_CMP(LOGMSG, ##__VA_ARGS__) +// #define BT_LOG_ASSERT_CMP(...) BT_ASSERT_CMP(LOGMSG, ##__VA_ARGS__) #define MAX_ADJANCENT_INDEX 3 @@ -152,7 +152,7 @@ struct btree_cp : public boost::intrusive_ref_counter< btree_cp > { seq_id_t end_seqid = -1; // inclusive cp_comp_callback cb; homestore::blkid_list_ptr free_blkid_list; - btree_cp() : ref_cnt(1), btree_size(0){}; + btree_cp() : ref_cnt(1), btree_size(0) {}; ~btree_cp() {} std::string to_string() const { @@ -453,7 +453,7 @@ struct BtreeQueryCursor { return b; }; - BtreeQueryCursor(){}; + BtreeQueryCursor() {}; std::string to_string() const { if (m_last_key) { return (m_last_key->to_string()); diff --git a/src/engine/homeds/btree/btree_node.h b/src/engine/homeds/btree/btree_node.h index 56bac878d..5b7230975 100644 --- a/src/engine/homeds/btree/btree_node.h +++ b/src/engine/homeds/btree/btree_node.h @@ -45,7 +45,7 @@ struct transient_hdr_t { , is_lock(-1) #endif - {}; + {}; }; template < btree_node_type NodeType, typename K, typename V > diff --git a/src/engine/homeds/btree/mem_btree.hpp b/src/engine/homeds/btree/mem_btree.hpp index 279dd435b..956c77f0e 100644 --- a/src/engine/homeds/btree/mem_btree.hpp +++ b/src/engine/homeds/btree/mem_btree.hpp @@ -72,7 +72,7 @@ class MemBtreeStore { return nullptr; } static void create_done(MemBtreeStore* store, bnodeid_t m_root_node); - static void update_sb(MemBtreeStore* store, btree_super_block& sb, btree_cp_sb* cp_sb, bool is_recovery){}; + static void update_sb(MemBtreeStore* store, btree_super_block& sb, btree_cp_sb* cp_sb, bool is_recovery) {}; static boost::intrusive_ptr< MemBtreeNode > alloc_node(MemBtreeStore* store, bool is_leaf, diff --git a/src/engine/homeds/btree/prefix_node.hpp b/src/engine/homeds/btree/prefix_node.hpp index 19fe714ae..256a1be09 100644 --- a/src/engine/homeds/btree/prefix_node.hpp +++ b/src/engine/homeds/btree/prefix_node.hpp @@ -45,9 +45,7 @@ class BtreePrefixNode : public BtreeAbstractNode { for (uint16_t i = ind; i < getTotalEntries(); i++) { BtreePrefixRecord* rec = getRecordPtr(ind); uint16_t prefixInd = rec->getPrefixRecordIndex(); - if (prefixInd >= ind) { - rec->setPrefixRecordIndex(prefixInd + 1); - } + if (prefixInd >= ind) { rec->setPrefixRecordIndex(prefixInd + 1); } rec->getDataOffset() } diff --git a/src/engine/homeds/btree/ssd_btree.hpp b/src/engine/homeds/btree/ssd_btree.hpp index 086e1e830..522570453 100644 --- a/src/engine/homeds/btree/ssd_btree.hpp +++ b/src/engine/homeds/btree/ssd_btree.hpp @@ -458,6 +458,30 @@ class SSDBtreeStore { store->get_wb_cache()->free_blk(bn->get_node_id(), free_blkid_list, store->get_node_size()); } + static bool free_node_from_cache(bnodeid_t node_id, uint32_t node_size) { + homestore::BlkId bid(node_id); + + auto req = writeback_req_t::make_request(); + req->isSyncCall = true; + auto buf = m_blkstore->read(bid, 0, node_size, req, true); + + if (!buf) { return true; } + + if (!buf->try_lock()) { + buf.reset(); + return false; + } + buf->unlock(); + buf.reset(); + + m_blkstore->free_blk(bid, boost::none, boost::none, true); + + auto verify_req = writeback_req_t::make_request(); + verify_req->isSyncCall = true; + auto verify_buf = m_blkstore->read(bid, 0, node_size, verify_req, true); + return (verify_buf == nullptr); + } + static void ref_node(SSDBtreeNode* const bn) { // ref base class homestore::CacheBuffer< homestore::BlkId >::ref( diff --git a/src/engine/homeds/btree/writeBack_cache.hpp b/src/engine/homeds/btree/writeBack_cache.hpp index d22a3f3c1..bbec46876 100644 --- a/src/engine/homeds/btree/writeBack_cache.hpp +++ b/src/engine/homeds/btree/writeBack_cache.hpp @@ -131,7 +131,7 @@ class WriteBackCacheBuffer : public CacheBuffer< homestore::BlkId > { bcp(nullptr), req_q(), dependent_cnt(1), - m_mem(nullptr){}; + m_mem(nullptr) {}; }; //*************************************************** WriteBackCacheBuffer ******************************* @@ -537,7 +537,7 @@ class WriteBackCache : public std::enable_shared_from_this< WriteBackCache< K, V // we are done with this wb_req HS_REL_ASSERT_EQ(wb_req, wb_req->bn->req[cp_id]); wb_req->bn->req[cp_id] = nullptr; - + /* req and btree node are pointing to each other which is preventing neither of them to be freed */ wb_req->bn = nullptr; diff --git a/src/engine/homeds/loadgen/loadgen.hpp b/src/engine/homeds/loadgen/loadgen.hpp index f1b7c4633..244a60c3a 100644 --- a/src/engine/homeds/loadgen/loadgen.hpp +++ b/src/engine/homeds/loadgen/loadgen.hpp @@ -34,7 +34,7 @@ #include #include -//#include "iomgr_executor.hpp" +// #include "iomgr_executor.hpp" #include "keyset.hpp" #include "loadgen_common.hpp" diff --git a/src/engine/homeds/memory/chunk_allocator.hpp b/src/engine/homeds/memory/chunk_allocator.hpp index 2c51aa379..25c82e5d5 100644 --- a/src/engine/homeds/memory/chunk_allocator.hpp +++ b/src/engine/homeds/memory/chunk_allocator.hpp @@ -93,7 +93,7 @@ class ChunkMemAllocator : public AbstractMemAllocator { } virtual ~ChunkMemAllocator() { - if (m_base_ptr) { delete[](m_base_ptr); } + if (m_base_ptr) { delete[] (m_base_ptr); } } // Provides the metadata blk size. This metadata blk can be used by the caller to put anything it wants after diff --git a/src/engine/homeds/memory/memory.old/chunk_allocator2.hpp b/src/engine/homeds/memory/memory.old/chunk_allocator2.hpp index 5eff92c9d..028fef8a2 100644 --- a/src/engine/homeds/memory/memory.old/chunk_allocator2.hpp +++ b/src/engine/homeds/memory/memory.old/chunk_allocator2.hpp @@ -78,9 +78,7 @@ class ChunkMemAllocator { } virtual ~ChunkMemAllocator() { - if (m_base_ptr) { - delete[](m_base_ptr); - } + if (m_base_ptr) { delete[] (m_base_ptr); } } // Provides the metadata blk size. This metadata blk can be used by the caller to put anything it wants after @@ -96,24 +94,18 @@ class ChunkMemAllocator { uint8_t* allocate(uint32_t size_needed, uint8_t** meta_blk = nullptr) { MemBlk blk; - if (size_needed > ChunkSize) { - return nullptr; - } + if (size_needed > ChunkSize) { return nullptr; } chunk_pool_header* hdr = nullptr; hdr = alloc_header(); - if (hdr == nullptr) { - return hdr; - } + if (hdr == nullptr) { return hdr; } #ifdef CHUNK_MEMPOOL_DEBUG printf("%p: ChunkMemAllocator: %p Alloc id=0x%x refcnt=%d size=%u top=0x%llx\n", pthread_self(), this, hdr->id, hdr->refcnt.load(), m_entrySize, m_top.load()); #endif - if (meta_blk) { - *meta_blk = (uint8_t*)hdr; - } + if (meta_blk) { *meta_blk = (uint8_t*)hdr; } return hdr_to_mem(hdr); } @@ -148,9 +140,7 @@ class ChunkMemAllocator { top_id = m_top.load(std::memory_order_release); uint32_t id = get_id_from_top_id(top_id); - if (id == CHUNKID_INVALID) { - return nullptr; - } + if (id == CHUNKID_INVALID) { return nullptr; } hdr = id_to_hdr(id); uint32_t gen = m_gen.fetch_add(1, std::memory_order_acq_rel); diff --git a/src/engine/homeds/memory/memory.old/mem_allocator.hpp b/src/engine/homeds/memory/memory.old/mem_allocator.hpp index 18985c5a0..7d298c18b 100644 --- a/src/engine/homeds/memory/memory.old/mem_allocator.hpp +++ b/src/engine/homeds/memory/memory.old/mem_allocator.hpp @@ -133,16 +133,12 @@ class mem_allocator { //// Fast_Mempool related methods. These are unsafe methods ///// void free(mempool_header* hdr) { fast_mempool* pool = get_owner_pool(hdr); - if (pool) { - return pool->free(hdr); - } + if (pool) { return pool->free(hdr); } } mem_id_t to_id(uint8_t* mem) { fast_mempool* pool = get_owner_pool(mem); - if (pool) { - return pool->to_mem_id(mem); - } + if (pool) { return pool->to_mem_id(mem); } return mem_id_t::form(INVALID_MEM_ID); } @@ -198,9 +194,7 @@ class mem_allocator { mempool* get_owner_pool(uint8_t* mem) { for (auto i = 0; i < m_pools.size(); i++) { - if (m_pools[i].pool->owns(mem)) { - return (m_pools[i].pool); - } + if (m_pools[i].pool->owns(mem)) { return (m_pools[i].pool); } } return nullptr; } @@ -213,9 +207,7 @@ class mem_allocator { */ fast_mempool* get_owner_pool(mempool_header* hdr) { for (auto i = 0; i < m_pools.size(); i++) { - if (m_pools[i].pool->owns(hdr)) { - return (m_pools[i].pool); - } + if (m_pools[i].pool->owns(hdr)) { return (m_pools[i].pool); } } return nullptr; } diff --git a/src/engine/homeds/memory/memory.old/smart_ptr.hpp b/src/engine/homeds/memory/memory.old/smart_ptr.hpp index c9d035e8a..e9ef78a54 100644 --- a/src/engine/homeds/memory/memory.old/smart_ptr.hpp +++ b/src/engine/homeds/memory/memory.old/smart_ptr.hpp @@ -72,9 +72,7 @@ struct smart_ptr_block { m_ptr = other.m_ptr; oldval = m_ptr.load(std::memory_order_acquire); tp = tagged_ptr(oldval); - if (tp.get_ptr() == nullptr) { - break; - } + if (tp.get_ptr() == nullptr) { break; } tp.inc_tag(); newval = tp.get_packed(); } while (!(m_ptr.compare_exchange_weak(oldval, newval, std::memory_order_acq_rel))); @@ -124,9 +122,7 @@ class atomic_smart_ptr { /// @brief this reset releases its ownership void reset(void) noexcept { - if (m_ptr->release() == true) { - fds::mem_allocator::instance()->free((mempool_header*)m_ptr.load()); - } + if (m_ptr->release() == true) { fds::mem_allocator::instance()->free((mempool_header*)m_ptr.load()); } } // underlying pointer operations : @@ -144,9 +140,7 @@ class atomic_smart_ptr { } inline T* get(void) { - if (m_ptr == nullptr) { - return nullptr; - } + if (m_ptr == nullptr) { return nullptr; } // no assert, can return NULL mempool_header* hdr = (mempool_header*)(m_ptr.load()); diff --git a/src/engine/homeds/memory/mempiece.hpp b/src/engine/homeds/memory/mempiece.hpp index 509b14ba6..3a5c1ca3d 100644 --- a/src/engine/homeds/memory/mempiece.hpp +++ b/src/engine/homeds/memory/mempiece.hpp @@ -37,8 +37,8 @@ #include "engine/common/homestore_assert.hpp" #include "engine/common/homestore_config.hpp" #include "engine/common/homestore_utils.hpp" -//#include "engine/homestore_base.hpp" -//#include "tagged_ptr.hpp" +// #include "engine/homestore_base.hpp" +// #include "tagged_ptr.hpp" #include namespace homeds { @@ -47,7 +47,7 @@ using namespace homestore; // NOTE: This needs to be removed as it pollutes name #if 0 // Tagged pointer implementation of MemPiece -#define round_off(val, rnd) ((((val)-1) / (rnd)) + 1) +#define round_off(val, rnd) ((((val) - 1) / (rnd)) + 1) #pragma pack(1) struct mempiece_tag { diff --git a/src/engine/homeds/tests/loadgen_tests/test_load.cpp b/src/engine/homeds/tests/loadgen_tests/test_load.cpp index eac0d8d50..2b19a95e6 100644 --- a/src/engine/homeds/tests/loadgen_tests/test_load.cpp +++ b/src/engine/homeds/tests/loadgen_tests/test_load.cpp @@ -119,7 +119,7 @@ struct BtreeTest : public ::testing::Test { virtual ~BtreeTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -148,7 +148,7 @@ class SSDBtreeTest : public ::testing::Test { virtual ~SSDBtreeTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -195,7 +195,7 @@ class SSDBtreeVarKVTest : public ::testing::Test { virtual ~SSDBtreeVarKVTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -242,7 +242,7 @@ class MapTest : public ::testing::Test { virtual ~MapTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -290,7 +290,7 @@ class FileTest : public ::testing::Test { virtual ~FileTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -353,7 +353,7 @@ class VDevTest_RW : public ::testing::Test { virtual ~VDevTest_RW() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -402,7 +402,7 @@ class VDevTest_PRW : public ::testing::Test { virtual ~VDevTest_PRW() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -451,7 +451,7 @@ class CacheTest : public ::testing::Test { virtual ~CacheTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: @@ -477,8 +477,8 @@ class VolumeLoadTest : public ::testing::Test { virtual ~VolumeLoadTest() override = default; protected: - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; public: std::unique_ptr< G_Volume_Test > m_loadgen; @@ -546,7 +546,7 @@ class LogStoreLoadTest : public ::testing::Test { virtual ~LogStoreLoadTest() override = default; protected: - virtual void SetUp() override{}; + virtual void SetUp() override {}; virtual void TearDown() override { loadgen.reset(); }; public: diff --git a/src/engine/homeds/tests/loadgen_tests/valuespecs/cache_value_spec.hpp b/src/engine/homeds/tests/loadgen_tests/valuespecs/cache_value_spec.hpp index 88351973b..383e01b99 100644 --- a/src/engine/homeds/tests/loadgen_tests/valuespecs/cache_value_spec.hpp +++ b/src/engine/homeds/tests/loadgen_tests/valuespecs/cache_value_spec.hpp @@ -48,7 +48,7 @@ class CacheValueBuffer : public homestore::CacheBuffer< CacheKey > { CacheValueBuffer& operator=(CacheValueBuffer&&) noexcept = delete; virtual ~CacheValueBuffer() override = default; - virtual void init() override{}; + virtual void init() override {}; template < typename... Args > static CacheValueBuffer* make_object(Args... args) { diff --git a/src/engine/homeds/tests/test_btree_crud.cpp b/src/engine/homeds/tests/test_btree_crud.cpp index 2887e7ab3..969fe65c3 100644 --- a/src/engine/homeds/tests/test_btree_crud.cpp +++ b/src/engine/homeds/tests/test_btree_crud.cpp @@ -278,7 +278,7 @@ struct SimpleKeyComparator { #define TOTAL_ENTRIES 100000 #define TOTAL_OPERS_PER_TEST 500 -//#define NTHREADS 4 +// #define NTHREADS 4 #define NTHREADS 1 struct BtreeCrudTest : public ::testing::Test { diff --git a/src/engine/homeds/utility/stats.hpp b/src/engine/homeds/utility/stats.hpp index f01347794..85f6133f8 100644 --- a/src/engine/homeds/utility/stats.hpp +++ b/src/engine/homeds/utility/stats.hpp @@ -44,7 +44,7 @@ class Stats { } } - ~Stats() { delete[](m_values); } + ~Stats() { delete[] (m_values); } void set_count(req_stats_index ind, uint64_t val) { assert(m_keys[ind].type == COUNTER); diff --git a/src/engine/homeds/utility/useful_defs.hpp b/src/engine/homeds/utility/useful_defs.hpp index d9abcf752..b86a24caf 100644 --- a/src/engine/homeds/utility/useful_defs.hpp +++ b/src/engine/homeds/utility/useful_defs.hpp @@ -99,12 +99,12 @@ constexpr std::array< char const, N1 + N2 - 1 > const_concat(char const (&a1)[N1 #define const_concat_string(s1, s2) (&(const_concat(s1, s2)[0])) template < class P, class M > -inline size_t offset_of(const M P::*member) { - return (size_t) & (reinterpret_cast< P* >(0)->*member); +inline size_t offset_of(const M P::* member) { + return (size_t)&(reinterpret_cast< P* >(0)->*member); } template < class P, class M > -inline P* container_of(const M* ptr, const M P::*member) { +inline P* container_of(const M* ptr, const M P::* member) { return (P*)((char*)ptr - offset_of(member)); } diff --git a/src/engine/homestore.hpp b/src/engine/homestore.hpp index 333f54dda..b83956c13 100644 --- a/src/engine/homestore.hpp +++ b/src/engine/homestore.hpp @@ -292,7 +292,7 @@ class HomeStore : public HomeStoreBase { const PhysicalDevGroup pdev_group{PhysicalDevGroup::DATA}; if (vb == nullptr) { /* change it to context */ - struct blkstore_blob blob {}; + struct blkstore_blob blob{}; blob.type = blkstore_type::DATA_STORE; const uint64_t size{ pct_to_size((is_data_drive_hdd() ? hdd_data_blkstore_pct : data_blkstore_pct), pdev_group)}; @@ -318,7 +318,7 @@ class HomeStore : public HomeStoreBase { const PhysicalDevGroup pdev_group{PhysicalDevGroup::FAST}; const auto atomic_phys_page_size{get_indx_mgr_page_size()}; if (vb == nullptr) { - struct blkstore_blob blob {}; + struct blkstore_blob blob{}; blob.type = blkstore_type::INDEX_STORE; const uint64_t size{ pct_to_size((is_data_drive_hdd() ? hdd_indx_blkstore_pct : indx_blkstore_pct), pdev_group)}; @@ -348,7 +348,7 @@ class HomeStore : public HomeStoreBase { const PhysicalDevGroup pdev_group{PhysicalDevGroup::META}; const auto phys_page_size{m_dev_mgr->get_phys_page_size({PhysicalDevGroup::META})}; if (vb == nullptr) { - struct blkstore_blob blob {}; + struct blkstore_blob blob{}; blob.type = blkstore_type::META_STORE; const uint64_t size{ pct_to_size((is_data_drive_hdd() ? hdd_meta_blkstore_pct : meta_blkstore_pct), pdev_group)}; @@ -379,7 +379,7 @@ class HomeStore : public HomeStoreBase { const PhysicalDevGroup pdev_group{PhysicalDevGroup::FAST}; const auto atomic_phys_page_size{m_dev_mgr->get_atomic_page_size({PhysicalDevGroup::FAST})}; if (vb == nullptr) { - struct blkstore_blob blob {}; + struct blkstore_blob blob{}; blob.type = blkstore_type::DATA_LOGDEV_STORE; const uint64_t size{pct_to_size( (is_data_drive_hdd() ? hdd_data_logdev_blkstore_pct : data_logdev_blkstore_pct), pdev_group)}; @@ -410,7 +410,7 @@ class HomeStore : public HomeStoreBase { const auto atomic_phys_page_size{m_dev_mgr->get_atomic_page_size({PhysicalDevGroup::FAST})}; if (vb == nullptr) { - struct blkstore_blob blob {}; + struct blkstore_blob blob{}; blob.type = blkstore_type::CTRL_LOGDEV_STORE; const uint64_t size{pct_to_size( (is_data_drive_hdd() ? hdd_ctrl_logdev_blkstore_pct : ctrl_logdev_blkstore_pct), pdev_group)}; diff --git a/src/engine/index/checkpoint.hpp b/src/engine/index/checkpoint.hpp index a934c581b..42ab500f5 100644 --- a/src/engine/index/checkpoint.hpp +++ b/src/engine/index/checkpoint.hpp @@ -76,7 +76,7 @@ struct cp_base { /* callback when cp is done */ std::vector< cp_done_cb > cb_list; - cp_base() : enter_cnt(0), cb_list(0){}; + cp_base() : enter_cnt(0), cb_list(0) {}; std::string to_string() { return fmt::format("[cp_status={}, enter_cnt={}]", enum_name(cp_status.load()), enter_cnt.load()); } diff --git a/src/engine/index/indx_mgr.hpp b/src/engine/index/indx_mgr.hpp index bfb56f9b6..f6c0fb29f 100644 --- a/src/engine/index/indx_mgr.hpp +++ b/src/engine/index/indx_mgr.hpp @@ -262,7 +262,7 @@ struct indx_cp : public boost::intrusive_ref_counter< indx_cp > { int state() const { return flags; } seq_id_t get_max_seqid() const { return 0; } - void set_max_seqid(const seq_id_t seqid){}; + void set_max_seqid(const seq_id_t seqid) {}; std::string to_string() const { return fmt::format( @@ -328,7 +328,7 @@ struct indx_cp_base_sb { btree_cp_sb acp_sb; // active cp superblock btree_cp_sb dcp_sb; // diff cp_superblock indx_cp_base_sb(const boost::uuids::uuid uuid) : uuid{uuid} {}; - indx_cp_base_sb(){}; + indx_cp_base_sb() {}; std::string to_string() const { return fmt::format("active_cp_cnt={} active_data_seqid={} diff_cp_cnt={} diff_data_seqid={} blkalloc_cp_id={} " "indx_size={} btree acp={}", @@ -438,6 +438,7 @@ ENUM(indx_recovery_state, uint8_t, create_sb_st, create_indx_tbl_st, create_firs /* this class defines all the static members of indx_mgr */ class StaticIndxMgr { friend class HomeBlks; + public: /*********************** static public functions **********************/ diff --git a/src/engine/meta/test_meta_blk_mgr.cpp b/src/engine/meta/test_meta_blk_mgr.cpp index 779f0f74d..4229dd51e 100644 --- a/src/engine/meta/test_meta_blk_mgr.cpp +++ b/src/engine/meta/test_meta_blk_mgr.cpp @@ -156,9 +156,9 @@ class VMetaBlkMgrTest : public ::testing::Test { virtual ~VMetaBlkMgrTest() override = default; protected: - void SetUp() override{}; + void SetUp() override {}; - void TearDown() override{}; + void TearDown() override {}; public: [[nodiscard]] uint64_t get_elapsed_time(const Clock::time_point& start) { @@ -719,17 +719,15 @@ TEST_F(VMetaBlkMgrTest, random_load_test) { TEST_F(VMetaBlkMgrTest, get_status_test) { start_homestore(SISL_OPTIONS["num_devs"].as< uint32_t >(), SISL_OPTIONS["dev_size_gb"].as< uint64_t >() * 1024 * 1024 * 1024, gp.num_threads); - auto validate_status = [this](std::string type, uint64_t size, bool expected_error=false) { + auto validate_status = [this](std::string type, uint64_t size, bool expected_error = false) { sisl::status_request status_req; - status_req.obj_name = "MetaBlk_"+type; + status_req.obj_name = "MetaBlk_" + type; status_req.verbose_level = 3; const auto sobject_mgr = HomeStoreBase::safe_instance()->sobject_mgr(); const auto status_resp = sobject_mgr->get_status(status_req); LOGINFO("get_status returned : {}", status_resp.json.dump()); - if(status_resp.json.contains("error")) { - ASSERT_TRUE(expected_error); - } - if(status_resp.json.contains("[0] content")){ + if (status_resp.json.contains("error")) { ASSERT_TRUE(expected_error); } + if (status_resp.json.contains("[0] content")) { auto encoded_content = status_resp.json["[0] content"]; const auto decode_content = hs_utils::decodeBase64(encoded_content); auto val_content = hs_utils::encodeBase64(reinterpret_cast< const unsigned char* >(decode_content.data()), @@ -744,7 +742,7 @@ TEST_F(VMetaBlkMgrTest, get_status_test) { m_start_time = Clock::now(); register_client(); [[maybe_unused]] auto write_result = do_sb_write(false, 500); - validate_status(mtype, 500 ); // check the size written is correct as well as encode/decode + validate_status(mtype, 500); // check the size written is correct as well as encode/decode mtype = "Test_Write2"; reset_counters(); @@ -764,10 +762,9 @@ TEST_F(VMetaBlkMgrTest, get_status_test) { reset_counters(); register_client(); write_result = do_sb_write(false, 100); - validate_status(mtype, 500, true); // Since the size is 100, the former size must be wrong + validate_status(mtype, 500, true); // Since the size is 100, the former size must be wrong validate_status("ERROR_TYPE", 500, true); // An error type also must results in error - this->shutdown(); } diff --git a/src/homeblks/home_blks.cpp b/src/homeblks/home_blks.cpp index e969b50fd..3054b95ae 100644 --- a/src/homeblks/home_blks.cpp +++ b/src/homeblks/home_blks.cpp @@ -526,6 +526,7 @@ void HomeBlks::init_done() { GAUGE_UPDATE(*m_metrics, recovery_phase1_latency, m_recovery_stats->m_phase1_ms); GAUGE_UPDATE(*m_metrics, recovery_phase2_latency, m_recovery_stats->m_phase2_ms); GAUGE_UPDATE(*m_metrics, recovery_log_store_latency, m_recovery_stats->m_log_store_ms); + GAUGE_UPDATE(*m_metrics, recovery_cache_release_latency, m_recovery_stats->m_cache_release_ms); GAUGE_UPDATE(*m_metrics, recovery_total_latency, m_recovery_stats->m_total_ms); // start the io watchdog; @@ -634,11 +635,11 @@ bool HomeBlks::verify_index_bm() { return true; } -std::map HomeBlks::get_used_size(const VolumePtr& vol) { +std::map< boost::uuids::uuid, uint64_t > HomeBlks::get_used_size(const VolumePtr& vol) { /* Update per volume status */ - std::map utils_map; + std::map< boost::uuids::uuid, uint64_t > utils_map; std::unique_lock< std::recursive_mutex > lg(m_vol_lock); - if (vol == nullptr){ + if (vol == nullptr) { auto it{m_volume_map.begin()}; while (it != m_volume_map.end()) { const VolumePtr& vol{it->second}; @@ -648,7 +649,7 @@ std::map HomeBlks::get_used_size(const VolumePtr& } else { utils_map[vol->get_uuid()] = vol->get_used_size().used_total_size; } - return utils_map; + return utils_map; } sisl::status_response HomeBlks::get_status(const sisl::status_request& request) { @@ -1114,11 +1115,28 @@ void HomeBlks::vol_recovery_start_phase1() { void HomeBlks::vol_recovery_start_phase2() { auto phase2_start = Clock::now(); + auto cache_release_start = Clock::now(); + uint64_t total_cache_release_time_ms = 0; + for (auto it = m_volume_map.cbegin(); it != m_volume_map.cend(); ++it) { HS_REL_ASSERT((it->second->verify_tree() == true), "true"); + it->second->recovery_start_phase2(); + + if (HB_DYNAMIC_CONFIG(general_config->release_cache_after_recovery)) { + cache_release_start = Clock::now(); + LOGINFO("RELEASE_CACHE: Starting cache release after recovery for volume: {}", it->second->get_name()); + auto eviction_stats = it->second->release_cached_tree(); + auto cache_release_time_ms = get_elapsed_time_ms(cache_release_start); + total_cache_release_time_ms += cache_release_time_ms; + LOGINFO("RELEASE_CACHE: Eviction stats for volume: {} - " + "total_checked={} evicted={} with_refs={} not_in_cache={} time_ms={}", + it->second->get_name(), eviction_stats.total_nodes_checked, eviction_stats.nodes_evicted, + eviction_stats.nodes_with_refs, eviction_stats.nodes_not_in_cache, cache_release_time_ms); + } } + m_recovery_stats->m_cache_release_ms = total_cache_release_time_ms; m_recovery_stats->m_phase2_ms = get_elapsed_time_ms(phase2_start); } diff --git a/src/homeblks/home_blks.hpp b/src/homeblks/home_blks.hpp index 84eb613ed..97f470901 100644 --- a/src/homeblks/home_blks.hpp +++ b/src/homeblks/home_blks.hpp @@ -111,6 +111,7 @@ class HomeBlksMetrics : public sisl::MetricsGroupWrapper { REGISTER_GAUGE(recovery_phase2_latency, "recovery phase2 latency"); REGISTER_GAUGE(recovery_log_store_latency, "recovery logstore latency"); REGISTER_GAUGE(recovery_total_latency, "recovery total latency"); + REGISTER_GAUGE(recovery_cache_release_latency, "recovery cache release latency"); REGISTER_GAUGE(unclean_shutdown, "unclean shutdown"); register_me_to_farm(); } @@ -127,12 +128,13 @@ typedef WriteBackCacheBuffer< MappingKey, MappingValue, btree_node_type::VAR_VAL BLKSTORE_BUFFER_TYPE; struct HomeBlksRecoveryStats { - Clock::time_point m_start; // recovery start time - uint64_t m_phase0_ms{0}; // time spent in phase0: from init to receipt of meta_blk_recovery_comp_cb; - uint64_t m_phase1_ms{0}; // time spent in phase1: volume Phase 1 - uint64_t m_phase2_ms{0}; // time spent in phase2: volume Phase 2 - uint64_t m_log_store_ms{0}; // time spent in logstore recovery - uint64_t m_total_ms{0}; // total: from metablk notify homeblks of comp_cb to init_done; + Clock::time_point m_start; // recovery start time + uint64_t m_phase0_ms{0}; // time spent in phase0: from init to receipt of meta_blk_recovery_comp_cb; + uint64_t m_phase1_ms{0}; // time spent in phase1: volume Phase 1 + uint64_t m_phase2_ms{0}; // time spent in phase2: volume Phase 2 + uint64_t m_log_store_ms{0}; // time spent in logstore recovery + uint64_t m_cache_release_ms{0}; // time spent releasing cached nodes after recovery + uint64_t m_total_ms{0}; // total: from metablk notify homeblks of comp_cb to init_done; void phase0_done() { m_phase0_ms = get_elapsed_time_ms(m_start); } @@ -145,8 +147,8 @@ struct HomeBlksRecoveryStats { std::string to_string() { return fmt::format("Recovery Total (ms): {}, Volume Phase-0 (ms): {}, Volume Phase-1 (ms): {}, Log Store " - "Recovery (ms): {}, Volume Phase-2 (ms): {}", - m_total_ms, m_phase0_ms, m_phase1_ms, m_log_store_ms, m_phase2_ms); + "Recovery (ms): {}, Volume Phase-2 (ms): {}, Cache Release (ms): {}", + m_total_ms, m_phase0_ms, m_phase1_ms, m_log_store_ms, m_phase2_ms, m_cache_release_ms); } }; @@ -231,7 +233,7 @@ class HomeBlks : public VolInterface, public HomeStore< BLKSTORE_BUFFER_TYPE > { virtual const char* get_name(const VolumePtr& vol) override; virtual uint64_t get_page_size(const VolumePtr& vol) override; virtual uint64_t get_size(const VolumePtr& vol) override; - virtual std::map get_used_size(const VolumePtr& vol) override; + virtual std::map< boost::uuids::uuid, uint64_t > get_used_size(const VolumePtr& vol) override; virtual boost::uuids::uuid get_uuid(VolumePtr vol) override; virtual sisl::blob at_offset(const blk_buf_t& buf, uint32_t offset) override; diff --git a/src/homeblks/homeblks_config.fbs b/src/homeblks/homeblks_config.fbs index 42566a9c4..0d6cc9d72 100644 --- a/src/homeblks/homeblks_config.fbs +++ b/src/homeblks/homeblks_config.fbs @@ -28,9 +28,14 @@ table GeneralConfig { // Frequency with which we need to check the success of shutdown shutdown_status_check_freq_ms: uint64 = 2000; - // Consistency check on booting + // Consistency check on booting boot_consistency_check: bool = false; + // Enable cache release after volume recovery to limit peak memory usage. + // When enabled, cached btree nodes are safely evicted after each volume's + // recovery phase 2, freeing cache space for dirty buffers. + release_cache_after_recovery: bool = true (hotswap); + // These fields should only be changed by agent through workflow boot_restricted_mode: bool = false; boot_safe_mode: bool = false; diff --git a/src/homeblks/homeblks_http_server.cpp b/src/homeblks/homeblks_http_server.cpp index f7bffcd92..90d53be6c 100644 --- a/src/homeblks/homeblks_http_server.cpp +++ b/src/homeblks/homeblks_http_server.cpp @@ -155,9 +155,10 @@ void HomeBlksHttpServer::set_log_level(const Pistache::Rest::Request& request, response.send(Pistache::Http::Code::Ok, resp); } -void HomeBlksHttpServer::get_utilization(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response) -{ - const std::string vol_uuid = request.hasParam(":volumeUUID") ? request.param(":volumeUUID").as():""; +void HomeBlksHttpServer::get_utilization(const Pistache::Rest::Request& request, + Pistache::Http::ResponseWriter response) { + const std::string vol_uuid = + request.hasParam(":volumeUUID") ? request.param(":volumeUUID").as< std::string >() : ""; VolumePtr vol = nullptr; if (vol_uuid.length() != 0) { @@ -172,7 +173,7 @@ void HomeBlksHttpServer::get_utilization(const Pistache::Rest::Request& request, nlohmann::json resp; const auto total_data_size = VolInterface::get_instance()->get_system_capacity().initial_total_data_meta_size; for (auto [uuid, vol_used] : VolInterface::get_instance()->get_used_size(vol)) { - resp[boost::uuids::to_string(uuid)] = std::to_string(static_cast (vol_used)/ total_data_size); + resp[boost::uuids::to_string(uuid)] = std::to_string(static_cast< double >(vol_used) / total_data_size); } response.send(Pistache::Http::Code::Ok, resp.dump()); } diff --git a/src/homeblks/volume/mapping.cpp b/src/homeblks/volume/mapping.cpp index 438fcb3c8..d1ab5beb7 100644 --- a/src/homeblks/volume/mapping.cpp +++ b/src/homeblks/volume/mapping.cpp @@ -272,7 +272,9 @@ btree_status_t mapping::put(mapping_op_cntx& cntx, MappingKey& key, MappingValue uint64_t mapping::get_btree_node_cnt() { return m_bt->get_btree_node_cnt(); } void mapping::print_tree() { m_bt->print_tree(); } -bool mapping::verify_tree(bool update_debug_bm) { return m_bt->verify_tree(update_debug_bm); } +bool mapping::verify_tree(bool update_debug_bm, bool recursive) { + return m_bt->verify_tree(update_debug_bm, recursive); +} sisl::status_response mapping::get_status(const sisl::status_request& request) { return m_bt->get_status(request); } diff --git a/src/homeblks/volume/mapping.hpp b/src/homeblks/volume/mapping.hpp index b243fa09c..3d788fde8 100644 --- a/src/homeblks/volume/mapping.hpp +++ b/src/homeblks/volume/mapping.hpp @@ -378,7 +378,7 @@ class MappingValue : public homeds::btree::BtreeValue, public sisl::ObjLifeCount public: // creates empty array - MappingValue() : ObjLifeCounter(){}; + MappingValue() : ObjLifeCounter() {}; // creates array with one value entry - on heap, does copy. Initializes the value entry with all these params MappingValue(const seq_id_t seqid, const BlkId& blkid, const lba_count_t lba_offset, const lba_count_t nlbas, @@ -686,7 +686,8 @@ class mapping : public indx_tbl { virtual uint64_t get_btree_node_cnt(); void print_tree(); - bool verify_tree(bool update_debug_bm); + bool verify_tree(bool update_debug_bm, bool recursive = false); + auto release_cached_tree() { return m_bt->release_cached_tree(); } sisl::sobject_ptr sobject() { return m_sobject; } sisl::status_response get_status(const sisl::status_request& request); diff --git a/src/homeblks/volume/snapshot.hpp b/src/homeblks/volume/snapshot.hpp index 9a98e43aa..1048d558a 100644 --- a/src/homeblks/volume/snapshot.hpp +++ b/src/homeblks/volume/snapshot.hpp @@ -27,9 +27,9 @@ class Snapshot { Volume* m_volume; public: - Snapshot(Volume* vol, uint64_t snapId, uint64_t seqId) : m_snapId(snapId), m_seqId(seqId), m_volume(vol){}; + Snapshot(Volume* vol, uint64_t snapId, uint64_t seqId) : m_snapId(snapId), m_seqId(seqId), m_volume(vol) {}; - ~Snapshot(){}; + ~Snapshot() {}; std::string to_string() { std::stringstream ss; diff --git a/src/homeblks/volume/tests/vol_gtest.cpp b/src/homeblks/volume/tests/vol_gtest.cpp index d8aa4ef17..920d09505 100644 --- a/src/homeblks/volume/tests/vol_gtest.cpp +++ b/src/homeblks/volume/tests/vol_gtest.cpp @@ -633,8 +633,8 @@ class VolTest : public ::testing::Test { VolTest& operator=(const VolTest&) = delete; VolTest& operator=(VolTest&&) noexcept = delete; - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; void remove_files() { /* no need to delete the user created file/disk */ diff --git a/src/homeblks/volume/tests/vol_merge_test.cpp b/src/homeblks/volume/tests/vol_merge_test.cpp index 1dfe10fb3..b84c987b8 100644 --- a/src/homeblks/volume/tests/vol_merge_test.cpp +++ b/src/homeblks/volume/tests/vol_merge_test.cpp @@ -16,7 +16,7 @@ #include #include #include
-//#include +// #include #include #include #include diff --git a/src/homeblks/volume/volume.cpp b/src/homeblks/volume/volume.cpp index d7d021c56..4528d42a1 100644 --- a/src/homeblks/volume/volume.cpp +++ b/src/homeblks/volume/volume.cpp @@ -921,7 +921,9 @@ volume_child_req_ptr Volume::create_vol_child_req(const BlkId& bid, const volume } void Volume::print_tree() { get_active_indx()->print_tree(); } -bool Volume::verify_tree(bool update_debug_bm) { return (get_active_indx()->verify_tree(update_debug_bm)); } +bool Volume::verify_tree(bool update_debug_bm, bool recursive) { + return (get_active_indx()->verify_tree(update_debug_bm, recursive)); +} sisl::status_response Volume::get_status(const sisl::status_request& request) { sisl::status_response response; diff --git a/src/homeblks/volume/volume.hpp b/src/homeblks/volume/volume.hpp index e9477fdce..c400225d6 100644 --- a/src/homeblks/volume/volume.hpp +++ b/src/homeblks/volume/volume.hpp @@ -179,8 +179,10 @@ class VolumeMetrics : public sisl::MetricsGroupWrapper { REGISTER_GAUGE(volume_index_used_size, "Total Volume index used size"); REGISTER_GAUGE(volume_state, "Volume state"); - REGISTER_HISTOGRAM(volume_read_latency, "Volume overall read latency", "volume_op_latency", {"op", "read"}, HistogramBucketsType(OpLatecyBuckets)); - REGISTER_HISTOGRAM(volume_write_latency, "Volume overall write latency", "volume_op_latency", {"op", "write"}, HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(volume_read_latency, "Volume overall read latency", "volume_op_latency", {"op", "read"}, + HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(volume_write_latency, "Volume overall write latency", "volume_op_latency", {"op", "write"}, + HistogramBucketsType(OpLatecyBuckets)); #ifndef NDEBUG REGISTER_HISTOGRAM(volume_unmap_latency, "Volume overall unmap latency", "volume_op_latency", {"op", "unmap"}); #endif @@ -192,7 +194,8 @@ class VolumeMetrics : public sisl::MetricsGroupWrapper { {"op", "read"}, HistogramBucketsType(OpLatecyBuckets)); REGISTER_HISTOGRAM(volume_map_write_latency, "Volume mapping write latency", "volume_map_op_latency", {"op", "write"}, HistogramBucketsType(OpLatecyBuckets)); - REGISTER_HISTOGRAM(volume_blkalloc_latency, "Volume block allocation latency (in ns)", HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(volume_blkalloc_latency, "Volume block allocation latency (in ns)", + HistogramBucketsType(OpLatecyBuckets)); REGISTER_HISTOGRAM(volume_pieces_per_write, "Number of individual pieces per write", HistogramBucketsType(LinearUpto64Buckets)); REGISTER_COUNTER(volume_read_on_hole, "Number of reads from empty lba"); @@ -324,7 +327,7 @@ class Volume : public std::enable_shared_from_this< Volume > { std::atomic< uint64_t > m_err_cnt = 0; sisl::atomic_counter< uint64_t > m_vol_ref_cnt = 0; // volume can not be destroy/shutdown until it is not zero - std::mutex m_sb_lock; // lock for updating vol's sb + std::mutex m_sb_lock; // lock for updating vol's sb sisl::byte_array m_sb_buf; indxmgr_stop_cb m_destroy_done_cb; std::atomic< bool > m_indx_mgr_destroy_started; @@ -500,7 +503,10 @@ class Volume : public std::enable_shared_from_this< Volume > { void print_tree(); /* verify active indx */ - bool verify_tree(bool update_debug_bm = false); + bool verify_tree(bool update_debug_bm = false, bool recursive = false); + + /* release cached tree nodes */ + auto release_cached_tree() { return get_active_indx()->release_cached_tree(); } /* get status */ sisl::status_response get_status(const sisl::status_request& request); @@ -617,7 +623,7 @@ class Volume : public std::enable_shared_from_this< Volume > { void migrate_sb(); void recovery_start_phase1(); void recovery_start_phase2(); - static void fake_reboot(){}; + static void fake_reboot() {}; std::shared_ptr< SnapMgr > get_indx_mgr_instance() { return m_indx_mgr; } bool is_recovery_done() const { // if we are here but m_indx_mgr is nullptr, it means volume instance is created but index recovery is not done diff --git a/src/homelogstore/log_store_family.cpp b/src/homelogstore/log_store_family.cpp index 17bb5c196..35f3bc3ee 100644 --- a/src/homelogstore/log_store_family.cpp +++ b/src/homelogstore/log_store_family.cpp @@ -31,10 +31,7 @@ namespace homestore { SISL_LOGGING_DECL(logstore) LogStoreFamily::LogStoreFamily(const logstore_family_id_t f_id) : - m_family_id{f_id}, - m_name{std::string("LogDevFamily") + std::to_string(f_id)}, - m_log_dev{f_id, m_name} { -} + m_family_id{f_id}, m_name{std::string("LogDevFamily") + std::to_string(f_id)}, m_log_dev{f_id, m_name} {} void LogStoreFamily::start(const bool format, JournalVirtualDev* blk_store) { auto hb = HomeStoreBase::safe_instance(); diff --git a/src/homelogstore/log_store_family.hpp b/src/homelogstore/log_store_family.hpp index b1f4e8e84..6a39bd6af 100644 --- a/src/homelogstore/log_store_family.hpp +++ b/src/homelogstore/log_store_family.hpp @@ -79,9 +79,7 @@ class LogStoreFamily { [[nodiscard]] logdev_key do_device_truncate(const bool dry_run = false); - private: - void on_log_store_found(const logstore_id_t store_id, const logstore_superblk& meta); void on_io_completion(const logstore_id_t id, const logdev_key ld_key, const logdev_key flush_idx, const uint32_t nremaining_in_batch, void* const ctx); diff --git a/src/homelogstore/log_store_mgr.cpp b/src/homelogstore/log_store_mgr.cpp index 0cabdcada..304725428 100644 --- a/src/homelogstore/log_store_mgr.cpp +++ b/src/homelogstore/log_store_mgr.cpp @@ -168,8 +168,10 @@ HomeLogStoreMgrMetrics::HomeLogStoreMgrMetrics() : sisl::MetricsGroup("LogStores {"op", "write"}); REGISTER_COUNTER(logstore_read_count, "Total number of read requests to log stores", "logstore_op_count", {"op", "read"}); - REGISTER_HISTOGRAM(logstore_append_latency, "Logstore append latency", "logstore_op_latency", {"op", "write"}, HistogramBucketsType(OpLatecyBuckets)); - REGISTER_HISTOGRAM(logstore_read_latency, "Logstore read latency", "logstore_op_latency", {"op", "read"}, HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(logstore_append_latency, "Logstore append latency", "logstore_op_latency", {"op", "write"}, + HistogramBucketsType(OpLatecyBuckets)); + REGISTER_HISTOGRAM(logstore_read_latency, "Logstore read latency", "logstore_op_latency", {"op", "read"}, + HistogramBucketsType(OpLatecyBuckets)); REGISTER_HISTOGRAM(logdev_flush_size_distribution, "Distribution of flush data size", HistogramBucketsType(ExponentialOfTwoBuckets)); REGISTER_HISTOGRAM(logdev_flush_records_distribution, "Distribution of num records to flush", @@ -178,7 +180,8 @@ HomeLogStoreMgrMetrics::HomeLogStoreMgrMetrics() : sisl::MetricsGroup("LogStores HistogramBucketsType(ExponentialOfTwoBuckets)); REGISTER_HISTOGRAM(logdev_flush_done_msg_time_ns, "Logdev flush completion msg time in ns"); REGISTER_HISTOGRAM(logdev_post_flush_processing_latency, - "Logdev post flush processing (including callbacks) latency", HistogramBucketsType(OpLatecyBuckets)); + "Logdev post flush processing (including callbacks) latency", + HistogramBucketsType(OpLatecyBuckets)); REGISTER_HISTOGRAM(logdev_fsync_time_us, "Logdev fsync completion time in us"); register_me_to_farm(); diff --git a/src/homelogstore/tests/test_log_store.cpp b/src/homelogstore/tests/test_log_store.cpp index cc4f5e00a..cce1f38eb 100644 --- a/src/homelogstore/tests/test_log_store.cpp +++ b/src/homelogstore/tests/test_log_store.cpp @@ -583,8 +583,8 @@ class LogStoreTest : public ::testing::Test { virtual ~LogStoreTest() override = default; protected: - virtual void SetUp() override{}; - virtual void TearDown() override{}; + virtual void SetUp() override {}; + virtual void TearDown() override {}; void init(const uint64_t n_total_records, const std::vector< std::pair< size_t, int > >& inp_freqs = {}) { // m_nrecords_waiting_to_issue = std::lround(n_total_records / _batch_size) * _batch_size; diff --git a/src/replication/repl_log_store/lib/crc32.cc b/src/replication/repl_log_store/lib/crc32.cc index a201fa93f..922955cf2 100644 --- a/src/replication/repl_log_store/lib/crc32.cc +++ b/src/replication/repl_log_store/lib/crc32.cc @@ -44,286 +44,245 @@ const uint32_t crc_lookup[8][256] = { } #endif - { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3, - 0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91, - 0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7, - 0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5, - 0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B, - 0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59, - 0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D, - 0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433, - 0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01, - 0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457, - 0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65, - 0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB, - 0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F, - 0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD, - 0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683, - 0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1, - 0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7, - 0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5, - 0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79, - 0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F, - 0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D, - 0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713, - 0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21, - 0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777, - 0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB, - 0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9, - 0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF, - 0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }, + {0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, + 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, + 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, + 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, + 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, + 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, + 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, + 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, + 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, + 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, + 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, + 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, + 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, + 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, + 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, + 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, + 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, + 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, + 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, + 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, + 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, + 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D}, - { - 0x00000000,0x191B3141,0x32366282,0x2B2D53C3,0x646CC504,0x7D77F445,0x565AA786,0x4F4196C7, - 0xC8D98A08,0xD1C2BB49,0xFAEFE88A,0xE3F4D9CB,0xACB54F0C,0xB5AE7E4D,0x9E832D8E,0x87981CCF, - 0x4AC21251,0x53D92310,0x78F470D3,0x61EF4192,0x2EAED755,0x37B5E614,0x1C98B5D7,0x05838496, - 0x821B9859,0x9B00A918,0xB02DFADB,0xA936CB9A,0xE6775D5D,0xFF6C6C1C,0xD4413FDF,0xCD5A0E9E, - 0x958424A2,0x8C9F15E3,0xA7B24620,0xBEA97761,0xF1E8E1A6,0xE8F3D0E7,0xC3DE8324,0xDAC5B265, - 0x5D5DAEAA,0x44469FEB,0x6F6BCC28,0x7670FD69,0x39316BAE,0x202A5AEF,0x0B07092C,0x121C386D, - 0xDF4636F3,0xC65D07B2,0xED705471,0xF46B6530,0xBB2AF3F7,0xA231C2B6,0x891C9175,0x9007A034, - 0x179FBCFB,0x0E848DBA,0x25A9DE79,0x3CB2EF38,0x73F379FF,0x6AE848BE,0x41C51B7D,0x58DE2A3C, - 0xF0794F05,0xE9627E44,0xC24F2D87,0xDB541CC6,0x94158A01,0x8D0EBB40,0xA623E883,0xBF38D9C2, - 0x38A0C50D,0x21BBF44C,0x0A96A78F,0x138D96CE,0x5CCC0009,0x45D73148,0x6EFA628B,0x77E153CA, - 0xBABB5D54,0xA3A06C15,0x888D3FD6,0x91960E97,0xDED79850,0xC7CCA911,0xECE1FAD2,0xF5FACB93, - 0x7262D75C,0x6B79E61D,0x4054B5DE,0x594F849F,0x160E1258,0x0F152319,0x243870DA,0x3D23419B, - 0x65FD6BA7,0x7CE65AE6,0x57CB0925,0x4ED03864,0x0191AEA3,0x188A9FE2,0x33A7CC21,0x2ABCFD60, - 0xAD24E1AF,0xB43FD0EE,0x9F12832D,0x8609B26C,0xC94824AB,0xD05315EA,0xFB7E4629,0xE2657768, - 0x2F3F79F6,0x362448B7,0x1D091B74,0x04122A35,0x4B53BCF2,0x52488DB3,0x7965DE70,0x607EEF31, - 0xE7E6F3FE,0xFEFDC2BF,0xD5D0917C,0xCCCBA03D,0x838A36FA,0x9A9107BB,0xB1BC5478,0xA8A76539, - 0x3B83984B,0x2298A90A,0x09B5FAC9,0x10AECB88,0x5FEF5D4F,0x46F46C0E,0x6DD93FCD,0x74C20E8C, - 0xF35A1243,0xEA412302,0xC16C70C1,0xD8774180,0x9736D747,0x8E2DE606,0xA500B5C5,0xBC1B8484, - 0x71418A1A,0x685ABB5B,0x4377E898,0x5A6CD9D9,0x152D4F1E,0x0C367E5F,0x271B2D9C,0x3E001CDD, - 0xB9980012,0xA0833153,0x8BAE6290,0x92B553D1,0xDDF4C516,0xC4EFF457,0xEFC2A794,0xF6D996D5, - 0xAE07BCE9,0xB71C8DA8,0x9C31DE6B,0x852AEF2A,0xCA6B79ED,0xD37048AC,0xF85D1B6F,0xE1462A2E, - 0x66DE36E1,0x7FC507A0,0x54E85463,0x4DF36522,0x02B2F3E5,0x1BA9C2A4,0x30849167,0x299FA026, - 0xE4C5AEB8,0xFDDE9FF9,0xD6F3CC3A,0xCFE8FD7B,0x80A96BBC,0x99B25AFD,0xB29F093E,0xAB84387F, - 0x2C1C24B0,0x350715F1,0x1E2A4632,0x07317773,0x4870E1B4,0x516BD0F5,0x7A468336,0x635DB277, - 0xCBFAD74E,0xD2E1E60F,0xF9CCB5CC,0xE0D7848D,0xAF96124A,0xB68D230B,0x9DA070C8,0x84BB4189, - 0x03235D46,0x1A386C07,0x31153FC4,0x280E0E85,0x674F9842,0x7E54A903,0x5579FAC0,0x4C62CB81, - 0x8138C51F,0x9823F45E,0xB30EA79D,0xAA1596DC,0xE554001B,0xFC4F315A,0xD7626299,0xCE7953D8, - 0x49E14F17,0x50FA7E56,0x7BD72D95,0x62CC1CD4,0x2D8D8A13,0x3496BB52,0x1FBBE891,0x06A0D9D0, - 0x5E7EF3EC,0x4765C2AD,0x6C48916E,0x7553A02F,0x3A1236E8,0x230907A9,0x0824546A,0x113F652B, - 0x96A779E4,0x8FBC48A5,0xA4911B66,0xBD8A2A27,0xF2CBBCE0,0xEBD08DA1,0xC0FDDE62,0xD9E6EF23, - 0x14BCE1BD,0x0DA7D0FC,0x268A833F,0x3F91B27E,0x70D024B9,0x69CB15F8,0x42E6463B,0x5BFD777A, - 0xDC656BB5,0xC57E5AF4,0xEE530937,0xF7483876,0xB809AEB1,0xA1129FF0,0x8A3FCC33,0x9324FD72 - }, + {0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3, 0x646CC504, 0x7D77F445, 0x565AA786, 0x4F4196C7, 0xC8D98A08, + 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB, 0xACB54F0C, 0xB5AE7E4D, 0x9E832D8E, 0x87981CCF, 0x4AC21251, 0x53D92310, + 0x78F470D3, 0x61EF4192, 0x2EAED755, 0x37B5E614, 0x1C98B5D7, 0x05838496, 0x821B9859, 0x9B00A918, 0xB02DFADB, + 0xA936CB9A, 0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E, 0x958424A2, 0x8C9F15E3, 0xA7B24620, 0xBEA97761, + 0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265, 0x5D5DAEAA, 0x44469FEB, 0x6F6BCC28, 0x7670FD69, 0x39316BAE, + 0x202A5AEF, 0x0B07092C, 0x121C386D, 0xDF4636F3, 0xC65D07B2, 0xED705471, 0xF46B6530, 0xBB2AF3F7, 0xA231C2B6, + 0x891C9175, 0x9007A034, 0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38, 0x73F379FF, 0x6AE848BE, 0x41C51B7D, + 0x58DE2A3C, 0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6, 0x94158A01, 0x8D0EBB40, 0xA623E883, 0xBF38D9C2, + 0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE, 0x5CCC0009, 0x45D73148, 0x6EFA628B, 0x77E153CA, 0xBABB5D54, + 0xA3A06C15, 0x888D3FD6, 0x91960E97, 0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93, 0x7262D75C, 0x6B79E61D, + 0x4054B5DE, 0x594F849F, 0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B, 0x65FD6BA7, 0x7CE65AE6, 0x57CB0925, + 0x4ED03864, 0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60, 0xAD24E1AF, 0xB43FD0EE, 0x9F12832D, 0x8609B26C, + 0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768, 0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35, 0x4B53BCF2, + 0x52488DB3, 0x7965DE70, 0x607EEF31, 0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D, 0x838A36FA, 0x9A9107BB, + 0xB1BC5478, 0xA8A76539, 0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88, 0x5FEF5D4F, 0x46F46C0E, 0x6DD93FCD, + 0x74C20E8C, 0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180, 0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484, + 0x71418A1A, 0x685ABB5B, 0x4377E898, 0x5A6CD9D9, 0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD, 0xB9980012, + 0xA0833153, 0x8BAE6290, 0x92B553D1, 0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5, 0xAE07BCE9, 0xB71C8DA8, + 0x9C31DE6B, 0x852AEF2A, 0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E, 0x66DE36E1, 0x7FC507A0, 0x54E85463, + 0x4DF36522, 0x02B2F3E5, 0x1BA9C2A4, 0x30849167, 0x299FA026, 0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B, + 0x80A96BBC, 0x99B25AFD, 0xB29F093E, 0xAB84387F, 0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773, 0x4870E1B4, + 0x516BD0F5, 0x7A468336, 0x635DB277, 0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D, 0xAF96124A, 0xB68D230B, + 0x9DA070C8, 0x84BB4189, 0x03235D46, 0x1A386C07, 0x31153FC4, 0x280E0E85, 0x674F9842, 0x7E54A903, 0x5579FAC0, + 0x4C62CB81, 0x8138C51F, 0x9823F45E, 0xB30EA79D, 0xAA1596DC, 0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8, + 0x49E14F17, 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4, 0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0, 0x5E7EF3EC, + 0x4765C2AD, 0x6C48916E, 0x7553A02F, 0x3A1236E8, 0x230907A9, 0x0824546A, 0x113F652B, 0x96A779E4, 0x8FBC48A5, + 0xA4911B66, 0xBD8A2A27, 0xF2CBBCE0, 0xEBD08DA1, 0xC0FDDE62, 0xD9E6EF23, 0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, + 0x3F91B27E, 0x70D024B9, 0x69CB15F8, 0x42E6463B, 0x5BFD777A, 0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876, + 0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72}, - { - 0x00000000,0x01C26A37,0x0384D46E,0x0246BE59,0x0709A8DC,0x06CBC2EB,0x048D7CB2,0x054F1685, - 0x0E1351B8,0x0FD13B8F,0x0D9785D6,0x0C55EFE1,0x091AF964,0x08D89353,0x0A9E2D0A,0x0B5C473D, - 0x1C26A370,0x1DE4C947,0x1FA2771E,0x1E601D29,0x1B2F0BAC,0x1AED619B,0x18ABDFC2,0x1969B5F5, - 0x1235F2C8,0x13F798FF,0x11B126A6,0x10734C91,0x153C5A14,0x14FE3023,0x16B88E7A,0x177AE44D, - 0x384D46E0,0x398F2CD7,0x3BC9928E,0x3A0BF8B9,0x3F44EE3C,0x3E86840B,0x3CC03A52,0x3D025065, - 0x365E1758,0x379C7D6F,0x35DAC336,0x3418A901,0x3157BF84,0x3095D5B3,0x32D36BEA,0x331101DD, - 0x246BE590,0x25A98FA7,0x27EF31FE,0x262D5BC9,0x23624D4C,0x22A0277B,0x20E69922,0x2124F315, - 0x2A78B428,0x2BBADE1F,0x29FC6046,0x283E0A71,0x2D711CF4,0x2CB376C3,0x2EF5C89A,0x2F37A2AD, - 0x709A8DC0,0x7158E7F7,0x731E59AE,0x72DC3399,0x7793251C,0x76514F2B,0x7417F172,0x75D59B45, - 0x7E89DC78,0x7F4BB64F,0x7D0D0816,0x7CCF6221,0x798074A4,0x78421E93,0x7A04A0CA,0x7BC6CAFD, - 0x6CBC2EB0,0x6D7E4487,0x6F38FADE,0x6EFA90E9,0x6BB5866C,0x6A77EC5B,0x68315202,0x69F33835, - 0x62AF7F08,0x636D153F,0x612BAB66,0x60E9C151,0x65A6D7D4,0x6464BDE3,0x662203BA,0x67E0698D, - 0x48D7CB20,0x4915A117,0x4B531F4E,0x4A917579,0x4FDE63FC,0x4E1C09CB,0x4C5AB792,0x4D98DDA5, - 0x46C49A98,0x4706F0AF,0x45404EF6,0x448224C1,0x41CD3244,0x400F5873,0x4249E62A,0x438B8C1D, - 0x54F16850,0x55330267,0x5775BC3E,0x56B7D609,0x53F8C08C,0x523AAABB,0x507C14E2,0x51BE7ED5, - 0x5AE239E8,0x5B2053DF,0x5966ED86,0x58A487B1,0x5DEB9134,0x5C29FB03,0x5E6F455A,0x5FAD2F6D, - 0xE1351B80,0xE0F771B7,0xE2B1CFEE,0xE373A5D9,0xE63CB35C,0xE7FED96B,0xE5B86732,0xE47A0D05, - 0xEF264A38,0xEEE4200F,0xECA29E56,0xED60F461,0xE82FE2E4,0xE9ED88D3,0xEBAB368A,0xEA695CBD, - 0xFD13B8F0,0xFCD1D2C7,0xFE976C9E,0xFF5506A9,0xFA1A102C,0xFBD87A1B,0xF99EC442,0xF85CAE75, - 0xF300E948,0xF2C2837F,0xF0843D26,0xF1465711,0xF4094194,0xF5CB2BA3,0xF78D95FA,0xF64FFFCD, - 0xD9785D60,0xD8BA3757,0xDAFC890E,0xDB3EE339,0xDE71F5BC,0xDFB39F8B,0xDDF521D2,0xDC374BE5, - 0xD76B0CD8,0xD6A966EF,0xD4EFD8B6,0xD52DB281,0xD062A404,0xD1A0CE33,0xD3E6706A,0xD2241A5D, - 0xC55EFE10,0xC49C9427,0xC6DA2A7E,0xC7184049,0xC25756CC,0xC3953CFB,0xC1D382A2,0xC011E895, - 0xCB4DAFA8,0xCA8FC59F,0xC8C97BC6,0xC90B11F1,0xCC440774,0xCD866D43,0xCFC0D31A,0xCE02B92D, - 0x91AF9640,0x906DFC77,0x922B422E,0x93E92819,0x96A63E9C,0x976454AB,0x9522EAF2,0x94E080C5, - 0x9FBCC7F8,0x9E7EADCF,0x9C381396,0x9DFA79A1,0x98B56F24,0x99770513,0x9B31BB4A,0x9AF3D17D, - 0x8D893530,0x8C4B5F07,0x8E0DE15E,0x8FCF8B69,0x8A809DEC,0x8B42F7DB,0x89044982,0x88C623B5, - 0x839A6488,0x82580EBF,0x801EB0E6,0x81DCDAD1,0x8493CC54,0x8551A663,0x8717183A,0x86D5720D, - 0xA9E2D0A0,0xA820BA97,0xAA6604CE,0xABA46EF9,0xAEEB787C,0xAF29124B,0xAD6FAC12,0xACADC625, - 0xA7F18118,0xA633EB2F,0xA4755576,0xA5B73F41,0xA0F829C4,0xA13A43F3,0xA37CFDAA,0xA2BE979D, - 0xB5C473D0,0xB40619E7,0xB640A7BE,0xB782CD89,0xB2CDDB0C,0xB30FB13B,0xB1490F62,0xB08B6555, - 0xBBD72268,0xBA15485F,0xB853F606,0xB9919C31,0xBCDE8AB4,0xBD1CE083,0xBF5A5EDA,0xBE9834ED - }, + {0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59, 0x0709A8DC, 0x06CBC2EB, 0x048D7CB2, 0x054F1685, 0x0E1351B8, + 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1, 0x091AF964, 0x08D89353, 0x0A9E2D0A, 0x0B5C473D, 0x1C26A370, 0x1DE4C947, + 0x1FA2771E, 0x1E601D29, 0x1B2F0BAC, 0x1AED619B, 0x18ABDFC2, 0x1969B5F5, 0x1235F2C8, 0x13F798FF, 0x11B126A6, + 0x10734C91, 0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D, 0x384D46E0, 0x398F2CD7, 0x3BC9928E, 0x3A0BF8B9, + 0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065, 0x365E1758, 0x379C7D6F, 0x35DAC336, 0x3418A901, 0x3157BF84, + 0x3095D5B3, 0x32D36BEA, 0x331101DD, 0x246BE590, 0x25A98FA7, 0x27EF31FE, 0x262D5BC9, 0x23624D4C, 0x22A0277B, + 0x20E69922, 0x2124F315, 0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71, 0x2D711CF4, 0x2CB376C3, 0x2EF5C89A, + 0x2F37A2AD, 0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399, 0x7793251C, 0x76514F2B, 0x7417F172, 0x75D59B45, + 0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221, 0x798074A4, 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD, 0x6CBC2EB0, + 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9, 0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835, 0x62AF7F08, 0x636D153F, + 0x612BAB66, 0x60E9C151, 0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D, 0x48D7CB20, 0x4915A117, 0x4B531F4E, + 0x4A917579, 0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5, 0x46C49A98, 0x4706F0AF, 0x45404EF6, 0x448224C1, + 0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D, 0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609, 0x53F8C08C, + 0x523AAABB, 0x507C14E2, 0x51BE7ED5, 0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1, 0x5DEB9134, 0x5C29FB03, + 0x5E6F455A, 0x5FAD2F6D, 0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9, 0xE63CB35C, 0xE7FED96B, 0xE5B86732, + 0xE47A0D05, 0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461, 0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD, + 0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E, 0xFF5506A9, 0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75, 0xF300E948, + 0xF2C2837F, 0xF0843D26, 0xF1465711, 0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD, 0xD9785D60, 0xD8BA3757, + 0xDAFC890E, 0xDB3EE339, 0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5, 0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, + 0xD52DB281, 0xD062A404, 0xD1A0CE33, 0xD3E6706A, 0xD2241A5D, 0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049, + 0xC25756CC, 0xC3953CFB, 0xC1D382A2, 0xC011E895, 0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1, 0xCC440774, + 0xCD866D43, 0xCFC0D31A, 0xCE02B92D, 0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819, 0x96A63E9C, 0x976454AB, + 0x9522EAF2, 0x94E080C5, 0x9FBCC7F8, 0x9E7EADCF, 0x9C381396, 0x9DFA79A1, 0x98B56F24, 0x99770513, 0x9B31BB4A, + 0x9AF3D17D, 0x8D893530, 0x8C4B5F07, 0x8E0DE15E, 0x8FCF8B69, 0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5, + 0x839A6488, 0x82580EBF, 0x801EB0E6, 0x81DCDAD1, 0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D, 0xA9E2D0A0, + 0xA820BA97, 0xAA6604CE, 0xABA46EF9, 0xAEEB787C, 0xAF29124B, 0xAD6FAC12, 0xACADC625, 0xA7F18118, 0xA633EB2F, + 0xA4755576, 0xA5B73F41, 0xA0F829C4, 0xA13A43F3, 0xA37CFDAA, 0xA2BE979D, 0xB5C473D0, 0xB40619E7, 0xB640A7BE, + 0xB782CD89, 0xB2CDDB0C, 0xB30FB13B, 0xB1490F62, 0xB08B6555, 0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31, + 0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED}, - { - 0x00000000,0xB8BC6765,0xAA09C88B,0x12B5AFEE,0x8F629757,0x37DEF032,0x256B5FDC,0x9DD738B9, - 0xC5B428EF,0x7D084F8A,0x6FBDE064,0xD7018701,0x4AD6BFB8,0xF26AD8DD,0xE0DF7733,0x58631056, - 0x5019579F,0xE8A530FA,0xFA109F14,0x42ACF871,0xDF7BC0C8,0x67C7A7AD,0x75720843,0xCDCE6F26, - 0x95AD7F70,0x2D111815,0x3FA4B7FB,0x8718D09E,0x1ACFE827,0xA2738F42,0xB0C620AC,0x087A47C9, - 0xA032AF3E,0x188EC85B,0x0A3B67B5,0xB28700D0,0x2F503869,0x97EC5F0C,0x8559F0E2,0x3DE59787, - 0x658687D1,0xDD3AE0B4,0xCF8F4F5A,0x7733283F,0xEAE41086,0x525877E3,0x40EDD80D,0xF851BF68, - 0xF02BF8A1,0x48979FC4,0x5A22302A,0xE29E574F,0x7F496FF6,0xC7F50893,0xD540A77D,0x6DFCC018, - 0x359FD04E,0x8D23B72B,0x9F9618C5,0x272A7FA0,0xBAFD4719,0x0241207C,0x10F48F92,0xA848E8F7, - 0x9B14583D,0x23A83F58,0x311D90B6,0x89A1F7D3,0x1476CF6A,0xACCAA80F,0xBE7F07E1,0x06C36084, - 0x5EA070D2,0xE61C17B7,0xF4A9B859,0x4C15DF3C,0xD1C2E785,0x697E80E0,0x7BCB2F0E,0xC377486B, - 0xCB0D0FA2,0x73B168C7,0x6104C729,0xD9B8A04C,0x446F98F5,0xFCD3FF90,0xEE66507E,0x56DA371B, - 0x0EB9274D,0xB6054028,0xA4B0EFC6,0x1C0C88A3,0x81DBB01A,0x3967D77F,0x2BD27891,0x936E1FF4, - 0x3B26F703,0x839A9066,0x912F3F88,0x299358ED,0xB4446054,0x0CF80731,0x1E4DA8DF,0xA6F1CFBA, - 0xFE92DFEC,0x462EB889,0x549B1767,0xEC277002,0x71F048BB,0xC94C2FDE,0xDBF98030,0x6345E755, - 0x6B3FA09C,0xD383C7F9,0xC1366817,0x798A0F72,0xE45D37CB,0x5CE150AE,0x4E54FF40,0xF6E89825, - 0xAE8B8873,0x1637EF16,0x048240F8,0xBC3E279D,0x21E91F24,0x99557841,0x8BE0D7AF,0x335CB0CA, - 0xED59B63B,0x55E5D15E,0x47507EB0,0xFFEC19D5,0x623B216C,0xDA874609,0xC832E9E7,0x708E8E82, - 0x28ED9ED4,0x9051F9B1,0x82E4565F,0x3A58313A,0xA78F0983,0x1F336EE6,0x0D86C108,0xB53AA66D, - 0xBD40E1A4,0x05FC86C1,0x1749292F,0xAFF54E4A,0x322276F3,0x8A9E1196,0x982BBE78,0x2097D91D, - 0x78F4C94B,0xC048AE2E,0xD2FD01C0,0x6A4166A5,0xF7965E1C,0x4F2A3979,0x5D9F9697,0xE523F1F2, - 0x4D6B1905,0xF5D77E60,0xE762D18E,0x5FDEB6EB,0xC2098E52,0x7AB5E937,0x680046D9,0xD0BC21BC, - 0x88DF31EA,0x3063568F,0x22D6F961,0x9A6A9E04,0x07BDA6BD,0xBF01C1D8,0xADB46E36,0x15080953, - 0x1D724E9A,0xA5CE29FF,0xB77B8611,0x0FC7E174,0x9210D9CD,0x2AACBEA8,0x38191146,0x80A57623, - 0xD8C66675,0x607A0110,0x72CFAEFE,0xCA73C99B,0x57A4F122,0xEF189647,0xFDAD39A9,0x45115ECC, - 0x764DEE06,0xCEF18963,0xDC44268D,0x64F841E8,0xF92F7951,0x41931E34,0x5326B1DA,0xEB9AD6BF, - 0xB3F9C6E9,0x0B45A18C,0x19F00E62,0xA14C6907,0x3C9B51BE,0x842736DB,0x96929935,0x2E2EFE50, - 0x2654B999,0x9EE8DEFC,0x8C5D7112,0x34E11677,0xA9362ECE,0x118A49AB,0x033FE645,0xBB838120, - 0xE3E09176,0x5B5CF613,0x49E959FD,0xF1553E98,0x6C820621,0xD43E6144,0xC68BCEAA,0x7E37A9CF, - 0xD67F4138,0x6EC3265D,0x7C7689B3,0xC4CAEED6,0x591DD66F,0xE1A1B10A,0xF3141EE4,0x4BA87981, - 0x13CB69D7,0xAB770EB2,0xB9C2A15C,0x017EC639,0x9CA9FE80,0x241599E5,0x36A0360B,0x8E1C516E, - 0x866616A7,0x3EDA71C2,0x2C6FDE2C,0x94D3B949,0x090481F0,0xB1B8E695,0xA30D497B,0x1BB12E1E, - 0x43D23E48,0xFB6E592D,0xE9DBF6C3,0x516791A6,0xCCB0A91F,0x740CCE7A,0x66B96194,0xDE0506F1 - }, + {0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE, 0x8F629757, 0x37DEF032, 0x256B5FDC, 0x9DD738B9, 0xC5B428EF, + 0x7D084F8A, 0x6FBDE064, 0xD7018701, 0x4AD6BFB8, 0xF26AD8DD, 0xE0DF7733, 0x58631056, 0x5019579F, 0xE8A530FA, + 0xFA109F14, 0x42ACF871, 0xDF7BC0C8, 0x67C7A7AD, 0x75720843, 0xCDCE6F26, 0x95AD7F70, 0x2D111815, 0x3FA4B7FB, + 0x8718D09E, 0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9, 0xA032AF3E, 0x188EC85B, 0x0A3B67B5, 0xB28700D0, + 0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787, 0x658687D1, 0xDD3AE0B4, 0xCF8F4F5A, 0x7733283F, 0xEAE41086, + 0x525877E3, 0x40EDD80D, 0xF851BF68, 0xF02BF8A1, 0x48979FC4, 0x5A22302A, 0xE29E574F, 0x7F496FF6, 0xC7F50893, + 0xD540A77D, 0x6DFCC018, 0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0, 0xBAFD4719, 0x0241207C, 0x10F48F92, + 0xA848E8F7, 0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3, 0x1476CF6A, 0xACCAA80F, 0xBE7F07E1, 0x06C36084, + 0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C, 0xD1C2E785, 0x697E80E0, 0x7BCB2F0E, 0xC377486B, 0xCB0D0FA2, + 0x73B168C7, 0x6104C729, 0xD9B8A04C, 0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B, 0x0EB9274D, 0xB6054028, + 0xA4B0EFC6, 0x1C0C88A3, 0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4, 0x3B26F703, 0x839A9066, 0x912F3F88, + 0x299358ED, 0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA, 0xFE92DFEC, 0x462EB889, 0x549B1767, 0xEC277002, + 0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755, 0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72, 0xE45D37CB, + 0x5CE150AE, 0x4E54FF40, 0xF6E89825, 0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D, 0x21E91F24, 0x99557841, + 0x8BE0D7AF, 0x335CB0CA, 0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5, 0x623B216C, 0xDA874609, 0xC832E9E7, + 0x708E8E82, 0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A, 0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D, + 0xBD40E1A4, 0x05FC86C1, 0x1749292F, 0xAFF54E4A, 0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D, 0x78F4C94B, + 0xC048AE2E, 0xD2FD01C0, 0x6A4166A5, 0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2, 0x4D6B1905, 0xF5D77E60, + 0xE762D18E, 0x5FDEB6EB, 0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC, 0x88DF31EA, 0x3063568F, 0x22D6F961, + 0x9A6A9E04, 0x07BDA6BD, 0xBF01C1D8, 0xADB46E36, 0x15080953, 0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174, + 0x9210D9CD, 0x2AACBEA8, 0x38191146, 0x80A57623, 0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B, 0x57A4F122, + 0xEF189647, 0xFDAD39A9, 0x45115ECC, 0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8, 0xF92F7951, 0x41931E34, + 0x5326B1DA, 0xEB9AD6BF, 0xB3F9C6E9, 0x0B45A18C, 0x19F00E62, 0xA14C6907, 0x3C9B51BE, 0x842736DB, 0x96929935, + 0x2E2EFE50, 0x2654B999, 0x9EE8DEFC, 0x8C5D7112, 0x34E11677, 0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120, + 0xE3E09176, 0x5B5CF613, 0x49E959FD, 0xF1553E98, 0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF, 0xD67F4138, + 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6, 0x591DD66F, 0xE1A1B10A, 0xF3141EE4, 0x4BA87981, 0x13CB69D7, 0xAB770EB2, + 0xB9C2A15C, 0x017EC639, 0x9CA9FE80, 0x241599E5, 0x36A0360B, 0x8E1C516E, 0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, + 0x94D3B949, 0x090481F0, 0xB1B8E695, 0xA30D497B, 0x1BB12E1E, 0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6, + 0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1}, - { - 0x00000000,0x3D6029B0,0x7AC05360,0x47A07AD0,0xF580A6C0,0xC8E08F70,0x8F40F5A0,0xB220DC10, - 0x30704BC1,0x0D106271,0x4AB018A1,0x77D03111,0xC5F0ED01,0xF890C4B1,0xBF30BE61,0x825097D1, - 0x60E09782,0x5D80BE32,0x1A20C4E2,0x2740ED52,0x95603142,0xA80018F2,0xEFA06222,0xD2C04B92, - 0x5090DC43,0x6DF0F5F3,0x2A508F23,0x1730A693,0xA5107A83,0x98705333,0xDFD029E3,0xE2B00053, - 0xC1C12F04,0xFCA106B4,0xBB017C64,0x866155D4,0x344189C4,0x0921A074,0x4E81DAA4,0x73E1F314, - 0xF1B164C5,0xCCD14D75,0x8B7137A5,0xB6111E15,0x0431C205,0x3951EBB5,0x7EF19165,0x4391B8D5, - 0xA121B886,0x9C419136,0xDBE1EBE6,0xE681C256,0x54A11E46,0x69C137F6,0x2E614D26,0x13016496, - 0x9151F347,0xAC31DAF7,0xEB91A027,0xD6F18997,0x64D15587,0x59B17C37,0x1E1106E7,0x23712F57, - 0x58F35849,0x659371F9,0x22330B29,0x1F532299,0xAD73FE89,0x9013D739,0xD7B3ADE9,0xEAD38459, - 0x68831388,0x55E33A38,0x124340E8,0x2F236958,0x9D03B548,0xA0639CF8,0xE7C3E628,0xDAA3CF98, - 0x3813CFCB,0x0573E67B,0x42D39CAB,0x7FB3B51B,0xCD93690B,0xF0F340BB,0xB7533A6B,0x8A3313DB, - 0x0863840A,0x3503ADBA,0x72A3D76A,0x4FC3FEDA,0xFDE322CA,0xC0830B7A,0x872371AA,0xBA43581A, - 0x9932774D,0xA4525EFD,0xE3F2242D,0xDE920D9D,0x6CB2D18D,0x51D2F83D,0x167282ED,0x2B12AB5D, - 0xA9423C8C,0x9422153C,0xD3826FEC,0xEEE2465C,0x5CC29A4C,0x61A2B3FC,0x2602C92C,0x1B62E09C, - 0xF9D2E0CF,0xC4B2C97F,0x8312B3AF,0xBE729A1F,0x0C52460F,0x31326FBF,0x7692156F,0x4BF23CDF, - 0xC9A2AB0E,0xF4C282BE,0xB362F86E,0x8E02D1DE,0x3C220DCE,0x0142247E,0x46E25EAE,0x7B82771E, - 0xB1E6B092,0x8C869922,0xCB26E3F2,0xF646CA42,0x44661652,0x79063FE2,0x3EA64532,0x03C66C82, - 0x8196FB53,0xBCF6D2E3,0xFB56A833,0xC6368183,0x74165D93,0x49767423,0x0ED60EF3,0x33B62743, - 0xD1062710,0xEC660EA0,0xABC67470,0x96A65DC0,0x248681D0,0x19E6A860,0x5E46D2B0,0x6326FB00, - 0xE1766CD1,0xDC164561,0x9BB63FB1,0xA6D61601,0x14F6CA11,0x2996E3A1,0x6E369971,0x5356B0C1, - 0x70279F96,0x4D47B626,0x0AE7CCF6,0x3787E546,0x85A73956,0xB8C710E6,0xFF676A36,0xC2074386, - 0x4057D457,0x7D37FDE7,0x3A978737,0x07F7AE87,0xB5D77297,0x88B75B27,0xCF1721F7,0xF2770847, - 0x10C70814,0x2DA721A4,0x6A075B74,0x576772C4,0xE547AED4,0xD8278764,0x9F87FDB4,0xA2E7D404, - 0x20B743D5,0x1DD76A65,0x5A7710B5,0x67173905,0xD537E515,0xE857CCA5,0xAFF7B675,0x92979FC5, - 0xE915E8DB,0xD475C16B,0x93D5BBBB,0xAEB5920B,0x1C954E1B,0x21F567AB,0x66551D7B,0x5B3534CB, - 0xD965A31A,0xE4058AAA,0xA3A5F07A,0x9EC5D9CA,0x2CE505DA,0x11852C6A,0x562556BA,0x6B457F0A, - 0x89F57F59,0xB49556E9,0xF3352C39,0xCE550589,0x7C75D999,0x4115F029,0x06B58AF9,0x3BD5A349, - 0xB9853498,0x84E51D28,0xC34567F8,0xFE254E48,0x4C059258,0x7165BBE8,0x36C5C138,0x0BA5E888, - 0x28D4C7DF,0x15B4EE6F,0x521494BF,0x6F74BD0F,0xDD54611F,0xE03448AF,0xA794327F,0x9AF41BCF, - 0x18A48C1E,0x25C4A5AE,0x6264DF7E,0x5F04F6CE,0xED242ADE,0xD044036E,0x97E479BE,0xAA84500E, - 0x4834505D,0x755479ED,0x32F4033D,0x0F942A8D,0xBDB4F69D,0x80D4DF2D,0xC774A5FD,0xFA148C4D, - 0x78441B9C,0x4524322C,0x028448FC,0x3FE4614C,0x8DC4BD5C,0xB0A494EC,0xF704EE3C,0xCA64C78C - }, + {0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0, 0xF580A6C0, 0xC8E08F70, 0x8F40F5A0, 0xB220DC10, 0x30704BC1, + 0x0D106271, 0x4AB018A1, 0x77D03111, 0xC5F0ED01, 0xF890C4B1, 0xBF30BE61, 0x825097D1, 0x60E09782, 0x5D80BE32, + 0x1A20C4E2, 0x2740ED52, 0x95603142, 0xA80018F2, 0xEFA06222, 0xD2C04B92, 0x5090DC43, 0x6DF0F5F3, 0x2A508F23, + 0x1730A693, 0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053, 0xC1C12F04, 0xFCA106B4, 0xBB017C64, 0x866155D4, + 0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314, 0xF1B164C5, 0xCCD14D75, 0x8B7137A5, 0xB6111E15, 0x0431C205, + 0x3951EBB5, 0x7EF19165, 0x4391B8D5, 0xA121B886, 0x9C419136, 0xDBE1EBE6, 0xE681C256, 0x54A11E46, 0x69C137F6, + 0x2E614D26, 0x13016496, 0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997, 0x64D15587, 0x59B17C37, 0x1E1106E7, + 0x23712F57, 0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299, 0xAD73FE89, 0x9013D739, 0xD7B3ADE9, 0xEAD38459, + 0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958, 0x9D03B548, 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98, 0x3813CFCB, + 0x0573E67B, 0x42D39CAB, 0x7FB3B51B, 0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB, 0x0863840A, 0x3503ADBA, + 0x72A3D76A, 0x4FC3FEDA, 0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A, 0x9932774D, 0xA4525EFD, 0xE3F2242D, + 0xDE920D9D, 0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D, 0xA9423C8C, 0x9422153C, 0xD3826FEC, 0xEEE2465C, + 0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C, 0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F, 0x0C52460F, + 0x31326FBF, 0x7692156F, 0x4BF23CDF, 0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE, 0x3C220DCE, 0x0142247E, + 0x46E25EAE, 0x7B82771E, 0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42, 0x44661652, 0x79063FE2, 0x3EA64532, + 0x03C66C82, 0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183, 0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743, + 0xD1062710, 0xEC660EA0, 0xABC67470, 0x96A65DC0, 0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00, 0xE1766CD1, + 0xDC164561, 0x9BB63FB1, 0xA6D61601, 0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1, 0x70279F96, 0x4D47B626, + 0x0AE7CCF6, 0x3787E546, 0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386, 0x4057D457, 0x7D37FDE7, 0x3A978737, + 0x07F7AE87, 0xB5D77297, 0x88B75B27, 0xCF1721F7, 0xF2770847, 0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4, + 0xE547AED4, 0xD8278764, 0x9F87FDB4, 0xA2E7D404, 0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905, 0xD537E515, + 0xE857CCA5, 0xAFF7B675, 0x92979FC5, 0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B, 0x1C954E1B, 0x21F567AB, + 0x66551D7B, 0x5B3534CB, 0xD965A31A, 0xE4058AAA, 0xA3A5F07A, 0x9EC5D9CA, 0x2CE505DA, 0x11852C6A, 0x562556BA, + 0x6B457F0A, 0x89F57F59, 0xB49556E9, 0xF3352C39, 0xCE550589, 0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349, + 0xB9853498, 0x84E51D28, 0xC34567F8, 0xFE254E48, 0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888, 0x28D4C7DF, + 0x15B4EE6F, 0x521494BF, 0x6F74BD0F, 0xDD54611F, 0xE03448AF, 0xA794327F, 0x9AF41BCF, 0x18A48C1E, 0x25C4A5AE, + 0x6264DF7E, 0x5F04F6CE, 0xED242ADE, 0xD044036E, 0x97E479BE, 0xAA84500E, 0x4834505D, 0x755479ED, 0x32F4033D, + 0x0F942A8D, 0xBDB4F69D, 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D, 0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C, + 0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C}, - { - 0x00000000,0xCB5CD3A5,0x4DC8A10B,0x869472AE,0x9B914216,0x50CD91B3,0xD659E31D,0x1D0530B8, - 0xEC53826D,0x270F51C8,0xA19B2366,0x6AC7F0C3,0x77C2C07B,0xBC9E13DE,0x3A0A6170,0xF156B2D5, - 0x03D6029B,0xC88AD13E,0x4E1EA390,0x85427035,0x9847408D,0x531B9328,0xD58FE186,0x1ED33223, - 0xEF8580F6,0x24D95353,0xA24D21FD,0x6911F258,0x7414C2E0,0xBF481145,0x39DC63EB,0xF280B04E, - 0x07AC0536,0xCCF0D693,0x4A64A43D,0x81387798,0x9C3D4720,0x57619485,0xD1F5E62B,0x1AA9358E, - 0xEBFF875B,0x20A354FE,0xA6372650,0x6D6BF5F5,0x706EC54D,0xBB3216E8,0x3DA66446,0xF6FAB7E3, - 0x047A07AD,0xCF26D408,0x49B2A6A6,0x82EE7503,0x9FEB45BB,0x54B7961E,0xD223E4B0,0x197F3715, - 0xE82985C0,0x23755665,0xA5E124CB,0x6EBDF76E,0x73B8C7D6,0xB8E41473,0x3E7066DD,0xF52CB578, - 0x0F580A6C,0xC404D9C9,0x4290AB67,0x89CC78C2,0x94C9487A,0x5F959BDF,0xD901E971,0x125D3AD4, - 0xE30B8801,0x28575BA4,0xAEC3290A,0x659FFAAF,0x789ACA17,0xB3C619B2,0x35526B1C,0xFE0EB8B9, - 0x0C8E08F7,0xC7D2DB52,0x4146A9FC,0x8A1A7A59,0x971F4AE1,0x5C439944,0xDAD7EBEA,0x118B384F, - 0xE0DD8A9A,0x2B81593F,0xAD152B91,0x6649F834,0x7B4CC88C,0xB0101B29,0x36846987,0xFDD8BA22, - 0x08F40F5A,0xC3A8DCFF,0x453CAE51,0x8E607DF4,0x93654D4C,0x58399EE9,0xDEADEC47,0x15F13FE2, - 0xE4A78D37,0x2FFB5E92,0xA96F2C3C,0x6233FF99,0x7F36CF21,0xB46A1C84,0x32FE6E2A,0xF9A2BD8F, - 0x0B220DC1,0xC07EDE64,0x46EAACCA,0x8DB67F6F,0x90B34FD7,0x5BEF9C72,0xDD7BEEDC,0x16273D79, - 0xE7718FAC,0x2C2D5C09,0xAAB92EA7,0x61E5FD02,0x7CE0CDBA,0xB7BC1E1F,0x31286CB1,0xFA74BF14, - 0x1EB014D8,0xD5ECC77D,0x5378B5D3,0x98246676,0x852156CE,0x4E7D856B,0xC8E9F7C5,0x03B52460, - 0xF2E396B5,0x39BF4510,0xBF2B37BE,0x7477E41B,0x6972D4A3,0xA22E0706,0x24BA75A8,0xEFE6A60D, - 0x1D661643,0xD63AC5E6,0x50AEB748,0x9BF264ED,0x86F75455,0x4DAB87F0,0xCB3FF55E,0x006326FB, - 0xF135942E,0x3A69478B,0xBCFD3525,0x77A1E680,0x6AA4D638,0xA1F8059D,0x276C7733,0xEC30A496, - 0x191C11EE,0xD240C24B,0x54D4B0E5,0x9F886340,0x828D53F8,0x49D1805D,0xCF45F2F3,0x04192156, - 0xF54F9383,0x3E134026,0xB8873288,0x73DBE12D,0x6EDED195,0xA5820230,0x2316709E,0xE84AA33B, - 0x1ACA1375,0xD196C0D0,0x5702B27E,0x9C5E61DB,0x815B5163,0x4A0782C6,0xCC93F068,0x07CF23CD, - 0xF6999118,0x3DC542BD,0xBB513013,0x700DE3B6,0x6D08D30E,0xA65400AB,0x20C07205,0xEB9CA1A0, - 0x11E81EB4,0xDAB4CD11,0x5C20BFBF,0x977C6C1A,0x8A795CA2,0x41258F07,0xC7B1FDA9,0x0CED2E0C, - 0xFDBB9CD9,0x36E74F7C,0xB0733DD2,0x7B2FEE77,0x662ADECF,0xAD760D6A,0x2BE27FC4,0xE0BEAC61, - 0x123E1C2F,0xD962CF8A,0x5FF6BD24,0x94AA6E81,0x89AF5E39,0x42F38D9C,0xC467FF32,0x0F3B2C97, - 0xFE6D9E42,0x35314DE7,0xB3A53F49,0x78F9ECEC,0x65FCDC54,0xAEA00FF1,0x28347D5F,0xE368AEFA, - 0x16441B82,0xDD18C827,0x5B8CBA89,0x90D0692C,0x8DD55994,0x46898A31,0xC01DF89F,0x0B412B3A, - 0xFA1799EF,0x314B4A4A,0xB7DF38E4,0x7C83EB41,0x6186DBF9,0xAADA085C,0x2C4E7AF2,0xE712A957, - 0x15921919,0xDECECABC,0x585AB812,0x93066BB7,0x8E035B0F,0x455F88AA,0xC3CBFA04,0x089729A1, - 0xF9C19B74,0x329D48D1,0xB4093A7F,0x7F55E9DA,0x6250D962,0xA90C0AC7,0x2F987869,0xE4C4ABCC - }, + {0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE, 0x9B914216, 0x50CD91B3, 0xD659E31D, 0x1D0530B8, 0xEC53826D, + 0x270F51C8, 0xA19B2366, 0x6AC7F0C3, 0x77C2C07B, 0xBC9E13DE, 0x3A0A6170, 0xF156B2D5, 0x03D6029B, 0xC88AD13E, + 0x4E1EA390, 0x85427035, 0x9847408D, 0x531B9328, 0xD58FE186, 0x1ED33223, 0xEF8580F6, 0x24D95353, 0xA24D21FD, + 0x6911F258, 0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E, 0x07AC0536, 0xCCF0D693, 0x4A64A43D, 0x81387798, + 0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E, 0xEBFF875B, 0x20A354FE, 0xA6372650, 0x6D6BF5F5, 0x706EC54D, + 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3, 0x047A07AD, 0xCF26D408, 0x49B2A6A6, 0x82EE7503, 0x9FEB45BB, 0x54B7961E, + 0xD223E4B0, 0x197F3715, 0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E, 0x73B8C7D6, 0xB8E41473, 0x3E7066DD, + 0xF52CB578, 0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2, 0x94C9487A, 0x5F959BDF, 0xD901E971, 0x125D3AD4, + 0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF, 0x789ACA17, 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9, 0x0C8E08F7, + 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59, 0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F, 0xE0DD8A9A, 0x2B81593F, + 0xAD152B91, 0x6649F834, 0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22, 0x08F40F5A, 0xC3A8DCFF, 0x453CAE51, + 0x8E607DF4, 0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2, 0xE4A78D37, 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99, + 0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F, 0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F, 0x90B34FD7, + 0x5BEF9C72, 0xDD7BEEDC, 0x16273D79, 0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02, 0x7CE0CDBA, 0xB7BC1E1F, + 0x31286CB1, 0xFA74BF14, 0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676, 0x852156CE, 0x4E7D856B, 0xC8E9F7C5, + 0x03B52460, 0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B, 0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D, + 0x1D661643, 0xD63AC5E6, 0x50AEB748, 0x9BF264ED, 0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB, 0xF135942E, + 0x3A69478B, 0xBCFD3525, 0x77A1E680, 0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496, 0x191C11EE, 0xD240C24B, + 0x54D4B0E5, 0x9F886340, 0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156, 0xF54F9383, 0x3E134026, 0xB8873288, + 0x73DBE12D, 0x6EDED195, 0xA5820230, 0x2316709E, 0xE84AA33B, 0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB, + 0x815B5163, 0x4A0782C6, 0xCC93F068, 0x07CF23CD, 0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6, 0x6D08D30E, + 0xA65400AB, 0x20C07205, 0xEB9CA1A0, 0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A, 0x8A795CA2, 0x41258F07, + 0xC7B1FDA9, 0x0CED2E0C, 0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2, 0x7B2FEE77, 0x662ADECF, 0xAD760D6A, 0x2BE27FC4, + 0xE0BEAC61, 0x123E1C2F, 0xD962CF8A, 0x5FF6BD24, 0x94AA6E81, 0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97, + 0xFE6D9E42, 0x35314DE7, 0xB3A53F49, 0x78F9ECEC, 0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA, 0x16441B82, + 0xDD18C827, 0x5B8CBA89, 0x90D0692C, 0x8DD55994, 0x46898A31, 0xC01DF89F, 0x0B412B3A, 0xFA1799EF, 0x314B4A4A, + 0xB7DF38E4, 0x7C83EB41, 0x6186DBF9, 0xAADA085C, 0x2C4E7AF2, 0xE712A957, 0x15921919, 0xDECECABC, 0x585AB812, + 0x93066BB7, 0x8E035B0F, 0x455F88AA, 0xC3CBFA04, 0x089729A1, 0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA, + 0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC}, - { - 0x00000000,0xA6770BB4,0x979F1129,0x31E81A9D,0xF44F2413,0x52382FA7,0x63D0353A,0xC5A73E8E, - 0x33EF4E67,0x959845D3,0xA4705F4E,0x020754FA,0xC7A06A74,0x61D761C0,0x503F7B5D,0xF64870E9, - 0x67DE9CCE,0xC1A9977A,0xF0418DE7,0x56368653,0x9391B8DD,0x35E6B369,0x040EA9F4,0xA279A240, - 0x5431D2A9,0xF246D91D,0xC3AEC380,0x65D9C834,0xA07EF6BA,0x0609FD0E,0x37E1E793,0x9196EC27, - 0xCFBD399C,0x69CA3228,0x582228B5,0xFE552301,0x3BF21D8F,0x9D85163B,0xAC6D0CA6,0x0A1A0712, - 0xFC5277FB,0x5A257C4F,0x6BCD66D2,0xCDBA6D66,0x081D53E8,0xAE6A585C,0x9F8242C1,0x39F54975, - 0xA863A552,0x0E14AEE6,0x3FFCB47B,0x998BBFCF,0x5C2C8141,0xFA5B8AF5,0xCBB39068,0x6DC49BDC, - 0x9B8CEB35,0x3DFBE081,0x0C13FA1C,0xAA64F1A8,0x6FC3CF26,0xC9B4C492,0xF85CDE0F,0x5E2BD5BB, - 0x440B7579,0xE27C7ECD,0xD3946450,0x75E36FE4,0xB044516A,0x16335ADE,0x27DB4043,0x81AC4BF7, - 0x77E43B1E,0xD19330AA,0xE07B2A37,0x460C2183,0x83AB1F0D,0x25DC14B9,0x14340E24,0xB2430590, - 0x23D5E9B7,0x85A2E203,0xB44AF89E,0x123DF32A,0xD79ACDA4,0x71EDC610,0x4005DC8D,0xE672D739, - 0x103AA7D0,0xB64DAC64,0x87A5B6F9,0x21D2BD4D,0xE47583C3,0x42028877,0x73EA92EA,0xD59D995E, - 0x8BB64CE5,0x2DC14751,0x1C295DCC,0xBA5E5678,0x7FF968F6,0xD98E6342,0xE86679DF,0x4E11726B, - 0xB8590282,0x1E2E0936,0x2FC613AB,0x89B1181F,0x4C162691,0xEA612D25,0xDB8937B8,0x7DFE3C0C, - 0xEC68D02B,0x4A1FDB9F,0x7BF7C102,0xDD80CAB6,0x1827F438,0xBE50FF8C,0x8FB8E511,0x29CFEEA5, - 0xDF879E4C,0x79F095F8,0x48188F65,0xEE6F84D1,0x2BC8BA5F,0x8DBFB1EB,0xBC57AB76,0x1A20A0C2, - 0x8816EAF2,0x2E61E146,0x1F89FBDB,0xB9FEF06F,0x7C59CEE1,0xDA2EC555,0xEBC6DFC8,0x4DB1D47C, - 0xBBF9A495,0x1D8EAF21,0x2C66B5BC,0x8A11BE08,0x4FB68086,0xE9C18B32,0xD82991AF,0x7E5E9A1B, - 0xEFC8763C,0x49BF7D88,0x78576715,0xDE206CA1,0x1B87522F,0xBDF0599B,0x8C184306,0x2A6F48B2, - 0xDC27385B,0x7A5033EF,0x4BB82972,0xEDCF22C6,0x28681C48,0x8E1F17FC,0xBFF70D61,0x198006D5, - 0x47ABD36E,0xE1DCD8DA,0xD034C247,0x7643C9F3,0xB3E4F77D,0x1593FCC9,0x247BE654,0x820CEDE0, - 0x74449D09,0xD23396BD,0xE3DB8C20,0x45AC8794,0x800BB91A,0x267CB2AE,0x1794A833,0xB1E3A387, - 0x20754FA0,0x86024414,0xB7EA5E89,0x119D553D,0xD43A6BB3,0x724D6007,0x43A57A9A,0xE5D2712E, - 0x139A01C7,0xB5ED0A73,0x840510EE,0x22721B5A,0xE7D525D4,0x41A22E60,0x704A34FD,0xD63D3F49, - 0xCC1D9F8B,0x6A6A943F,0x5B828EA2,0xFDF58516,0x3852BB98,0x9E25B02C,0xAFCDAAB1,0x09BAA105, - 0xFFF2D1EC,0x5985DA58,0x686DC0C5,0xCE1ACB71,0x0BBDF5FF,0xADCAFE4B,0x9C22E4D6,0x3A55EF62, - 0xABC30345,0x0DB408F1,0x3C5C126C,0x9A2B19D8,0x5F8C2756,0xF9FB2CE2,0xC813367F,0x6E643DCB, - 0x982C4D22,0x3E5B4696,0x0FB35C0B,0xA9C457BF,0x6C636931,0xCA146285,0xFBFC7818,0x5D8B73AC, - 0x03A0A617,0xA5D7ADA3,0x943FB73E,0x3248BC8A,0xF7EF8204,0x519889B0,0x6070932D,0xC6079899, - 0x304FE870,0x9638E3C4,0xA7D0F959,0x01A7F2ED,0xC400CC63,0x6277C7D7,0x539FDD4A,0xF5E8D6FE, - 0x647E3AD9,0xC209316D,0xF3E12BF0,0x55962044,0x90311ECA,0x3646157E,0x07AE0FE3,0xA1D90457, - 0x579174BE,0xF1E67F0A,0xC00E6597,0x66796E23,0xA3DE50AD,0x05A95B19,0x34414184,0x92364A30 - }, - - { - 0x00000000,0xCCAA009E,0x4225077D,0x8E8F07E3,0x844A0EFA,0x48E00E64,0xC66F0987,0x0AC50919, - 0xD3E51BB5,0x1F4F1B2B,0x91C01CC8,0x5D6A1C56,0x57AF154F,0x9B0515D1,0x158A1232,0xD92012AC, - 0x7CBB312B,0xB01131B5,0x3E9E3656,0xF23436C8,0xF8F13FD1,0x345B3F4F,0xBAD438AC,0x767E3832, - 0xAF5E2A9E,0x63F42A00,0xED7B2DE3,0x21D12D7D,0x2B142464,0xE7BE24FA,0x69312319,0xA59B2387, - 0xF9766256,0x35DC62C8,0xBB53652B,0x77F965B5,0x7D3C6CAC,0xB1966C32,0x3F196BD1,0xF3B36B4F, - 0x2A9379E3,0xE639797D,0x68B67E9E,0xA41C7E00,0xAED97719,0x62737787,0xECFC7064,0x205670FA, - 0x85CD537D,0x496753E3,0xC7E85400,0x0B42549E,0x01875D87,0xCD2D5D19,0x43A25AFA,0x8F085A64, - 0x562848C8,0x9A824856,0x140D4FB5,0xD8A74F2B,0xD2624632,0x1EC846AC,0x9047414F,0x5CED41D1, - 0x299DC2ED,0xE537C273,0x6BB8C590,0xA712C50E,0xADD7CC17,0x617DCC89,0xEFF2CB6A,0x2358CBF4, - 0xFA78D958,0x36D2D9C6,0xB85DDE25,0x74F7DEBB,0x7E32D7A2,0xB298D73C,0x3C17D0DF,0xF0BDD041, - 0x5526F3C6,0x998CF358,0x1703F4BB,0xDBA9F425,0xD16CFD3C,0x1DC6FDA2,0x9349FA41,0x5FE3FADF, - 0x86C3E873,0x4A69E8ED,0xC4E6EF0E,0x084CEF90,0x0289E689,0xCE23E617,0x40ACE1F4,0x8C06E16A, - 0xD0EBA0BB,0x1C41A025,0x92CEA7C6,0x5E64A758,0x54A1AE41,0x980BAEDF,0x1684A93C,0xDA2EA9A2, - 0x030EBB0E,0xCFA4BB90,0x412BBC73,0x8D81BCED,0x8744B5F4,0x4BEEB56A,0xC561B289,0x09CBB217, - 0xAC509190,0x60FA910E,0xEE7596ED,0x22DF9673,0x281A9F6A,0xE4B09FF4,0x6A3F9817,0xA6959889, - 0x7FB58A25,0xB31F8ABB,0x3D908D58,0xF13A8DC6,0xFBFF84DF,0x37558441,0xB9DA83A2,0x7570833C, - 0x533B85DA,0x9F918544,0x111E82A7,0xDDB48239,0xD7718B20,0x1BDB8BBE,0x95548C5D,0x59FE8CC3, - 0x80DE9E6F,0x4C749EF1,0xC2FB9912,0x0E51998C,0x04949095,0xC83E900B,0x46B197E8,0x8A1B9776, - 0x2F80B4F1,0xE32AB46F,0x6DA5B38C,0xA10FB312,0xABCABA0B,0x6760BA95,0xE9EFBD76,0x2545BDE8, - 0xFC65AF44,0x30CFAFDA,0xBE40A839,0x72EAA8A7,0x782FA1BE,0xB485A120,0x3A0AA6C3,0xF6A0A65D, - 0xAA4DE78C,0x66E7E712,0xE868E0F1,0x24C2E06F,0x2E07E976,0xE2ADE9E8,0x6C22EE0B,0xA088EE95, - 0x79A8FC39,0xB502FCA7,0x3B8DFB44,0xF727FBDA,0xFDE2F2C3,0x3148F25D,0xBFC7F5BE,0x736DF520, - 0xD6F6D6A7,0x1A5CD639,0x94D3D1DA,0x5879D144,0x52BCD85D,0x9E16D8C3,0x1099DF20,0xDC33DFBE, - 0x0513CD12,0xC9B9CD8C,0x4736CA6F,0x8B9CCAF1,0x8159C3E8,0x4DF3C376,0xC37CC495,0x0FD6C40B, - 0x7AA64737,0xB60C47A9,0x3883404A,0xF42940D4,0xFEEC49CD,0x32464953,0xBCC94EB0,0x70634E2E, - 0xA9435C82,0x65E95C1C,0xEB665BFF,0x27CC5B61,0x2D095278,0xE1A352E6,0x6F2C5505,0xA386559B, - 0x061D761C,0xCAB77682,0x44387161,0x889271FF,0x825778E6,0x4EFD7878,0xC0727F9B,0x0CD87F05, - 0xD5F86DA9,0x19526D37,0x97DD6AD4,0x5B776A4A,0x51B26353,0x9D1863CD,0x1397642E,0xDF3D64B0, - 0x83D02561,0x4F7A25FF,0xC1F5221C,0x0D5F2282,0x079A2B9B,0xCB302B05,0x45BF2CE6,0x89152C78, - 0x50353ED4,0x9C9F3E4A,0x121039A9,0xDEBA3937,0xD47F302E,0x18D530B0,0x965A3753,0x5AF037CD, - 0xFF6B144A,0x33C114D4,0xBD4E1337,0x71E413A9,0x7B211AB0,0xB78B1A2E,0x39041DCD,0xF5AE1D53, - 0x2C8E0FFF,0xE0240F61,0x6EAB0882,0xA201081C,0xA8C40105,0x646E019B,0xEAE10678,0x264B06E6 - } -}; + {0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D, 0xF44F2413, 0x52382FA7, 0x63D0353A, 0xC5A73E8E, 0x33EF4E67, + 0x959845D3, 0xA4705F4E, 0x020754FA, 0xC7A06A74, 0x61D761C0, 0x503F7B5D, 0xF64870E9, 0x67DE9CCE, 0xC1A9977A, + 0xF0418DE7, 0x56368653, 0x9391B8DD, 0x35E6B369, 0x040EA9F4, 0xA279A240, 0x5431D2A9, 0xF246D91D, 0xC3AEC380, + 0x65D9C834, 0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27, 0xCFBD399C, 0x69CA3228, 0x582228B5, 0xFE552301, + 0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712, 0xFC5277FB, 0x5A257C4F, 0x6BCD66D2, 0xCDBA6D66, 0x081D53E8, + 0xAE6A585C, 0x9F8242C1, 0x39F54975, 0xA863A552, 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF, 0x5C2C8141, 0xFA5B8AF5, + 0xCBB39068, 0x6DC49BDC, 0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8, 0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F, + 0x5E2BD5BB, 0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4, 0xB044516A, 0x16335ADE, 0x27DB4043, 0x81AC4BF7, + 0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183, 0x83AB1F0D, 0x25DC14B9, 0x14340E24, 0xB2430590, 0x23D5E9B7, + 0x85A2E203, 0xB44AF89E, 0x123DF32A, 0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739, 0x103AA7D0, 0xB64DAC64, + 0x87A5B6F9, 0x21D2BD4D, 0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E, 0x8BB64CE5, 0x2DC14751, 0x1C295DCC, + 0xBA5E5678, 0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B, 0xB8590282, 0x1E2E0936, 0x2FC613AB, 0x89B1181F, + 0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C, 0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6, 0x1827F438, + 0xBE50FF8C, 0x8FB8E511, 0x29CFEEA5, 0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1, 0x2BC8BA5F, 0x8DBFB1EB, + 0xBC57AB76, 0x1A20A0C2, 0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F, 0x7C59CEE1, 0xDA2EC555, 0xEBC6DFC8, + 0x4DB1D47C, 0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08, 0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B, + 0xEFC8763C, 0x49BF7D88, 0x78576715, 0xDE206CA1, 0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2, 0xDC27385B, + 0x7A5033EF, 0x4BB82972, 0xEDCF22C6, 0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5, 0x47ABD36E, 0xE1DCD8DA, + 0xD034C247, 0x7643C9F3, 0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0, 0x74449D09, 0xD23396BD, 0xE3DB8C20, + 0x45AC8794, 0x800BB91A, 0x267CB2AE, 0x1794A833, 0xB1E3A387, 0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D, + 0xD43A6BB3, 0x724D6007, 0x43A57A9A, 0xE5D2712E, 0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A, 0xE7D525D4, + 0x41A22E60, 0x704A34FD, 0xD63D3F49, 0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516, 0x3852BB98, 0x9E25B02C, + 0xAFCDAAB1, 0x09BAA105, 0xFFF2D1EC, 0x5985DA58, 0x686DC0C5, 0xCE1ACB71, 0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, + 0x3A55EF62, 0xABC30345, 0x0DB408F1, 0x3C5C126C, 0x9A2B19D8, 0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB, + 0x982C4D22, 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF, 0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC, 0x03A0A617, + 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A, 0xF7EF8204, 0x519889B0, 0x6070932D, 0xC6079899, 0x304FE870, 0x9638E3C4, + 0xA7D0F959, 0x01A7F2ED, 0xC400CC63, 0x6277C7D7, 0x539FDD4A, 0xF5E8D6FE, 0x647E3AD9, 0xC209316D, 0xF3E12BF0, + 0x55962044, 0x90311ECA, 0x3646157E, 0x07AE0FE3, 0xA1D90457, 0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23, + 0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30}, + {0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3, 0x844A0EFA, 0x48E00E64, 0xC66F0987, 0x0AC50919, 0xD3E51BB5, + 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56, 0x57AF154F, 0x9B0515D1, 0x158A1232, 0xD92012AC, 0x7CBB312B, 0xB01131B5, + 0x3E9E3656, 0xF23436C8, 0xF8F13FD1, 0x345B3F4F, 0xBAD438AC, 0x767E3832, 0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, + 0x21D12D7D, 0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387, 0xF9766256, 0x35DC62C8, 0xBB53652B, 0x77F965B5, + 0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F, 0x2A9379E3, 0xE639797D, 0x68B67E9E, 0xA41C7E00, 0xAED97719, + 0x62737787, 0xECFC7064, 0x205670FA, 0x85CD537D, 0x496753E3, 0xC7E85400, 0x0B42549E, 0x01875D87, 0xCD2D5D19, + 0x43A25AFA, 0x8F085A64, 0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B, 0xD2624632, 0x1EC846AC, 0x9047414F, + 0x5CED41D1, 0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E, 0xADD7CC17, 0x617DCC89, 0xEFF2CB6A, 0x2358CBF4, + 0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB, 0x7E32D7A2, 0xB298D73C, 0x3C17D0DF, 0xF0BDD041, 0x5526F3C6, + 0x998CF358, 0x1703F4BB, 0xDBA9F425, 0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF, 0x86C3E873, 0x4A69E8ED, + 0xC4E6EF0E, 0x084CEF90, 0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A, 0xD0EBA0BB, 0x1C41A025, 0x92CEA7C6, + 0x5E64A758, 0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2, 0x030EBB0E, 0xCFA4BB90, 0x412BBC73, 0x8D81BCED, + 0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217, 0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673, 0x281A9F6A, + 0xE4B09FF4, 0x6A3F9817, 0xA6959889, 0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6, 0xFBFF84DF, 0x37558441, + 0xB9DA83A2, 0x7570833C, 0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239, 0xD7718B20, 0x1BDB8BBE, 0x95548C5D, + 0x59FE8CC3, 0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C, 0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776, + 0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C, 0xA10FB312, 0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8, 0xFC65AF44, + 0x30CFAFDA, 0xBE40A839, 0x72EAA8A7, 0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D, 0xAA4DE78C, 0x66E7E712, + 0xE868E0F1, 0x24C2E06F, 0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95, 0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, + 0xF727FBDA, 0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE, 0x736DF520, 0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144, + 0x52BCD85D, 0x9E16D8C3, 0x1099DF20, 0xDC33DFBE, 0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1, 0x8159C3E8, + 0x4DF3C376, 0xC37CC495, 0x0FD6C40B, 0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4, 0xFEEC49CD, 0x32464953, + 0xBCC94EB0, 0x70634E2E, 0xA9435C82, 0x65E95C1C, 0xEB665BFF, 0x27CC5B61, 0x2D095278, 0xE1A352E6, 0x6F2C5505, + 0xA386559B, 0x061D761C, 0xCAB77682, 0x44387161, 0x889271FF, 0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05, + 0xD5F86DA9, 0x19526D37, 0x97DD6AD4, 0x5B776A4A, 0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0, 0x83D02561, + 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282, 0x079A2B9B, 0xCB302B05, 0x45BF2CE6, 0x89152C78, 0x50353ED4, 0x9C9F3E4A, + 0x121039A9, 0xDEBA3937, 0xD47F302E, 0x18D530B0, 0x965A3753, 0x5AF037CD, 0xFF6B144A, 0x33C114D4, 0xBD4E1337, + 0x71E413A9, 0x7B211AB0, 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53, 0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C, + 0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6}}; uint32_t Crc32::get(const void* data, size_t len, uint32_t seed) { uint32_t* cur = (uint32_t*)data; @@ -348,19 +307,14 @@ uint32_t Crc32::get(const void* data, size_t len, uint32_t seed) { uint32_t one = *cur++ ^ crc; uint32_t two = *cur++; - crc = crc_lookup[7][(one ) & 0xFF] ^ - crc_lookup[6][(one>> 8) & 0xFF] ^ - crc_lookup[5][(one>>16) & 0xFF] ^ - crc_lookup[4][(one>>24) & 0xFF] ^ - crc_lookup[3][(two ) & 0xFF] ^ - crc_lookup[2][(two>> 8) & 0xFF] ^ - crc_lookup[1][(two>>16) & 0xFF] ^ - crc_lookup[0][(two>>24) & 0xFF]; + crc = crc_lookup[7][(one) & 0xFF] ^ crc_lookup[6][(one >> 8) & 0xFF] ^ crc_lookup[5][(one >> 16) & 0xFF] ^ + crc_lookup[4][(one >> 24) & 0xFF] ^ crc_lookup[3][(two) & 0xFF] ^ crc_lookup[2][(two >> 8) & 0xFF] ^ + crc_lookup[1][(two >> 16) & 0xFF] ^ crc_lookup[0][(two >> 24) & 0xFF]; #endif len -= 8; } - unsigned char *cur_byte = (unsigned char*)cur; + unsigned char* cur_byte = (unsigned char*)cur; while (len--) { crc = (crc >> 8) ^ crc_lookup[0][(crc & 0xFF) ^ *cur_byte++]; } @@ -368,13 +322,8 @@ uint32_t Crc32::get(const void* data, size_t len, uint32_t seed) { return ~crc; } -uint32_t Crc32::get(const SEBuf& buf, uint32_t seed) { - return get(buf.buf, buf.len, seed); -} - -uint32_t Crc32::get(const std::string& str, uint32_t seed) { - return get(str.data(), str.size(), seed); -} +uint32_t Crc32::get(const SEBuf& buf, uint32_t seed) { return get(buf.buf, buf.len, seed); } -}; +uint32_t Crc32::get(const std::string& str, uint32_t seed) { return get(str.data(), str.size(), seed); } +}; // namespace nukv diff --git a/src/replication/repl_log_store/lib/endian_encode.h b/src/replication/repl_log_store/lib/endian_encode.h index 5b2d01d9e..7f662e1a6 100644 --- a/src/replication/repl_log_store/lib/endian_encode.h +++ b/src/replication/repl_log_store/lib/endian_encode.h @@ -42,18 +42,19 @@ #ifndef reverse_order_64 #define reverse_order_64(v) \ - ((((v)&0xff00000000000000ULL) >> 56) | (((v)&0x00ff000000000000ULL) >> 40) | (((v)&0x0000ff0000000000ULL) >> 24) | \ - (((v)&0x000000ff00000000ULL) >> 8) | (((v)&0x00000000ff000000ULL) << 8) | (((v)&0x0000000000ff0000ULL) << 24) | \ - (((v)&0x000000000000ff00ULL) << 40) | (((v)&0x00000000000000ffULL) << 56)) + ((((v) & 0xff00000000000000ULL) >> 56) | (((v) & 0x00ff000000000000ULL) >> 40) | \ + (((v) & 0x0000ff0000000000ULL) >> 24) | (((v) & 0x000000ff00000000ULL) >> 8) | \ + (((v) & 0x00000000ff000000ULL) << 8) | (((v) & 0x0000000000ff0000ULL) << 24) | \ + (((v) & 0x000000000000ff00ULL) << 40) | (((v) & 0x00000000000000ffULL) << 56)) #endif #ifndef reverse_order_32 #define reverse_order_32(v) \ - ((((v)&0xff000000) >> 24) | (((v)&0x00ff0000) >> 8) | (((v)&0x0000ff00) << 8) | (((v)&0x000000ff) << 24)) + ((((v) & 0xff000000) >> 24) | (((v) & 0x00ff0000) >> 8) | (((v) & 0x0000ff00) << 8) | (((v) & 0x000000ff) << 24)) #endif #ifndef reverse_order_16 -#define reverse_order_16(v) ((((v)&0xff00) >> 8) | (((v)&0x00ff) << 8)) +#define reverse_order_16(v) ((((v) & 0xff00) >> 8) | (((v) & 0x00ff) << 8)) #endif #if defined(_LITTLE_ENDIAN) diff --git a/src/replication/repl_log_store/lib/hex_dump.h b/src/replication/repl_log_store/lib/hex_dump.h index 7446a71ee..d1099318e 100644 --- a/src/replication/repl_log_store/lib/hex_dump.h +++ b/src/replication/repl_log_store/lib/hex_dump.h @@ -104,8 +104,7 @@ struct print_hex_options { int align; }; -#define PRINT_HEX_OPTIONS_INITIALIZER \ - (struct print_hex_options) { 1, 1, 16 } +#define PRINT_HEX_OPTIONS_INITIALIZER (struct print_hex_options){1, 1, 16} static void _print_white_space(FILE* stream, size_t len) { for (size_t i = 0; i < len; ++i) { @@ -113,8 +112,8 @@ static void _print_white_space(FILE* stream, size_t len) { } } -static void __attribute__((unused)) -print_hex_stream(FILE* stream, const void* buf, size_t buflen, struct print_hex_options options) { +static void __attribute__((unused)) print_hex_stream(FILE* stream, const void* buf, size_t buflen, + struct print_hex_options options) { size_t i, j; size_t max_addr_len; char str_buffer[256]; diff --git a/src/replication/repl_log_store/lib/stat.cc b/src/replication/repl_log_store/lib/stat.cc index e49cfb111..55ef8da0d 100644 --- a/src/replication/repl_log_store/lib/stat.cc +++ b/src/replication/repl_log_store/lib/stat.cc @@ -11,29 +11,23 @@ #include "common.h" #include "stat.h" -std::atomic StatMgr::instance(nullptr); +std::atomic< StatMgr* > StatMgr::instance(nullptr); std::mutex StatMgr::instanceLock; -StatElem::StatElem(Type _type, const std::string& _name) - : statType(_type) - , statName(_name) - , counter(0) - , gauge(0) - , hist( (_type == HISTOGRAM) - ?(new Histogram()) - :(nullptr) ) {} - -StatElem::~StatElem() { - delete hist; -} +StatElem::StatElem(Type _type, const std::string& _name) : + statType(_type), + statName(_name), + counter(0), + gauge(0), + hist((_type == HISTOGRAM) ? (new Histogram()) : (nullptr)) {} +StatElem::~StatElem() { delete hist; } -StatMgr::StatMgr() { -} +StatMgr::StatMgr() {} StatMgr::~StatMgr() { - std::unique_lock l(statMapLock); - for (auto& entry: statMap) { + std::unique_lock< std::mutex > l(statMapLock); + for (auto& entry : statMap) { delete entry.second; } } @@ -41,7 +35,7 @@ StatMgr::~StatMgr() { StatMgr* StatMgr::init() { StatMgr* mgr = instance.load(); if (!mgr) { - std::lock_guard l(instanceLock); + std::lock_guard< std::mutex > l(instanceLock); mgr = instance.load(); if (!mgr) { mgr = new StatMgr(); @@ -58,7 +52,7 @@ StatMgr* StatMgr::getInstance() { } void StatMgr::destroy() { - std::lock_guard l(instanceLock); + std::lock_guard< std::mutex > l(instanceLock); StatMgr* mgr = instance.load(); if (mgr) { delete mgr; @@ -138,24 +132,21 @@ StatMgr::CpuStat StatMgr::getCpuStat() { // TODO: other platforms { - std::lock_guard l(last_numbers_lock); + std::lock_guard< std::mutex > l(last_numbers_lock); static uint64_t last_user_time = 0; static uint64_t last_kernel_time = 0; static uint64_t last_user_millicores = 0; static uint64_t last_kernel_millicores = 0; - if ( last_user_time && last_kernel_time && - last_user_time <= ret.userTimeMs && - last_kernel_time <= ret.kernelTimeMs ) { + if (last_user_time && last_kernel_time && last_user_time <= ret.userTimeMs && + last_kernel_time <= ret.kernelTimeMs) { uint64_t time_gap_us = timer.getElapsedUs(); // Minimum gap should be bigger than 1 second. if (time_gap_us >= 1000000) { uint64_t user_time_gap = ret.userTimeMs - last_user_time; uint64_t kernel_time_gap = ret.kernelTimeMs - last_kernel_time; - ret.userMilliCores = - 1000 * (user_time_gap * 1000) / time_gap_us; - ret.kernelMilliCores = - 1000 * (kernel_time_gap * 1000) / time_gap_us; + ret.userMilliCores = 1000 * (user_time_gap * 1000) / time_gap_us; + ret.kernelMilliCores = 1000 * (kernel_time_gap * 1000) / time_gap_us; timer.reset(); last_user_time = ret.userTimeMs; @@ -225,9 +216,8 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { do { size_t dev_major = 0, dev_minor = 0; fs >> dev_major >> dev_minor; - if ( dev_major != major(ss.st_dev) || - dev_minor != minor(ss.st_dev) ) { - fs.ignore(std::numeric_limits::max(), '\n'); + if (dev_major != major(ss.st_dev) || dev_minor != minor(ss.st_dev)) { + fs.ignore(std::numeric_limits< std::streamsize >::max(), '\n'); continue; } @@ -240,9 +230,7 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { // Get device name from partition name. std::string dev_name; - if (!partition_name.empty()) { - dev_name = partition_name.substr(0, partition_name.size() - 1); - } + if (!partition_name.empty()) { dev_name = partition_name.substr(0, partition_name.size() - 1); } // Rewind. fs.seekg(0, fs.beg); @@ -253,7 +241,7 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { std::string dummy_str; fs >> dummy_str; if (dummy_str != dev_name) { - fs.ignore(std::numeric_limits::max(), '\n'); + fs.ignore(std::numeric_limits< std::streamsize >::max(), '\n'); continue; } @@ -264,8 +252,8 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { } while (!fs.eof()); fs.close(); - FILE *fp = fopen("/proc/self/io", "r"); - while(!feof(fp)) { + FILE* fp = fopen("/proc/self/io", "r"); + while (!feof(fp)) { char str[64]; unsigned long temp; int rr = fscanf(fp, "%s %lu", str, &temp); @@ -279,7 +267,7 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { // Calculate time-based metrics. { - std::lock_guard l(last_numbers_lock); + std::lock_guard< std::mutex > l(last_numbers_lock); static uint64_t last_time_io_p = 0; static uint64_t last_time_io_d = 0; static uint64_t last_time_r = 0; @@ -297,20 +285,14 @@ StatMgr::IoStat StatMgr::getIoStat(const std::string& path) { // Minimum gap should be bigger than 0.5 second. uint64_t gap_ms = timer.getElapsedMs(); if (gap_ms >= 500) { - last_util_p = (time_io_p >= last_time_io_p) - ? (time_io_p - last_time_io_p) * 1000 / gap_ms - : 0; - last_util_d = (time_io_d >= last_time_io_d) - ? (time_io_d - last_time_io_d) * 1000 / gap_ms - : 0; + last_util_p = (time_io_p >= last_time_io_p) ? (time_io_p - last_time_io_p) * 1000 / gap_ms : 0; + last_util_d = (time_io_d >= last_time_io_d) ? (time_io_d - last_time_io_d) * 1000 / gap_ms : 0; last_avg_r = (time_r >= last_time_r && ret.numReads > last_num_r) - ? ( (time_r - last_time_r) * 1000 / - (ret.numReads - last_num_r) ) - : 0; + ? ((time_r - last_time_r) * 1000 / (ret.numReads - last_num_r)) + : 0; last_avg_w = (time_w >= last_time_w && ret.numWrites > last_num_w) - ? ( (time_w - last_time_w) * 1000 / - (ret.numWrites - last_num_w) ) - : 0; + ? ((time_w - last_time_w) * 1000 / (ret.numWrites - last_num_w)) + : 0; update_prev_stats = true; @@ -355,7 +337,7 @@ uint64_t StatMgr::getDiskUsage(const std::string& path) { } StatElem* StatMgr::getStat(const std::string& stat_name) { - std::unique_lock l(statMapLock); + std::unique_lock< std::mutex > l(statMapLock); auto entry = statMap.find(stat_name); if (entry == statMap.end()) { // Not exist. @@ -367,26 +349,22 @@ StatElem* StatMgr::getStat(const std::string& stat_name) { StatElem* StatMgr::createStat(StatElem::Type type, const std::string& stat_name) { StatElem* elem = new StatElem(type, stat_name); - std::unique_lock l(statMapLock); + std::unique_lock< std::mutex > l(statMapLock); auto entry = statMap.find(stat_name); if (entry != statMap.end()) { // Alraedy exist. delete elem; return entry->second; } - statMap.insert( std::make_pair(stat_name, elem) ); + statMap.insert(std::make_pair(stat_name, elem)); return elem; } -void StatMgr::getAllStats(std::vector& stats_out) { - std::unique_lock l(statMapLock); +void StatMgr::getAllStats(std::vector< StatElem* >& stats_out) { + std::unique_lock< std::mutex > l(statMapLock); stats_out.resize(statMap.size()); size_t idx = 0; - for (auto& entry: statMap) { + for (auto& entry : statMap) { stats_out[idx++] = entry.second; } } - - - - diff --git a/src/test_common/homestore_test_common.hpp b/src/test_common/homestore_test_common.hpp index 33aacbb04..fbed818cd 100644 --- a/src/test_common/homestore_test_common.hpp +++ b/src/test_common/homestore_test_common.hpp @@ -31,7 +31,7 @@ const std::string USER_WANT_DIRECT_IO{"USER_WANT_DIRECT_IO"}; // u namespace test_common { // Fix a port for http server -inline static void set_fixed_http_port(uint32_t http_port){ +inline static void set_fixed_http_port(uint32_t http_port) { IM_SETTINGS_FACTORY().modifiable_settings([http_port](auto& s) { s.io_env->http_port = http_port; }); IM_SETTINGS_FACTORY().save(); LOGINFO("http port = {}", http_port);