Erlang

Erlang List 변수 처리-로직 변경

메롱씨티 배드맨 2012. 4. 9. 18:38

지난번에 만들었던 리스트 변수는 Chat-Server에서 Accepted Socket을 관리하기 위한 용도였다.

이번에는 Web-server에서 해당 Session에서 HTTP Header 정보를 저장하기 위한 용도로 사용하려고 하였다.


Web-server에는 Request Session이 다수 발생하게 된다.

그래서 각 Sesion별 HTTP Header 정보를 저장할 변수가 Session 별로 필요하게 된다.

그런데 RPC형 리스트 변수는 하나만 생성된다.

Chat-Server 에서는 서버 하나당 하나의 변수만 있으면 되었기에 문제가 안되었지만, Web-server 처럼 다수의 변수가 필요한 경우에는 문제가 된다.

그럼 결국엔 하나의 변수에서 Session 별 HTTP Header 정보를 모두 저장하고 있다가, Session이 종료되면 종료된 Session 정보를 삭제해야 한다.


그래서 RPC변수에 각 Session의 생성 P-ID를 키로 해서 저장하고, 이 프로세스가 종료될때 P-ID에 해당하는 정보를 삭제하도록 RPC변수에 로직을 변경했다.


전체적인 흐름은 아래와 같다.





client 에서의 Request 요청시 Web-server는 RPC변수에 key-word (여기서는 Process ID이다.) 로 데이터 추가 요청을 한다.

session종료될 시에는 RPC변수에 key-word에 해당하는 데이터 삭제 요청을 하게 된다.


RPC리스트형 변수에 리스트를 데이터로 저장하고, 삭제도 리스트 단위로 복수개를 해야 한다.


저장된 데이터는 다음과 같다.


["<PID 0.35>", "METHOD", {"GET", "/index.html", "id=123&date=20120312"}],

["<PID 0.35>", "ACCEPT", {"mozila 5.0"}],

["<PID 0.43>", "METHOD", {"GET", "/admin/admin.html", "id=222"}],

["<PID 0.43>", "ACCEPT", {"mozila 5.5"}],

................................


[KEY-WORD, DATA, {DATA}] 이런 형식으로 저장된다.


저장은 사실 별 문제가 안된다.

삭제에는 로직이 필요하다.

일단 검색을 해야 되고, key-word에 해당하는 리스트를 찾았을 경우 삭제 루틴을 타야 한다.


다음은 전체 소스이다.





지난번 리스트와 기본적인 형태는 비슷하므로 중복되는 부분의 설명은 생략한다.


시작시에 시작되는 빈 리스트는 [key-word, data] 형태로 생성한다.

이 역시 시작 후 바로 삭제하도록 한다.


리스트에서 데이터를 삭제하기 위해 delList 함수가 있었으나 이 함수 앞에 새로운 함수를 추가하였다.

ldel 함수는 3개의 parameter를 받는다.

첫번째 파라미터는 온전한 List 값이다 

두번째 파라미터는 리스트의 마지막을 찾아서 Search 및 삭제를 끝내기 위해 Tail을 받는 남은 리스트 값이다.

세번째 파라미터는 삭제하기 위한 Key-word 값이다.


if문의 조건은 리스트의 끝을 판단할 남은 리스트 파라미터로 부터 남은 값이 몇개인지 카운트 하는 length 이다.

0 이면 온전한 리스트인 OL을 리턴하고 끝낸다.

0이 아니라면 PID로 Search 및 삭제할 루틴으로 간다.


리스트의 남은 부분인 (함수 호출 맨 처음 루프에서는 온전한 리스트가 넘어올 것이다) L을 Header와 Tail로 분리한다.

Header는 다시 PID를 비교하기 위해 

H를 [AID, _, _] 로 대입한다. key-word 이외의 값은 필요없으므로 그냥 버린다.

만약 PID가 맞다면 이 리스트 자체를 삭제한다.

기존에 있던 삭제 함수인 delList 함수를 통해 이 리스트는 삭제하고

다음 삭제할 값을 찾기 위해 ldel 함수를 호출한다.

이때 삭제된 리스트를 오리지널 함수로, 또 남은 리스트 파라미터에도 삭제된 리스트를 넘긴다.

이어서 찾는 값이 아닌 경우

오리지널 리스트는 그대로 넘기고 이번에 검색한 데이터는 검색에서 빠지도록 Tail을 남은 리스트로 넘긴다.


아래는 실행 결과이다.





1> 에서 리스트 변수가 시작되었다.

     이 리스트에는 ["0","0",{"0"}] 값이 들어가 있다.

3> 에서 이 리스트를 삭제했다.

4> ~ 7> 까지 위에서 설명한 데이터 4개를 두개의 PID (key-word)로 입력했다.

8> 에서 PID 0.35를 삭제하도록 했다.

삭제 후 데이터는 PID 0.43의 두개의 데이터만 남았다.