m_shutdown_rd_fd(-1),
m_shutdown_wr_fd(-1),
going_down(false),
- data_size(0)
+ data_size(0),
+ skipped(0)
{
}
int OutputDataSocket::dump_data(int fd)
{
m_lock.lock();
- list<bufferlist> l = std::move(data);
+ vector<buffer::list> l = std::move(data);
data.clear();
data_size = 0;
m_lock.unlock();
- for (list<bufferlist>::iterator iter = l.begin(); iter != l.end(); ++iter) {
+ for (auto iter = l.begin(); iter != l.end(); ++iter) {
bufferlist& bl = *iter;
int ret = safe_write(fd, bl.c_str(), bl.length());
if (ret >= 0) {
std::lock_guard l(m_lock);
if (data_size + bl.length() > data_max_backlog) {
- ldout(m_cct, 20) << "dropping data output, max backlog reached" << dendl;
+ if (skipped % 100 == 0) {
+ ldout(m_cct, 0) << "dropping data output, max backlog reached (skipped=="
+ << skipped << ")"
+ << dendl;
+ skipped = 1;
+ } else
+ ++skipped;
+ return;
}
- data.push_back(bl);
+ data.push_back(bl);
data_size += bl.length();
-
cond.notify_all();
}
bool going_down;
uint64_t data_size;
+ uint32_t skipped;
- std::list<bufferlist> data;
+ std::vector<buffer::list> data;
ceph::mutex m_lock = ceph::make_mutex("OutputDataSocket::m_lock");
ceph::condition_variable cond;
-
- bufferlist delim;
+ buffer::list delim;
};
#endif