head     1.1;
branch   1.1.1;
access   ;
symbols  init:1.1.1.1 winchild:1.1.1;
locks    ; strict;
comment  @# @;


1.1
date     2008.10.13.04.17.41;  author winchild;  state Exp;
branches 1.1.1.1;
next     ;

1.1.1.1
date     2008.10.13.04.17.41;  author winchild;  state Exp;
branches ;
next     ;


desc
@@



1.1
log
@Initial revision
@
text
@* non-block socket을 위해 sender에서 write시 ewouldblock error가 리턴되면 전송하려던 데이터를 다시 sender의 원형큐에 삽입해서 다음번에 다시 보내도록 한다. 그리고 ewouldblock error가 나오기전에 데이터의 일부만 전송하고 리턴했을수도 있으므로 여기에 대한 대비도 한다. 그리고 현재 sender는 receiver와 달리 select로 polling을 하지 않고 바로 데이터를 보내도록 되어있는데 non-block mode에서는 select 사용을 고려해본다.
--> select는 사용하지 않고 write시 EAGAIN이 나오면 전송 못한 부분을 다시 전송하도록 sender의 원형큐에 패킷을 다시 삽입한다. 테스트 안해봤음!!
--> 문제발생!!!!!!!!!!!! 전송 못한 부분을 원형큐에 다시 삽입하면 해당 패킷이 다시 전송되기 전에 큐에 대기하고 있던 다른 패킷이 먼저 전송될수가 있다. 그래서 마스터 서버가 제대로 처리를 못한다. 젠장!!! 

* non-block socket 사용시 receiver는 현재 루틴을 그대로 사용해도 문제가 없을걸로 생각된다. 어차피 select에서 readable일 경우에만 read를 시도하니까. 그렇지 않은가?
--> 아니다. 현재 receiver가 소켓에서 PXEPacket 사이즈 만큼 read하려고 시도하는 만약 에이전트가 PXEPacket의 일부만 보내고 블럭되었을 경우 소켓의 read buffer에는 PXEPacket 사이즈만큼의 데이터가 들어와있지 않다. 여기서 바로 readn()에서 블럭이 된다. 그냥 read()를 할까? 아니면 다른 방법? 소켓마다 middle buffer를 만들까?
--> sender는 EAGAIN되면 전송 못한 부분을 다시 전송하도록만 하면 되는데 receiver는 그리 간단하지가 않다. 일단 일부만 받은 패킷을 저장하고 있어야 하고 다음번 패킷을 수신할때 이미 잘린 패킷을 받았으면 기존 루틴과는 다르게 패킷을 수신해서 기존것과 합치고 완벽한 패킷이 나오면 대상 쓰레드로 전송해야 한다. 완벽한 패킷이 안나오면 다시 위 과정을 반복하고.. 하다가 시간이 부족해서 다시 roll-back해서 receiver는 non-block 처리가 안되어있다.
--> support.c에서 readn() 함수는 EAGAIN시 재시도 하도록 되어있다.
--> 문제발생!!!!!!!!!!!! sender에서 구현했던 non-block 코드에 문제가 있었다. non-block 모드 전면 보류!!!

* non-block 구현은 아무래도 middle buffer를 만들고 read / write 쓰레드를 좀 고쳐서 구현하는게 제일 좋은 방법이 아닐까??
@


1.1.1.1
log
@initial version
@
text
@@
