mfavant / tubekit

NEW PROJECT https://github.com/crust-hub/avant
MIT License
0 stars 0 forks source link

feat: better app buffer #31

Closed gaowanlu closed 3 months ago

gaowanlu commented 3 months ago
    // stream_task websocket_task读出recvbuffer还能接收多少len数据
    // read from socket 最大len数据
    // do_task保证再为client触发一次task,下次task读不出数据自然不会再分配task
    // process
    // process时如果recvbuffer满了都没解析到包则将conn mark_close掉了 说明发的包超过最大限制了
    // 读解决了则需要考虑下sendbuffer比较完美的解决方案 已经有了m_wait_send_buffer机制
    // 根据系统的具体情况可以适当调整m_wait_send_buffer的大小,因为写内容时先从m_wait_send_buffer
    // 拉到send_buffer中的,发送缓冲是双缓冲,其实已经比较好的解决此问题,可以设计机制当wait_send_buffer满了也直接
    // 将conn mark_close掉
    // http 需要加一些 app层的hook,如on_header on_body之类的
    // 为各app缓冲区大小提供配置ini
gaowanlu commented 3 months ago

主要就是优先优化下stream conn和websocket conn的sock2buf,进函数先判断下上次读出来的能不能写进buf能则没问题,否则返回false,然后再从socket中读,哪怕没写进recvbuff这没问题,预定一个task就行,因为sock2buf后会解包,下次task时recvbuf理应有足够的空间再写入一个包

gaowanlu commented 3 months ago
    else if (sock2buf_data_len > 0)
    {
        try
        {
            m_recv_buffer.write(sock2buf_inner_buffer, sock2buf_data_len);
        }
        catch (const std::runtime_error &e)
        {
            LOG_ERROR("%s", e.what());
            return false;
        }
        sock2buf_data_len = 0;
        return true;
    } 异常则预定一次task
gaowanlu commented 3 months ago

发送缓冲自带安全机制,有一点是sendbuffer大小必须大于buf2sock内的tempbuffer大小,当mwaitsendbuffer满时发不出去可以由应用app层决定conn的去留

gaowanlu commented 3 months ago

true { bool have_data = false; while (true) { char temp_buffer[1024]; int temp_buffer_len = 0; try { temp_buffer_len = m_wating_send_pack.read(temp_buffer, 1024); } catch (const std::runtime_error &e) { LOG_ERROR(e.what()); } if (temp_buffer_len > 0) { have_data = true; try { int writed_len = m_send_buffer.write(temp_buffer, temp_buffer_len); if (writed_len != temp_buffer_len) { LOG_ERROR("write_len[%d] != temp_buffer_len[%d]", writed_len, temp_buffer_len); } } catch (const std::runtime_error &e) { LOG_ERROR(e.what()); } } else { break; } }应该设计最多将msendbuffer写满,就不要从mwait 里读出来数据了,确保不会读到tempbuf后导致数据丢失,需要为buffer组件搞一个获取其最多还有多少空间可用的方法

gaowanlu commented 3 months ago

因为此时可能有其他地方在向mwait一直写数据导致,这里一直从mwait里读出数据,导致无法写入sendbuf

gaowanlu commented 3 months ago

判断下sendbuf 是否还有大于tempbuf最大长度的剩余空间,如果不能存放下一个tempbuf最大内容,就不要再从mwait读了

gaowanlu commented 3 months ago

https://github.com/crust-hub/tubekit/commit/22fa28e19c457aea65de69612a8e35b972d43661