| Предыдущий | Следующий |
| NAP_E_MISMATCHED_ID | NAP_E_ID_NOT_FOUND |
NAP_E_NOT_PENDING
При сигнале завершения запрос NAP уже не находится в состоянии ожидания
NAP_E_NOT_PENDING — это HRESULT 0x80270009 (знаковое десятичное значение -2144927735, беззнаковое десятичное значение 2150039561). AllStat на основании winerror.h описывает его так: «О завершении сообщено для запроса, который сейчас не находится в состоянии ожидания». Значение обозначает ошибку, имеет код средства 0x27 и поле кода 0x0009.
Для случая завершения запроса, который больше не ожидается этот HRESULT относится к устаревшей технологии Network Access Protection: NAP недоступна начиная с Windows 10, а современные выпуски Windows Server не содержат прежних ролей NAP, HRA и HCAP. Поэтому его следует учитывать при разборе времени жизни асинхронного запроса на поддерживаемых устаревших системах, в архивной телеметрии, компонентах совместимости или проектах миграции, не ожидая наличия прежней платформы на современном компьютере.
Владение асинхронной операцией уже завершилось
Этот результат защищает автомат асинхронных состояний. SHV может вернуть E_PENDING из Validate, а затем вызвать INapServerCallback::OnComplete в отдельном потоке. Завершение допустимо только для этого ожидающего запроса и в пределах времени жизни, принятого сервером NAP. Повторный обратный вызов, вызов после синхронного завершения или запоздалый вызов после истечения времени ожидания может обратиться к запросу, который больше не ожидает завершения.
Недопустимые схемы завершения
- Validate вернул S_OK, но рабочий поток всё равно вызвал OnComplete для того же запроса.
- Два рабочих пути конкурируют и оба пытаются завершить одну проверку с E_PENDING.
- Отмена или истечение времени ожидания завершили запрос до возврата серверной операции ввода-вывода.
- Указатель запроса сохранялся дольше документированного времени жизни и был повторно использован после начала новой проверки.
- Обработка ошибки вызывает OnComplete один раз после сбоя SetSoHResponse и второй раз из обычного продолжения успешного пути.
Телеметрия состояния ожидания
- Назначьте поколение проверки и записывайте возвращаемое значение Validate, подсказку времени ожидания, запуск рабочего потока, результат SetSoHResponse и время OnComplete.
- Фиксируйте, какой поток первым выполнил переход завершения и были ли состояние уже изменено отменой или истечением времени ожидания.
- Сохраняйте точную идентичность запроса, не записывая содержимое полезной нагрузки работоспособности.
- Отслеживайте незавершённые запросы для каждого SHV и обнаруживайте повторные терминальные переходы внутри компонента до вызова NAP.
Исправление асинхронного завершения
- Используйте один атомарный переход из состояния ожидания в завершённое, отменённое или просроченное состояние.
- Вызывайте OnComplete только тогда, когда Validate вернул E_PENDING для того же поколения запроса.
- Прекращайте хранить ссылки на запрос и обратный вызов сразу после завершения асинхронной операции.
- Учитывайте поколение в обратных вызовах серверной части, чтобы поздний результат не мог завершить заменивший запрос.
Отличие от соседних результатов NAP
NAP_E_SHV_TIMEOUT описывает отсутствие завершения за разрешённый интервал. NAP_E_NOT_PENDING описывает попытку завершить операцию после состояния ожидания или без него и может быть следствием такого тайм-аута. NAP_E_MISMATCHED_ID защищает корреляцию запроса и ответа на уровне пакетов, а не автомат состояний обратного вызова.
Повтор и восстановление
Не повторяйте OnComplete для завершённого объекта. Отбросьте поздний или повторный результат, освободите ссылки и позвольте новому запросу проверки создать собственный период ожидания. Если тайм-ауты происходят часто, исправьте задержку серверной части или параллелизм SHV, а не продлевайте владение старыми объектами запросов.
Практический сценарий
SHV возвращает E_PENDING и запускает два резервирующих друг друга серверных запроса. Первый задаёт SoHResponse и завершает запрос; второй позднее вызывает OnComplete и получает NAP_E_NOT_PENDING. Отмена остальных запросов после первого терминального результата предотвращает повторное завершение.
Ссылки
- Microsoft: константы ошибок NAP
- Microsoft: асинхронная проверка SHV
- Microsoft: INapServerCallback::OnComplete
- Microsoft: интерфейсы NAP
Нужно найти другой код? Найти другой код состояния или ошибки.