0
solaris의 fcntl의 Mannul에서 성공적으로 완료되면 F_SETLKW에 대해 반환 된 값은 "-1 이외의 값"이됩니다. 그러나 아파치 아파치 1.3.41 소스 코드 (http_main.c) 반환 값이 같은 긍정적 있는지 확인 : 매우 드문 경우solaris의 fcntl은 F_SETLKW에 대해 -1보다 작은 값을 반환합니다.
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);
}
, 우리의 시스템 중 하나에서 아파치이의 beacuse이 테스트에 실패 종료됩니다. 나는 이것이 fcntl에 의해 반환 된 -1보다 작은 음의 값에 기인 한 것으로 의심된다.
그래서 언제 solaris의 fcntl이 -1보다 작은 값을 리턴합니까? 코드 샘플에서
나는이 코드 스 니펫을 이해할 수 있지만, fcntl이 실패했는지를 판단하는 데 약간의 걱정거리가있다. solaris의 mannul에서 fcntl은 성공적으로 완료되면 -2와 같은 값을 반환 할 수 있습니다. 이 코드에서 아파치는 오류 메시지와 함께 종료됩니다. 이게 문제가 되나요? 게다가 fcntl은 성공적으로 완료되면 -1보다 작은 값을 반환하지 않습니다. 제 질문은 이것이 언제 일어날 것인가입니다. –
아니요. fcntl은 -1을 반환합니다. 그 이유는 Apache가 높은 부하를 받고있는 Solaris (이 경우 fcntl은 -1을 반환하고 errno는 ENOLCK)와 Apache가 위에서 기반한 다른 오류와 동일한 오류 로그를보고 할 때 잠금을 얻지 못할 수 있기 때문입니다 암호. 높은 부하 상태에서의 ENOLCK 보고서는 Solaris의 알려진 문제입니다. – Test
당신의 적절한 조치는 다음과 같아야합니다. 반환 값과 errno를 로그하는 아파치 코드를 해킹하여 확인하십시오. 근본 원인을 발견하게 될 것입니다. – Test