2013-07-08 1 views
2

У меня есть веб-приложение, которое должно быть спокойным интерфейсом. Поэтому у меня есть обработчик соединения, который пытается изменить входящий запрос на то, что может использовать gwan.GWAN завершение под нагрузкой

Каждое подключение к этой услуге то же самое, так что я делаю замену на каждом соединении:

#include "gwan.h" // G-WAN exported functions 

    #include <stdio.h> 
    int init(int argc, char *argv[]){ 
    u32 *states = (u32*)get_env(argv, US_HANDLER_STATES); 
    *states = 1 << HDL_AFTER_READ; // we assume "GET /hello" sent in one shot 
    return 0; 
    } 

    void clean(int argc, char *argv[]){} 

    int main(int argc, char *argv[]) 
    { 
    const long state = (long)argv[0]; 
    if(state == HDL_AFTER_READ) { 
     xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF); 
     xbuf_replfrto(read_xbuf, read_xbuf->ptr, read_xbuf->ptr + 16, "/classify.htm?", "/?boost.cpp&"); 
    } 

    return 255; 
    } 

Проблема в том, под нагрузкой, через некоторое время, G-WAN падает и дать мне ошибка:

G-WAN 4.3.14 (pid:20477) 

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct NULL not valid 


Signal  : 6:Abort 
Signal src : -6:tkill 
errno   : 0 
Thread  : 2 
Code Pointer: 7fc5dcd748a5 (module:libc.so.6, function:raise, line:0) 
Access Address: 000000004ffd 

Registers  : EAX=000000000000 CS=00000033 EIP=7fc5dcd748a5 EFLGS=000000000202 
       EBX=0000006693e8 SS=0000000a ESP=7fc5d5c7bf38 EBP=7fc5880008d8 
       ECX=ffffffffffffffff DS=0000000a ESI=00000000504e FS=00000033 
       EDX=000000000006 ES=0000000a EDI=000000004ffd CS=00000033 

Module   :Function  :Line # PgrmCntr(EIP) RetAddress FramePtr(EBP) 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
Aborted (core dumped) 

Проблема только в том, что я поставил сервер под нагрузкой. С одной машиной я набираю около 8000 запросов/сек, и она длится около 5 секунд перед сбоем.

Если я НЕ делать рерайт (двигаться main.c к main.c_) и вызывать сценарий CPP непосредственно, без аварии ...

Помощь! Есть идеи?

Благодаря

+0

Я предлагаю вам переписать * «на месте» *, используя ту же длину для источника и адресата. Это сделает вещи намного быстрее и надежнее, чем игра с перераспределением памяти («Abort» выполняется GLIBC и не обрабатывается обработчиками сигналов). – Gil

ответ

0

Добавить надлежащие проверки возвращаемого значения, не берите ничего, как само собой разумеющееся.

Похоже, что get_env терпит неудачу и возвращает NULL, но для вас есть много todo (gdb, strace, ..), поэтому кто-то может вам помочь.

+1

Самая большая проблема здесь не является источником для самого сервера g-wan ... сделайте a gdb bt, и он ничего не дал. Кроме того, они имеют некоторую защиту от отладчиков .. SegFaults при запуске с gdb или strace .... –

+0

А, ок, никогда не было здесь о gwan раньше, так извините. Не может помочь вам, кроме того, что вам нужно проверить возвращаемые значения 'get_env' – drahnr

+0

Просто попробовал это! обернул xbuf_replfrto внутри if (read_xbuf! = NULL) .... Тот же результат ... –

1

Это было в другой части кода ... самая большая подсказка была. Похоже, я получал исключение из C++ без обработки.

Согласно документации, G-Ван написан на C.

впились в мой код, и добавил некоторые обработку исключений вокруг, где я подозревал, что код был сбой, и я видел исключение, но сервер продолжал идти , что я и хотел!

Отрывок, где я установил его:

try { 
    get_arg("key=",&name,argc,argv); 
    string url = name; 

    boost::thread cls(classify_url,url,boost::ref(rp)); 
    if(!cls.timed_join(boost::posix_time::milliseconds(8))) { 
    cls.interrupt(); 
    rp="{\"c\": [998]}"; 
    } 
} 
catch(...) { 
    rp="{\"c\": [997]}"; 
    cout << "EXCEPTION" << endl; 
} 

Добавлена ​​попытка/поймать, и все хорошо!

+0

Я предлагаю вам переписать * «на месте» *, используя ту же длину для источника и адресата. Это сделает вещи намного быстрее и надежнее, чем игра с перераспределением памяти («Abort» выполняется GLIBC и не обрабатывается обработчиками сигналов). – Gil

 Смежные вопросы

  • Нет связанных вопросов^_^