我想知道使用ipset添加/删除条目是否是线程安全的。例如,如果我有2个并发进程执行这些操作
ipset -A myset 1.1.1.1 # process 1's operation
ipset -A myset 2.2.2.2 # process 2's operation
我是否需要添加同步机制以确保第二个进程运行等待第一个进程完成以避免以某种方式破坏我的IPset(例如,在我的IPset中以1.2.1.2结束)或者是否已提供此功能通过ipset?
谢谢!
答案 0 :(得分:2)
否 - 您不需要在用户空间中添加任何锁定机制。内核模块代码已经锁定了每个集合,在添加和删除操作期间会被写入锁定。
这是ipset内核模块的相关代码。注意写锁定&解锁。
static int
call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set,
struct nlattr *tb[], enum ipset_adt adt,
u32 flags, bool use_lineno)
{
int ret;
u32 lineno = 0;
bool eexist = flags & IPSET_FLAG_EXIST, retried = false;
do {
write_lock_bh(&set->lock);
ret = set->variant->uadt(set, tb, adt, &lineno, flags, retried);
write_unlock_bh(&set->lock);
retried = true;