Когда fcntl в солярисе вернет значение меньше -1 для F_SETLKW

С тех пор как Mannul из fcntl в Solaris, после успешного завершения значение, возвращаемое для F_SETLKW, будет равно «Значение, отличное от -1». Но исходный код Apache httpd 1.3.41 (http_main.c) проверяет, является ли возвращаемое значение положительным, например:

int ret;

while ((ret = fcntl(lock_fd, F_SETLKW, &unlock_it)) < 0 && errno == EINTR) {
    /* nop */
}

if (ret < 0) {
    ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
                "fcntl: F_SETLKW: Error getting accept lock, exiting!  "
                "Perhaps you need to use the LockFile directive to place "
                "your lock file on a local disk!");
    clean_child_exit(APEXIT_CHILDFATAL);
}

В очень редком случае apache в одной из наших систем выйдет из-за неудачного теста. Я подозреваю, что это было вызвано отрицательным значением меньше -1, возвращаемым fcntl.

Так когда же fcntl в солярисе вернет значение меньше -1?

13.10.2009 05:03:11
1 ОТВЕТ
  1. в вашем примере кода fcntl возвращает <0 (например, -1, вы знаете), значит, могут возникнуть ошибки, если errno не был EINTR, а если errno == EINTR (прервано), это не ошибка, просто предложите повторить попытку.
  2. "From mannul of fcntl in solaris. После успешного завершения значение, возвращаемое для F_SETLKW, будет иметь значение, отличное от -1", что означает, что в случае успеха возвращается 0 или> 0, "> = 0" - это значение, отличное от -1, а не < -1 как вы уже догадались.
0
13.10.2009 05:51:21
Я могу понять эти фрагменты кода, но с некоторым беспокойством, что условие, чтобы судить, если fcntl не удалось. Из mannul Solaris, fcntl может вернуть значение, равное -2, при успешном завершении. В этом коде apache завершит работу с ошибкой msg. Это проблема? Кроме того, похоже, что fcntl почти не возвращает значение меньше -1 при успешном завершении. Мой вопрос в том, когда это произойдет.
user166346 13.10.2009 07:08:35
Fcntl возвращает -1. Причина, по которой он выйдет, заключается в том, что он может не получить блокировку, когда Solaris при высоких нагрузках, в этом случае fcntl возвращает -1 по-прежнему, а errno - ENOLCK, в то время как Apache сообщает тот же журнал ошибок, что и другие ошибки, основанные на приведенном выше. код. Отчеты ENOLCK при высоких нагрузках - это известная проблема Solaris.
Test 14.10.2009 07:27:32
поэтому ваши правильные действия должны быть: проверить, взломав код apache для записи возвращаемого значения и errno. Вы нашли, что было основной причиной.
Test 14.10.2009 07:45:33
Да, это один из вариантов. Но в последний раз это произошло месяц назад. Даже если я воспроизвожу это, я все еще не знаю, что делает поведение fcntl таким.
user166346 14.10.2009 13:18:12