From ff8d6a730bb774271b9eea6af338e2d3ce3c48a5 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 19 Sep 2017 12:23:44 +0800 Subject: [PATCH] cmake: error out if rocksdb is incompatible w/ tcmalloc the commit d406f228 in gperf implements a c11 feature used by a recent change in rocksdb: 16e03882, which uses aligned_alloc(). and 16e03882 in rocksdb was merged after v5.7 was tagged, while 16e03882 in gperf was merged after v2.6.1 was tagged. because aligned_alloc() is not implemented by tcmalloc until the not-yet-released 2.6.2, if we call aligned_alloc() in an application linked against tcmalloc, what gets called will be the glibc's aligned_alloc(). but if we free() the memory chunk allocated by aligned_alloc(), the tcmalloc's implementation kicks in, then InvalidFree() is called, because the memory chunk being freed was allocated by tcmalloc. in short, "mixing allocators", quote from Dan Mick. in rocksdb, aligned_alloc() is used if _ISOC11_SOURCE is defined, this makes sense, because aligned_alloc() is a C11 function. we could avoid using it by not defining _ISOC11_SOURCE. but as long as _GNU_SOURCE is defined, glibc defines _ISOC11_SOURCE. and libstdc++ requires _GNU_SOURCE, because it uses a fair amount of GNU extensions. Fixes: http://tracker.ceph.com/issues/21422 Signed-off-by: Kefu Chai --- cmake/modules/BuildRocksDB.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmake/modules/BuildRocksDB.cmake b/cmake/modules/BuildRocksDB.cmake index f1706e2d67eb4..8c44098d6f24e 100644 --- a/cmake/modules/BuildRocksDB.cmake +++ b/cmake/modules/BuildRocksDB.cmake @@ -54,4 +54,15 @@ macro(build_rocksdb) endforeach() set(ROCKSDB_VERSION_STRING "${ROCKSDB_VERSION_MAJOR}.${ROCKSDB_VERSION_MINOR}.${ROCKSDB_VERSION_PATCH}") + + if(ALLOCATOR MATCHES "tcmalloc(_minimal)?") + # see http://tracker.ceph.com/issues/21422 + if(ROCKSDB_VERSION_STRING VERSION_GREATER 5.7 AND + TCMALLOC_VERSION_STRING VERSION_GREATER 2.5 AND + TCMALLOC_VERSION_STRING VERSION_LESS 2.6.2) + message(SEND_ERROR + "Incompatible tcmalloc v${TCMALLOC_VERSION_STRING} and rocksdb v${ROCKSDB_VERSION_STRING}, " + "please install gperf-tools 2.5 or > 2.6.2") + endif() + endif() endmacro() -- 2.39.5