2011-11-19 2 views
3

Thrift 서버 (TSimpleServer)에 대한 간단한 사용 예가 있는데 여기에는 (메인 스레드 외에) 몇 개의 스레드가 생성되었습니다. 새로 생성 된 스레드 중 하나가 Thrift 이벤트 루프에 들어갑니다 (예 : server.serve()). 메인 스레드에서 신호를 받으면 아래에 게시 된 오류의 원인이되는 server.stop()을 호출합니다.Thrift 서버 중지 (TSimpleServer)

처음에는 그것이 잡히지 않은 예외라고 생각했습니다. 그러나 server.serve()server.stop()의 호출을 모두 try-catch에 배치해도 문제를 격리하는 데 도움이되지 않습니다. 어떤 생각/제안 (내가해야 할 일에 대해)? 대부분의 중고품 튜토리얼/가이드/예제는 서버 시작에 대해 이야기하는 것 같지만 중지 시나리오는 언급하지 않는 것 같습니다.이 점에 대한 모든 포인터/모범 사례/제안은 훌륭합니다. 감사.

또한 중고율이 0.7.0입니다.

오류 정보 :

#0 0x00007fb751c92f08 in ??() from /lib/libc.so.6 
#1 0x00007fb7524bb0eb in apache::thrift::server::TSimpleServer::serve (
    this=0x1e5bca0) at src/server/TSimpleServer.cpp:140 
#2 0x000000000046ce15 in a::b::server_thread::operator() (
    this=0x695f18) 
    at /path/to/server_thread.cpp:80 
#3 0x000000000046c1a9 in boost::detail::thread_data<boost::reference_wrapper<a\ 
ds::data_load::server_thread> >::run (this=0x1e5bd80) 
    at /usr/include/boost/thread/detail/thread.hpp:81 
#4 0x00007fb7526f2b70 in thread_proxy() 
    from /usr/lib/libboost_thread.so.1.40.0 
#5 0x00007fb7516fd9ca in start_thread() from /lib/libpthread.so.0 
#6 0x00007fb7519fa70d in clone() from /lib/libc.so.6 
#7 0x0000000000000000 in ??() 

편집 : 1 :

Thrift: Fri Nov 18 21:22:47 2011 TServerTransport died on accept: TTransportExc\ 
eption: Interrupted 
*** glibc detected *** ./build/mc_daemon: munmap_chunk(): invalid poi\ 
nter: 0x0000000000695f18 *** 
Segmentation fault (core dumped) 

또한 여기에 스택 트레이스의 나는 main thread에 대한 의사 코드를 추가 한의 thrift server threadbackground thread.

편집 2 : 아래의 내 대답에 표시된 원래 문제를 해결 한 것 같습니다. 그러나이 솔루션은 두 가지 다소 바람직하지 않거나 의문의 여지가있는 디자인 선택을 초래합니다. (i) 서버를 중지하는 메커니즘을 가능하게하는 중고품 엔드 포인트를 도입해야했습니다. (ii) 서버를 인스턴스화하는 데 필요한 보통 서비스의 핸들러 클래스 객체)에는 이제 서버에 신호를 보내는 방법이 필요합니다. 즉, 순환 종속성을 도입해야합니다.

이러한 디자인 문제/선택 사항에 대한 제안은 크게 감사하겠습니다.

+0

메모리 손상과 유사합니다. 신호 처리기는 어떻게 코딩 되었습니까? –

+0

신호 처리기는 주 스레드가 모니터링하는 플래그를 설정합니다. 설정시 주 스레드는 다른 스레드에서 실행중인 서버 인스턴스에서 중지를 호출합니다. 이것은 no-no, multi-threading + thrift 초보자가 아닌지 확실하지 않습니다. –

+0

질문을 신호 처리기 코드로 업데이트하십시오. 문제를 시연하는 [짧고 자체 포함 된 올바른 예제] (http://sscce.org/)를 게시 할 수 있으면 유용 할 것입니다. –

답변

2

내 문제는 내 코드/디자인에서 나는 서버 스레드에서 시작된 서버에서 stop을 호출하는 주 스레드에서 신호 처리기 코드를 사용하고있는 것으로 보입니다. 이 동작을 변경하면 (pastebin 코드 스 니펫 참조)이 문제를 해결하는 데 도움이됩니다.