我正在使用线程清理程序运行boost 无锁队列文档中给出的 MPMC 示例,令我惊讶的是,这个基本示例包含按照 TSan 的数据竞争。知道可能出了什么问题吗?
OS: Red Hat Enterprise Linux Server release 7.7 / Ubuntu 18.04.4
Compiler: g++ (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2) / g++ (Ubuntu 11.1.0-1ubuntu-18.04.1) 11.1.0
CPU Architecture: x86_64
Boost Version: 1.79
Run Code Online (Sandbox Code Playgroud)
TSan 的输出如下:
@vishal: g++ testQ.cpp -lboost_thread -L /usr/local/lib/ -pthread -fsanitize=thread -ggdb3 -fPIE -pie
@vishal: TSAN_OPTIONS="history_size=7" ./a.out
boost::lockfree::queue is lockfree
==================
WARNING: ThreadSanitizer: data race (pid=22019)
Atomic write of size 8 at 0x7b1000001c00 by thread T1:
#0 __tsan_atomic64_store <null> (libtsan.so.0+0x800ca)
#1 std::atomic<boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node> >::store(boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>, …Run Code Online (Sandbox Code Playgroud) 如果我们向 C* 环添加了新节点,是否需要运行“nodetool cleanup”来清除现在已分配到其他地方的数据?或者在正常压缩期间无论如何都会发生这种情况?在正常压缩期间,C* 是否会删除不再属于该节点的数据,或者我们是否需要为此运行“nodetoool cleanup”?询问是因为“清理”需要永远并且在完成之前使节点崩溃。
如果我们需要运行“nodetool cleanup”,有没有办法找出哪些节点现在拥有它们不应再拥有的数据?(即现在属于新节点的数据,但仍然存在于旧节点上,因为没有人删除它。这是“nodetool cleanup”将删除的数据。)我们有 RF=3 和两个数据中心,每个数据中心它具有数据的完整副本。我假设我们需要在我们添加节点的数据中心的所有节点上运行清理,因为新节点上的每一行过去都在另一个节点(主节点)上,再加上其他两个节点上的两个副本(副本)。
我想使用批处理语句从数据库中的3个表中删除一行,以确保原子性。所有三个表中的分区键都将相同。在我阅读的有关批处理语句的所有示例中,所有查询都针对单个表?就我而言,使用批处理语句是一个好主意吗?或者,我应该避免吗?
我正在使用Cassandra-3.11.2,并使用C ++驱动程序执行查询。
我是Java的新手.在探索监控Cassandra的方法时,我发现(https://cassandra.apache.org/doc/latest/operating/metrics.html)"使用Dropwizard Metrics库管理Cassandra中的度量标准".然而,在几个地方,我读过关于Codahale Metrics的信息,这让我对两者之间的差异/关系感到困惑.这些不同的库是做同样的事情,还是之前被称为Crawhale Metrics的dropwizard指标?
正如Commitlog数据被刷新到磁盘定期每10秒后(通过控制commitlog_sync_period_in_ms),因此,如果在10秒内所有副本崩溃,我将失去所有这些数据呢?从理论上讲,Cassandra Cluster是否会丢失数据?
当我运行“nodetool cfhistograms”时,我看到表格数据。
Percentile SSTables Write Latency Read Latency Partition Size Cell Count
(micros) (micros) (bytes)
50% 2.00 0.00 8239.00 924 20
75% 4.00 0.00 9887.00 1109 20
95% 4.00 0.00 51012.00 1916 24
98% 4.00 0.00 51012.00 2299 29
99% 4.00 0.00 51012.00 2759 35
Min 0.00 0.00 150.00 73 2
Max 4.00 0.00 51012.00 3973 60
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这些是如何计算的吗?我理解 %le 概念,但我想知道计算上述结果需要考虑多少次读/写。
为了安装 Cassandra,我做了以下工作: 1. 下载了 TAR 文件。2. 解压文件。3.在yaml文件中设置data和commitlog目录的路径。
现在,当我运行 Cassandra 时,出现以下错误:“Java HotSpot (TM) 64 位服务器 VM 警告:无法打开文件。/..logs/gc.log 由于没有这样的文件或目录”
是什么导致了这个问题?在运行它之前我是否需要做其他事情。
操作系统:RHEL 6.5 Cassandra 版本:3.11.1
根据datastax文章,如果R + W > N,则可以保证强一致性,其中R是读操作的一致性级别W是写操作的一致性级别N是副本数
这里的强一致性是什么意思?这是否意味着“每次”从数据库给出查询响应,响应将“始终”是最后更新的值?如果在cassandra中保持强一致性的条件,那么,不存在返回数据可能不一致的场景吗?简而言之,强一致性是否意味着 100% 的一致性?
编辑 1
添加一些关于某些场景的额外材料,即使 R+W>RF Cassandra 也可能不一致
有一个函数返回一个指针(任何类型),如果我在调用函数时没有存储指针,会发生什么?在这种情况下,函数是否仍会返回指针?如果是,那么会有内存泄漏,因为我没有释放分配的内存吗?
以下面的代码为例:
int * testfunc()
{
int * a=new int();
return(a);
}
int main()
{
testfunc();
return(0);
}
Run Code Online (Sandbox Code Playgroud) 我为我的项目创建了以下 CMakelists.txt,其中包含一些需要用 C 编译的文件,然后与我的 C++ 二进制文件链接。我也在用libasan。
cmake_minimum_required(VERSION 3.0)
SET(GCC_COVERAGE_COMPILE_FLAGS "-g3 -fsanitize=address -fno-omit-frame-pointer")
SET(GCC_COVERAGE_LINK_FLAGS "-fsanitize=address -static-libasan")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
project(ABC_PROXY VERSION 1.0.0 LANGUAGES C CXX)
add_executable(abc_proxy
src/file1.c
src/main.cpp
)
target_include_directories(abc_proxy PRIVATE /home/vishal/cpp_file/new /home/vishal/cpp_file/new/framework)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
在上面的文件中,我只有一个目标二进制文件。但现在我想要 2 个二进制文件。一个将使用 libasan 进行编译,另一个将不使用 libasan 进行编译。如何在 'CMAKE_EXE_LINKER_FLAGS' 、 'CMAKE_CXX_FLAGS' 和 'CMAKE_CXX_FLAGS' 中为每个二进制目标使用不同的标志值?