diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0522c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/CacheLib-03dcb9bbddb977b5ec6e9ba6c5b1a53cac521f85.tar.gz +/CacheLib-bd22b0eb79f7e2326f77a22c278c48e454882291.tar.gz +/cachelib-2023.04.24.00.tar.gz +/cachelib-2023.07.03.00.tar.gz +/cachelib-2023.09.11.00.tar.gz +/cachelib-2023.10.09.00.tar.gz +/cachelib-2023.10.16.00.tar.gz +/cachelib-2024.01.22.00.tar.gz +/cachelib-2024.02.19.00.tar.gz +/cachelib-2024.07.22.00.tar.gz +/cachelib-2024.08.19.00.tar.gz +/cachelib-2025.02.03.00.tar.gz diff --git a/cachelib-disable-binary_trace_gen.diff b/cachelib-disable-binary_trace_gen.diff new file mode 100644 index 0000000..84b8cee --- /dev/null +++ b/cachelib-disable-binary_trace_gen.diff @@ -0,0 +1,43 @@ +--- a/cachelib/cachebench/CMakeLists.txt ++++ b/cachelib/cachebench/CMakeLists.txt +@@ -41,25 +41,6 @@ target_link_libraries(cachelib_cachebenc + gflags + ) + +-add_library (cachelib_binary_trace_gen +- ./runner/Runner.cpp +- ./runner/Stressor.cpp +- ./util/CacheConfig.cpp +- ./util/Config.cpp +- ./workload/BlockChunkCache.cpp +- ./workload/BlockChunkReplayGenerator.cpp +- ./workload/PieceWiseCache.cpp +- ./workload/OnlineGenerator.cpp +- ./workload/WorkloadGenerator.cpp +- ./workload/PieceWiseReplayGenerator.cpp +- ) +-add_dependencies(cachelib_binary_trace_gen thrift_generated_files) +-target_link_libraries(cachelib_binary_trace_gen PUBLIC +- cachelib_datatype +- cachelib_allocator +- gflags +-) +- + if ((CMAKE_SYSTEM_NAME STREQUAL Linux) AND + (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)) + else() +@@ -68,14 +49,11 @@ endif() + + + add_executable (cachebench main.cpp) +-add_executable (binary_trace_gen binary_trace_gen.cpp) + target_link_libraries(cachebench cachelib_cachebench) +-target_link_libraries(binary_trace_gen cachelib_binary_trace_gen) + + install( + TARGETS + cachebench +- binary_trace_gen + DESTINATION ${BIN_INSTALL_DIR} + ) + diff --git a/cachelib-find-gtest.patch b/cachelib-find-gtest.patch new file mode 100644 index 0000000..5a874d1 --- /dev/null +++ b/cachelib-find-gtest.patch @@ -0,0 +1,69 @@ +diff '--color=auto' -ruN CacheLib-c4904ef2524f396eb432392f8308a69dda926bd8/cachelib/cmake/FindGTest.cmake CacheLib-c4904ef2524f396eb432392f8308a69dda926bd8-find-gtest/cachelib/cmake/FindGTest.cmake +--- /dev/null ++++ b/cachelib/cmake/FindGTest.cmake +@@ -0,0 +1,54 @@ ++# Copyright (c) Facebook, Inc. and its affiliates. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++ ++# Find GTest ++# ++# This will define: ++# GTEST_FOUND ++# GTEST_INCLUDE_DIRS ++# GTEST_LIBRARIES ++# GTEST_MAIN_LIBRARIES ++# GTEST_BOTH_LIBRARIES ++ ++find_path(GTEST_INCLUDE_DIRS gtest/gtest.h ++ HINTS ++ $ENV{GTEST_ROOT}/include ++ ${GTEST_ROOT}/include ++) ++ ++find_library(GTEST_LIBRARIES ++ NAMES gtest ++ HINTS ++ $ENV{GTEST_ROOT} ++ ${GTEST_ROOT} ++) ++ ++find_library(GTEST_MAIN_LIBRARIES ++ NAMES gtest_main ++ HINTS ++ $ENV{GTEST_ROOT} ++ ${GTEST_ROOT} ++) ++ ++set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) ++ ++mark_as_advanced(GTEST_INCLUDE_DIRS GTEST_LIBRARIES GTEST_MAIN_LIBRARIES) ++ ++include(FindPackageHandleStandardArgs) ++find_package_handle_standard_args( ++ GTest GTEST_LIBRARIES GTEST_INCLUDE_DIRS GTEST_MAIN_LIBRARIES) ++ ++if(GTEST_FOUND AND NOT GTEST_FIND_QUIETLY) ++ message(STATUS "GTEST: ${GTEST_INCLUDE_DIRS}") ++endif() +--- a/cachelib/CMakeLists.txt ++++ b/cachelib/CMakeLists.txt +@@ -97,7 +97,7 @@ find_package(Boost REQUIRED COMPONENTS + system filesystem regex context program_options thread) + find_package(Gflags REQUIRED) + find_package(Glog REQUIRED) +-find_package(GTest CONFIG REQUIRED) ++find_package(GTest REQUIRED) + find_package(folly CONFIG REQUIRED) + find_package(fizz CONFIG REQUIRED) + find_package(fmt CONFIG REQUIRED) diff --git a/cachelib-fix-DeviceTest-FDP.diff b/cachelib-fix-DeviceTest-FDP.diff new file mode 100644 index 0000000..424b24c --- /dev/null +++ b/cachelib-fix-DeviceTest-FDP.diff @@ -0,0 +1,11 @@ +--- a/cachelib/navy/CMakeLists.txt ++++ b/cachelib/navy/CMakeLists.txt +@@ -105,7 +105,7 @@ if (BUILD_TESTS) + add_test (scheduler/tests/ThreadPoolJobSchedulerTest.cpp) + add_test (driver/tests/DriverTest.cpp) + if (NOT MISSING_FALLOCATE) +- add_test (common/tests/DeviceTest.cpp) ++# add_test (common/tests/DeviceTest.cpp) + endif() + add_test (block_cache/tests/AllocatorTest.cpp) + add_test (block_cache/tests/RegionManagerTest.cpp) diff --git a/cachelib-workaround-gcc-epel9-x86_64-bz2108665.patch b/cachelib-workaround-gcc-epel9-x86_64-bz2108665.patch new file mode 100644 index 0000000..5b88103 --- /dev/null +++ b/cachelib-workaround-gcc-epel9-x86_64-bz2108665.patch @@ -0,0 +1,11 @@ +--- a/cachelib/compact_cache/CCacheFixedLruBucket.h ++++ b/cachelib/compact_cache/CCacheFixedLruBucket.h +@@ -274,7 +274,7 @@ struct FixedLruBucket { + static void copyValue(T* destPtr, const T* srcPtr) { + XDCHECK(destPtr != nullptr); + XDCHECK(srcPtr != nullptr); +- memcpy(destPtr, srcPtr, sizeof(T)); ++ memcpy(reinterpret_cast(destPtr), reinterpret_cast(srcPtr), sizeof(T)); + } + }; + } // namespace cachelib diff --git a/cachelib.spec b/cachelib.spec new file mode 100644 index 0000000..28eedaf --- /dev/null +++ b/cachelib.spec @@ -0,0 +1,146 @@ +%bcond_with toolchain_clang + +%if %{with toolchain_clang} +%global toolchain clang +%endif + +%bcond_without build_tests +# tests not discoverable by ctest yet +%bcond_with check + +%global forgeurl https://github.com/facebook/CacheLib +%global tag 2025.02.03.00 +%global date %(echo %{tag} | sed -e 's|.00$||' | sed -e 's|\\.||g') +# disable forge macro snapinfo generation +# https://pagure.io/fedora-infra/rpmautospec/issue/240 +%global distprefix %{nil} +%forgemeta + +# see cachelib/allocator/CacheVersion.h's kCachelibVersion +%global major_ver 17 + +Name: cachelib +Version: %{major_ver}^%{date} +Release: %autorelease +Summary: Pluggable caching engine for scale high performance cache services + +License: Apache-2.0 +URL: %forgeurl +Source: %{url}/archive/v%{tag}/%{name}-%{tag}.tar.gz +# DeviceTest needs common/FdpNvme.cpp. Disable for now +Patch: %{name}-fix-DeviceTest-FDP.diff +# incomplete dependencies, will sort out later +Patch: %{name}-disable-binary_trace_gen.diff +# needed on EL8; its gtest does not come with cmake files +Patch100: %{name}-find-gtest.patch +# Workaround for gcc issue (still needed on epel9 x86_64) +# https://bugzilla.redhat.com/show_bug.cgi?id=2108665 +Patch200: %{name}-workaround-gcc-epel9-x86_64-bz2108665.patch + +ExclusiveArch: x86_64 aarch64 ppc64le + +BuildRequires: cmake +%if %{with toolchain_clang} +BuildRequires: clang +%else +BuildRequires: gcc-c++ +%endif +BuildRequires: fbthrift-devel = %{tag} +BuildRequires: fizz-devel = %{tag} +BuildRequires: folly-devel = %{tag} +BuildRequires: mvfst-devel = %{tag} +%if %{with build_tests} +BuildRequires: gmock-devel +%endif +# this is actually needed, because of +# cachelib/navy/admission_policy/DynamicRandomAP.h +BuildRequires: gtest-devel +BuildRequires: libdwarf-devel +BuildRequires: libzstd-devel +BuildRequires: numactl-devel +BuildRequires: wangle-devel +BuildRequires: zlib-devel +BuildRequires: tsl-sparse-map-devel +# BuildRequires: libatomic + + +%global _description %{expand: +CacheLib is a C++ library providing in-process high performance caching +mechanism. CacheLib provides a thread safe API to build high throughput, low +overhead caching services, with built-in ability to leverage DRAM and SSD +caching transparently.} + +%description %{_description} + +%package devel +Summary: %{summary} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: cmake + +%description devel %{_description} + +The %{name}-devel package contains libraries and header files for developing +applications that use %{name}. + + +%prep +%autosetup -n CacheLib-%{tag} -N +%autopatch -p1 -M 99 +%if 0%{?el8} +%autopatch -p1 -m 100 -M 199 +%endif +%ifarch x86_64 +%if 0%{?el9} +%autopatch -p1 -m 200 -M 209 +%endif +%endif + + +%build +pushd %{name} +%cmake \ +%if %{with build_tests} + -DBUILD_TESTS:BOOL=ON \ +%else + -DBUILD_TESTS:BOOL=OFF \ +%endif + -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=FALSE \ + -DCMAKE_INSTALL_DIR:PATH=%{_libdir}/cmake/%{name} \ + -DCONFIGS_INSTALL_DIR:STRING=%{_datadir}/%{name}/test_configs \ + -DINCLUDE_INSTALL_DIR:PATH=%{_includedir}/%{name} \ + -DCACHELIB_MAJOR_VERSION:STRING=%{major_ver} \ + -DPACKAGE_VERSION:STRING=%{major_ver}.%{date} +%cmake_build + + +%install +pushd %{name} +%cmake_install +%if %{with build_tests} +# TODO: prevent tests being installed +rm -rf %{buildroot}%{_prefix}/tests +%endif + + +%if %{with check} +%check +pushd %{name} +%ctest +%endif + + +%files +%license LICENSE +%doc BENCHMARKS.md CHANGELOG.md README.md examples +%{_bindir}/cachebench +%{_datadir}/%{name} +%{_libdir}/*.so.* + +%files devel +%{_includedir}/%{name} +%{_libdir}/*.so +%{_libdir}/cmake/%{name} + + +%changelog +%autochangelog diff --git a/get_version.sh b/get_version.sh new file mode 100755 index 0000000..375a450 --- /dev/null +++ b/get_version.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +PREFIX='constexpr uint64_t kCachelibVersion = ' +SUFFIX=';' + +echo $(grep "${PREFIX}" CacheLib-*/cachelib/allocator/CacheVersion.h | + sed -e "s|${PREFIX}||" | sed -e "s|${SUFFIX}||") diff --git a/series b/series new file mode 100644 index 0000000..e1b4b30 --- /dev/null +++ b/series @@ -0,0 +1,2 @@ +cachelib-fix-DeviceTest-FDP.diff +cachelib-disable-binary_trace_gen.diff diff --git a/sources b/sources new file mode 100644 index 0000000..6d89fce --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (cachelib-2025.02.03.00.tar.gz) = 439e4941ed0ab42916342d8e702c31def0ae36ef52153ebac9d6b8bb26e9a9cef677ba1352ec5ffb4b962db8cca54151cde534c54e4427df2820a63ffb862ecd