PushCustomMessage 데드락 문제

125 views
Skip to first unread message

인규 최

unread,
Mar 14, 2012, 1:45:54 AM3/14/12
to HalfNetwork
안녕하세요.

HalfNetwork 엔진으로 작업중 궁금한 부분이 생겨서 문의드립니다.


PushCustomMessage 쪽에 문제인데요

제가 DB 메세지를 PushCustomMessage를 사용하여 처리를 하고있어서
PushCustomMessage 호출이 빈번합니다.

접속이 별로 없을 때는 괜찮았는데
스트레스 테스트 중 PushCustomMessage에서 데드락이 걸리는것 같습니다..


혹시 이에 관하여 확인 된 부분이 있거나 사용시 주의 할 점 같은것이 있으면 알려주시면 감사하겠습니다.


#define PUSH_DB_MSG( x ) ACE_Message_Block * mb=0; \
ACE_NEW_NORETURN( mb, ACE_Message_Block( x.GetBufferLength() +
1 ) ); \
mb->copy( (char*)x.GetBuffer(), x.GetBufferLength() +
1 ); \
NetworkInstance->PushCustomMessage( CLIENT_QUEUEID, mb );
\


위와 같은 디파인으로
HalfNetwork::ThreadPool를 상속 받은 클래스 안에서 호출 하고 있습니다.


엔진 소스로 따라가다 보니

bool MessageQueue::Push(uint8 queId, EMessageHeader command,
uint32 serial, ACE_Message_Block* block)

함수에서

return (-1 != m_queue.enqueue_tail(commandBlock));

이 리턴 전까지는 추적이 되는데
그 후로는 안되더라구요...


혹시나 짐작이 가시는 부분이 있으면 답변 부탁드리겠습니다.

감사합니다.

YoungGi Lim

unread,
Mar 14, 2012, 7:51:14 PM3/14/12
to halfn...@googlegroups.com
안녕하세요.

아마 큐가 꽉 차지 않았을까 추정됩니다.

기본적으로 큐안의 element수가 1024*16 보다 많은데 enqueue 가 들어오게 되면 블럭이 걸리게 되어있습니다.

PopMessage 나 PopAllMessage가 정상적으로 호출되고 있는지를 체크해보세요.


2012/3/14 인규 최 <kst...@gmail.com>

인규 최

unread,
Mar 16, 2012, 3:08:48 AM3/16/12
to HalfNetwork
안녕하세요. 답변 감사드립니다.

메인 루프에서 매번 PopAllMessage를 사용 하여 처리를 하고 있습니다

bool receiveData = NetworkInstance->PopAllMessage(&headBlock, -1);
if (false == receiveData)
return;

commandBlock = headBlock;
while(NULL != commandBlock)
{
printf("CGameServerMain::NetworkUpdate() While\n");

MessagePostee postee;
memcpy(&postee, commandBlock->rd_ptr(), sizeof(MessagePostee));
commandBlock->rd_ptr(sizeof(MessagePostee));
ACE_Message_Block* payloadBlock = commandBlock->cont();

switch(postee.command)
{


이런식으로 처리 하고있고요

PushCustomMessage를 하는 곳은 다른 쓰레드 인데
혹시 그것 때문에 생기는 문제는 없을가요?


저도 좀 더 알아보고 무언가 알게 되면 또 올리겠습니다.

감사합니다.

인규 최

unread,
Apr 3, 2012, 12:18:57 AM4/3/12
to HalfNetwork
안녕하세요.

아직까지 해결이 안되어
답답한 마음에 또 한번 글을 올려 봅니다..

메세지 큐의 카운트를 찍어본 결과

큐가 점점 쌓이더라도 보통 30을 넘어 가지 않은 상황에서
데드락이 일어납니다..

메인 쓰레드에서 PopAllMessage를 처리 하고

다른 DB용 쓰레드에서 PushCustomMessage를 하고 있는데

문제없나 싶기도 하고 답답합니다 ㅜㅜ


혹시나 확인 해봐야 할 부분이나
문제 해결에 도움이 될 사소한 부분이라도 있으면 알려주시면 정말 감사하겠습니다!

YoungGi Lim

unread,
Apr 3, 2012, 9:48:39 AM4/3/12
to halfn...@googlegroups.com
정리를 좀 해보자면,
  • 하나의 메인 스레드에서  PopAllMessage로 처리
  • 다수의 DB스레드에서  PushCustomMessage 호출
  • queue안에 element가 30개미만 인 상황에서 DB스레드에서 PushCustomMessage를 호출하다보면  block이 걸림
질문
  • 메인 스레드에서 DB처리 요청을 DB스레드로 보낼텐데, 어떻게 보내나요?
  • DB스레드에서 PushCustomMessage를 호출하는 이유는 DB작업이 완료 되었으니 꺼내서 처리하는 의미 인가요?
혹시 가능하시면 일부라도 소스를 제 메일로 보내주시면 살펴보도록 하겠습니다.
주석도 많이 달아서 주시면 해결에 도움이 될 것 같네요.

2012/4/3 인규 최 <kst...@gmail.com>

인규 최

unread,
Apr 4, 2012, 7:22:06 AM4/4/12
to HalfNetwork
답글 감사드립니다.


정리 부분은

- 하나의 메인 스레드에서 PopAllMessage로 처리
> 예 맞습니다.

- 다수의 DB스레드에서 PushCustomMessage 호출
> 다수의 스레드는 아니고 하나의 DB 스레드를 가지고 있습니다

- queue안에 element가 30개미만 인 상황에서 DB스레드에서 PushCustomMessage를
호출하다보면 block이 걸림
> 네 그렇습니다.


질문의 대한 답변을 드리자면

> HalfNetwork::ThreadPool를 상속 받은 DB클래스를

typedef ACE_Singleton<CDBLogic, ACE_Thread_Mutex> DBMng;
#define g_DBMng DBMng::instance()

이렇게 전역으로 사용 하고 있습니다.

사용은 g_DBMng->RequestQurey( (char*)Data.GetBuffer(),
Data.GetBufferLength() );

이런식으로 메인 스레드에서 호출 하고 있구요 (저기 Data는 쿼리를 날릴때 필요한 데이타입니다)

RequestQurey 함수에선 CDBLogic 클래스 안에 있는 리퀘스트 리스트에 추가하는 기능을 하고 있습니
다.

그리고 Update 함수에서 그 리스트를 pop하여 DB쿼리를 날리고
날려진 쿼리의 결과를 PushCustomMessage를 사용 하여 메인 스레드로 보내도록 하고 있습니다.

필요하신 부분의 소스가 있다면 전부 다는 아니더라도 어느정도 정리하여 보내드리겠습니다.
이렇게 신경 써주셔서 정말로 감사드립니다.


On 4월3일, 오후10시48분, YoungGi Lim <javawor...@gmail.com> wrote:
> 정리를 좀 해보자면,
>
> - 하나의 메인 스레드에서 PopAllMessage로 처리
> - 다수의 DB스레드에서 PushCustomMessage 호출
> - queue안에 element가 30개미만 인 상황에서 DB스레드에서 PushCustomMessage를
> 호출하다보면 block이 걸림
>
> 질문
>
> - 메인 스레드에서 DB처리 요청을 DB스레드로 보낼텐데, 어떻게 보내나요?
> - DB스레드에서 PushCustomMessage를 호출하는 이유는 DB작업이 완료 되었으니 꺼내서 처리하는 의미 인가요?


>
> 혹시 가능하시면 일부라도 소스를 제 메일로 보내주시면 살펴보도록 하겠습니다.
> 주석도 많이 달아서 주시면 해결에 도움이 될 것 같네요.
>

> 2012/4/3 인규 최 <ksty...@gmail.com>

인규 최

unread,
Apr 5, 2012, 2:53:50 AM4/5/12
to HalfNetwork
안녕하세요. 질문자입니다.


제가 소스를 보내드릴려고 정리를 하다 보니 의심나는 부분을 좀 발견했습니다...

엔진 쪽 문제가 아니라 저의 무지에서 나온 버그 인것 같아서 지금 그부분을 좀 보고 있습니다..


정확히 해결되면 다시 답글 남기겠습니다.


신경써주신 모든분들께 감사드립니다 ㅜㅜ

Reply all
Reply to author
Forward
0 new messages