Автор: Савенко Дмитрий
Дата создания: 10.10.2005
Версия: 0.1
Дата последнего изменения: 11.10.2005
Этот механизм реализует две функции. Во-первых, когда набирается достаточное количество положительных результатов ("кворум"), валидатор сравнивает их и определяет, достигнут ли "консенсус". Метод сравнения результатов (оторый, возможно, потребует учета особенностей работы разных платформ с числами с плавающей точкой) и способ определения консенсуса (например, лучшие два из трех) должны быть реализованы приложением. Если консенсус достигнут, точный результат назначается "каноническим" (см. описание assimilator'a).
Во-вторых, если результат, полученный с помощью при шаге 1, уже был достигнут ранее, новый результат сравнивается с каноническим, что дает возможность определить, давать пользователю кредит или нет.
Система BOINC предоставляет каркас валидатора (validator.c). Для создания валидатора всего лишь нужно дописать две функции:
int check_set(vectorresults, DB_WORKUNIT& wu, int& canonicalid, double& credit, bool& retry);
check_set() получает набор результатов (только успешно исполненные). Она читает и сравнивает их выходные файлы. Если среди них есть удовлетворительный, она выбирает его как канонический и возвращает его идентификатор. В этом случае она также возвращает кредит, который положен пользователю за вычисление данного рабочего модуля.
Если выходной файл результата имеет невосстановимую ошибку (например, его просто нет), функция должна пометить (в памяти, не в базе данных) результат как ошибочный, установив следующие флаги:
outcome=RESULT_OUTCOME_VALIDATE_ERROR validate_state=VALIDATE_STATE_INVALIDДля получения имен файлов и установки, восстановимые ошибки или нет, нужно использовать функции BOINC, описанные тут.
Если канонический результат найден, check_set() должна установить в памяти флаг validate_state в неошибочное значение (VALIDATE_STATE_VALID).
Если в ходе работы появилась устранимая ошибка (например, нужная файловая система не монтирована), функция должна вернуть retry=true. Тогда обработка будет повторена через несколько часов.
Функция должна возвращать ненулевое значение, если появилась серьезная ошибка. При этом валидатор запишет сообщение об ошибке и закроется.
int check_pair(RESULT& new_result, RESULT& canonical_result, bool& retry);
Сравнивает новый результат с каноническим. Если нет ошибок, должна установить validate_state в VALIDATE_STATE_VALID ИЛИ VALIDATE_STATE_INVALID.
При неустранимой ошибке в работе с выходным файлом любого из двух результатов функция должна установить флаг outcome нового результата в VALIDATE_ERROR.
При устранимой ошибке retry должно быть установлено в true.
Функция должна возвращать ненулевое значение, если появилась серьезная ошибка. При этом валидатор запишет сообщение об ошибке и закроется.
Ни одна из этих функций не должна содержать удаления файлов или прямых обращений к базе данных. Более детальное описание доступно здесь.
Доступна также два примера корректных валидаторов (simple_bitwise_validator и simple_trivial_validator)
Валидатор имеет следующие аргументы командной строки:
-app appname
Имя приложения. Этот параметр обязателен, все остальные можно не
задавать.
-one_pass_N_WU N
Проверять не более N рабочих модулей, затем завершаться.
-one_pass
Сделать один проход по таблице рабочих модулей и завершиться.
-mod n i
Проверять только те рабочие модули, у которых (id mod n) == i.
Эта опция позволяет запустить несколько валидаторов для увеличения
производительности.