Система полностью асинхронная и никто никого ждать, а также переделывать не будет. Ну и система записывает таблицу целиком за раз, а не цепочку за цепочкой - реализация userspace netfilter у нас своя, потому он записывает всю таблицу целиком атомарно.
Правильное решение такое:
- накапливаем вызовы netfilter.d, если он пришел, то надо текущую запись точно прервать (при активном процессе) и начать заново
- если при записи возникла хоть какая-то ошибка из разряда ENOENT, значит нужно начать все заново, не кидая ошибок
эти два процесса лучше всего делать в независимых тредах, и тред-обработчик netfilter.d по получению обновления должен посылать сигнал перезапуска в тред-коммитер таблицы. Коммитер таблиц правильнее сделать таким, чтобы он сперва все удалял, и только потом начинал заполнение.
Да, это сложно, но только такая схема является совместимой.