2020-11-02(Mon)

  1. 학습 날짜 // 2020-11-02(월)

  2. 학습시간 // 9:00~22:00

  3. 학습 범위 및 주제 // Select 함수 동작

  4. 동료 학습 방법 // sanam, yohai 님과 토의함

  5. 학습 목표 // Request / Response 동작의 오류를 확인하고 해결한다.

  6. 상세 학습 내용

문제) body가 없는 요청을 날리면 server가 응답하지 않는다.

해결) body가 없을 때도 WRITE_FDSET이 셋팅되도록 예외처리하였다.

지금까지는 요청의 Request line, headers line 까지만 우선 읽은 다음, body를 읽어보낼 필요가 없는지 여부를 확인하고, body를 읽을 필요가 없다면 FdTypeMUST_CLEAR로 셋팅하고 READ_FDSET 을 설정하여, client socket의 Buffer 모두 읽어 비워낼 때까지 재차 read한 후, EOF를 만나면 WRITE_FDSET을 셋팅하도록 하였다.

만약 요청이 Request line, headers line까지만 도착했더라도 MUST_CLEAR로 셋팅된 후 buffer를 비우는 처리흐름에서 바로 'EOF'를 만날 뿐, 정상적으로 WRITE_FDSET이 셋팅시킬 것이다.

..라고 생각했는데 함정이 있었다. READ_FDSET 을 셋팅했더라도 buffer가 비어있다면 SELECT 함수가 자체적으로 FDCLR를 한다..!

이를 간과했기 때문에 요청에 처음부터 body가 포함되어있지 않다면, Request line과 headers line까지 읽은 시점에서 buffer가 모두 비워져버리고, SELECT 함수를 거쳤을 때 FDCLR 되면서 해당 fd는 다시 read sequence로 들어가서 WRITE_FDSET 을 할 기회가 사라지게 된다.

따라서 요청에 처음부터 body가 포함되어있지 않다면, MUST_CLEAR 로 셋팅하지 않고 바로 COMPLETE로 셋팅하여 WRITE_FDSET도 셋팅해버리는 동작을 추가하여 해결하였다.

  1. 학습 내용에 대한 개인적인 총평

SELECT 함수의 예상치 못한 동작 때문에 미궁에 빠졌었습니다. 숙지했다고 생각했는데 이해가 부족한 부분이 있었네요. 반성할 점은 아래 세 가지입니다.

1) 무언가를 쓸 때 확실히 숙지하고 쓸 것

2) 확실히 숙지하지 못한 부분이 있는지 계속 의심해볼 것

3) log를 찍어서 추적하는 접근을 견지할 것

이와 별개로 PageGenerator 부분을 sanam님께 부탁드렸는데 참 잘 만들어주셔서 감사했습니다.

다음 학습 계획

  • Static resource 를 Response body로 만드는 모듈 구현

Last updated