| 1892 | } |
| 1893 | |
| 1894 | void OnAccept(TTcpAcceptor* a, TAtomicSharedPtr<TTcpSocket> s, const TErrorCode& ec, IHandlingContext&) { |
| 1895 | if (Y_UNLIKELY(ec)) { |
| 1896 | if (ec.Value() == ECANCELED) { |
| 1897 | return; |
| 1898 | } else if (ec.Value() == EMFILE || ec.Value() == ENFILE || ec.Value() == ENOMEM || ec.Value() == ENOBUFS) { |
| 1899 | //reach some os limit, suspend accepting |
| 1900 | TAtomicSharedPtr<TDeadlineTimer> dt(new TDeadlineTimer(a->GetIOService())); |
| 1901 | dt->AsyncWaitExpireAt(TDuration::Seconds(30), std::bind(&THttpServer::OnTimeoutSuspendAccept, this, a, dt, _1, _2)); |
| 1902 | return; |
| 1903 | } else { |
| 1904 | Cdbg << "acc: " << ec.Text() << Endl; |
| 1905 | } |
| 1906 | } else { |
| 1907 | if (static_cast<size_t>(HttpInConnCounter()->Val()) < HttpInConnLimits()->Hard()) { |
| 1908 | try { |
| 1909 | SetNonBlock(s->Native()); |
| 1910 | PrepareSocket(s->Native()); |
| 1911 | TConn::Create(*this, s); |
| 1912 | } catch (TSystemError& err) { |
| 1913 | TErrorCode ec2(err.Status()); |
| 1914 | Cdbg << "acc: " << ec2.Text() << Endl; |
| 1915 | } |
| 1916 | } //else accepted socket will be closed |
| 1917 | } |
| 1918 | StartAccept(a); //continue accepting |
| 1919 | } |
| 1920 | |
| 1921 | void OnTimeoutSuspendAccept(TTcpAcceptor* a, TAtomicSharedPtr<TDeadlineTimer>, const TErrorCode& ec, IHandlingContext&) { |
| 1922 | if (!ec) { |
nothing calls this directly
no test coverage detected