Так что у меня проблема. Это ужасная, ужасная проблема.
У меня есть набор серверов Linux NFS (в кластере NFS / CIFS с использованием CTDB), которые отказываются от блокировок… только когда блокировка блокирует. Если это неблокирующий вызов, он работает нормально.
См. Поток трафика ниже:
Блокировка вызова блокировки:
9.414674 10.10.1.40 -> 10.10.1.14 NLM 282 V4 LOCK Call FH:0xf6b3519c svid:5 pos:0-0 nlm.lock.caller_name == "centos-ad2012r2" nlm.exclusive == 1 nlm.block == 1
9.415002 10.10.1.14 -> 10.10.1.40 NLM 106 V4 LOCK Reply (Call In 39) NLM_BLOCKED nlm.stat == 3
18.613965 10.10.1.40 -> 10.10.1.14 NLM 274 V4 CANCEL Call FH:0xf6b3519c svid:5 pos:0-0 nlm.lock.caller_name == "centos-ad2012r2" nlm.exclusive == 1 nlm.block == 1
18.614003 10.10.1.40 -> 10.10.1.14 NLM 266 V4 UNLOCK Call FH:0xf6b3519c svid:5 pos:0-0 nlm.lock.caller_name == "centos-ad2012r2"
18.614675 10.10.1.14 -> 10.10.1.40 NLM 106 V4 CANCEL Reply (Call In 55) NLM_DENIED nlm.stat == 1
18.614889 10.10.1.14 -> 10.10.1.40 NLM 106 V4 UNLOCK Reply (Call In 56) nlm.stat == 0
Вызов неблокирующей блокировки:
47.476050 10.10.1.40 -> 10.10.1.14 NLM 282 V4 LOCK Call FH:0xf6b3519c svid:6 pos:0-0 nlm.lock.caller_name == "centos-ad2012r2" nlm.exclusive == 1 nlm.block == 0
47.476647 10.10.1.14 -> 10.10.1.40 NLM 106 V4 LOCK Reply (Call In 102) nlm.stat == 0
51.908995 10.10.1.40 -> 10.10.1.14 NLM 266 V4 UNLOCK Call FH:0xf6b3519c svid:6 pos:0-0 nlm.lock.caller_name == "centos-ad2012r2"
51.909700 10.10.1.14 -> 10.10.1.40 NLM 106 V4 UNLOCK Reply (Call In 112) nlm.stat == 0
Клиент - Centos 6.5
Сервер - это Scientific Linux 6.2
Базовая файловая система - Lustre. Проблема может иметь ту же причину, что и эта другая проблема:
Интерфейс асинхронной блокировки делает что-то немного дрянное для блокирования блокировок - вместо того, чтобы ждать ответа файловой системы, он просто немедленно отправляет отказ (даже если блокировка действительно может быть доступна), а затем отвечает позже предоставленным сообщением, когда обнаруживает это доступно.