Остановка Thrift-сервера (TSimpleServer) - PullRequest
3 голосов
/ 19 ноября 2011

У меня есть простой сценарий использования Thrift Server (TSimpleServer), в котором у меня есть несколько потоков (кроме основного потока).Один из вновь порожденных потоков входит в цикл событий Thrift (т. Е. server.serve()).Получив сигнал в главном потоке, я вызываю server.stop(), который вызывает ошибку, указанную ниже.

Сначала я подумал, что это неисследованное исключение.Однако оборачивание обоих вызовов server.serve() и server.stop() в try-catch не помогло изолировать проблему.Любые мысли / предложения (о том, что я должен делать)?Большинство учебных пособий / руководств / примеров по Thrift, похоже, говорят о запуске сервера, но, похоже, не упоминают сценарий остановки, любые советы / лучшие практики / предложения в этом отношении были бы хорошими.Спасибо.

Также я использую thrift-0.7.0.

Сведения об ошибке:

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)

Также вот трассировка стека:

#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: я добавил псевдокод для основного потока , поток благотворительного сервера и фоновая тема .

Редактировать 2: Кажется, я решил исходную проблему, как отмечено в моем ответе ниже.Однако это решение приводит к двум довольно нежелательным / сомнительным вариантам разработки: (i) мне пришлось ввести экономичную конечную точку, чтобы включить механизм остановки сервера; (ii) класс обработчика для экономной службы (который обычно требуется для создания экземпляра сервера).объект) теперь требует средства, чтобы дать сигнал серверу об остановке, вводя кольцевую зависимость сортов.

Будем весьма благодарны за любые предложения по этим вопросам / вариантам проектирования.

1 Ответ

2 голосов
/ 22 ноября 2011

Кажется, моя проблема возникла из-за моего кода / дизайна, в котором у меня был код обработчика сигнала в главном потоке, вызывая stop на сервере, который был запущен в «серверном потоке».Изменение этого поведения (как отмечено в фрагментах кода pastebin) помогло решить эту проблему.

...