Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Dec 2016 14:56:07 +0000 (UTC)
From:      Dmitry Marakasov <amdmi3@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r429360 - in head/security/i2pd: . files
Message-ID:  <201612241456.uBOEu73N075899@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: amdmi3
Date: Sat Dec 24 14:56:07 2016
New Revision: 429360
URL: https://svnweb.freebsd.org/changeset/ports/429360

Log:
  - Add upstream patch to avoid kqueue descriptor loss on daemonization, which leads to 100% cpu usage when using --daemon option

Added:
  head/security/i2pd/files/patch-fix-daemon-option-eating-100-cpu   (contents, props changed)
Modified:
  head/security/i2pd/Makefile

Modified: head/security/i2pd/Makefile
==============================================================================
--- head/security/i2pd/Makefile	Sat Dec 24 14:39:51 2016	(r429359)
+++ head/security/i2pd/Makefile	Sat Dec 24 14:56:07 2016	(r429360)
@@ -3,7 +3,7 @@
 
 PORTNAME=	i2pd
 PORTVERSION=	2.11.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	security net-p2p
 
 MAINTAINER=	amdmi3@FreeBSD.org

Added: head/security/i2pd/files/patch-fix-daemon-option-eating-100-cpu
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/security/i2pd/files/patch-fix-daemon-option-eating-100-cpu	Sat Dec 24 14:56:07 2016	(r429360)
@@ -0,0 +1,204 @@
+commit 442c63d7a4a447a120400fcb3428bfc2c1ec18cc
+Author: orignal <i2porignal@yandex.ru>
+Date:   Thu Dec 22 13:32:06 2016 -0500
+
+    #746. initialize io_service after daeminization
+
+diff --git Transports.cpp Transports.cpp
+index 1b9d52a1..b422297f 100644
+--- Transports.cpp
++++ Transports.cpp
+@@ -108,8 +108,8 @@ namespace transport
+ 	Transports transports;	
+ 	
+ 	Transports::Transports (): 
+-		m_IsOnline (true), m_IsRunning (false), m_Thread (nullptr), m_Work (m_Service), 
+-		m_PeerCleanupTimer (m_Service), m_PeerTestTimer (m_Service),
++		m_IsOnline (true), m_IsRunning (false), m_Thread (nullptr), m_Service (nullptr),
++		m_Work (nullptr), m_PeerCleanupTimer (nullptr), m_PeerTestTimer (nullptr),
+ 		m_NTCPServer (nullptr), m_SSUServer (nullptr), m_DHKeysPairSupplier (5), // 5 pre-generated keys
+ 		m_TotalSentBytes(0), m_TotalReceivedBytes(0), m_InBandwidth (0), m_OutBandwidth (0),
+ 		m_LastInBandwidthUpdateBytes (0), m_LastOutBandwidthUpdateBytes (0), m_LastBandwidthUpdateTime (0)	
+@@ -119,10 +119,25 @@ namespace transport
+ 	Transports::~Transports () 
+ 	{ 
+ 		Stop ();
++		if (m_Service)
++		{
++			delete m_PeerCleanupTimer; m_PeerCleanupTimer = nullptr;
++			delete m_PeerTestTimer; m_PeerTestTimer = nullptr;
++			delete m_Work; m_Work = nullptr;
++			delete m_Service; m_Service = nullptr;
++		}	
+ 	}	
+ 
+ 	void Transports::Start (bool enableNTCP, bool enableSSU)
+ 	{
++		if (!m_Service)
++		{
++			m_Service = new boost::asio::io_service ();
++			m_Work = new boost::asio::io_service::work (*m_Service);
++			m_PeerCleanupTimer = new boost::asio::deadline_timer (*m_Service);
++	 		m_PeerTestTimer = new boost::asio::deadline_timer (*m_Service);
++		}
++
+ 		m_DHKeysPairSupplier.Start ();
+ 		m_IsRunning = true;
+ 		m_Thread = new std::thread (std::bind (&Transports::Run, this));
+@@ -167,16 +182,16 @@ namespace transport
+ 					LogPrint (eLogError, "Transports: SSU server already exists");
+ 			}
+ 		}	
+-		m_PeerCleanupTimer.expires_from_now (boost::posix_time::seconds(5*SESSION_CREATION_TIMEOUT));
+-		m_PeerCleanupTimer.async_wait (std::bind (&Transports::HandlePeerCleanupTimer, this, std::placeholders::_1));
+-		m_PeerTestTimer.expires_from_now (boost::posix_time::minutes(PEER_TEST_INTERVAL));
+-		m_PeerTestTimer.async_wait (std::bind (&Transports::HandlePeerTestTimer, this, std::placeholders::_1));
++		m_PeerCleanupTimer->expires_from_now (boost::posix_time::seconds(5*SESSION_CREATION_TIMEOUT));
++		m_PeerCleanupTimer->async_wait (std::bind (&Transports::HandlePeerCleanupTimer, this, std::placeholders::_1));
++		m_PeerTestTimer->expires_from_now (boost::posix_time::minutes(PEER_TEST_INTERVAL));
++		m_PeerTestTimer->async_wait (std::bind (&Transports::HandlePeerTestTimer, this, std::placeholders::_1));
+ 	}
+ 		
+ 	void Transports::Stop ()
+ 	{	
+-		m_PeerCleanupTimer.cancel ();	
+-		m_PeerTestTimer.cancel ();
++		if (m_PeerCleanupTimer) m_PeerCleanupTimer->cancel ();	
++		if (m_PeerTestTimer) m_PeerTestTimer->cancel ();
+ 		m_Peers.clear ();
+ 		if (m_SSUServer)
+ 		{
+@@ -193,7 +208,7 @@ namespace transport
+ 
+ 		m_DHKeysPairSupplier.Stop ();
+ 		m_IsRunning = false;
+-		m_Service.stop ();
++		if (m_Service) m_Service->stop ();
+ 		if (m_Thread)
+ 		{	
+ 			m_Thread->join (); 
+@@ -204,11 +219,11 @@ namespace transport
+ 
+ 	void Transports::Run () 
+ 	{ 
+-		while (m_IsRunning)
++		while (m_IsRunning && m_Service)
+ 		{
+ 			try
+ 			{	
+-				m_Service.run ();
++				m_Service->run ();
+ 			}
+ 			catch (std::exception& ex)
+ 			{
+@@ -251,7 +266,7 @@ namespace transport
+ #ifdef WITH_EVENTS
+ 		EmitEvent({{"type" , "transport.sendmsg"}, {"ident", ident.ToBase64()}, {"number", std::to_string(msgs.size())}});
+ #endif
+-		m_Service.post (std::bind (&Transports::PostMessages, this, ident, msgs));
++		m_Service->post (std::bind (&Transports::PostMessages, this, ident, msgs));
+ 	}	
+ 
+ 	void Transports::PostMessages (i2p::data::IdentHash ident, std::vector<std::shared_ptr<i2p::I2NPMessage> > msgs)
+@@ -386,7 +401,7 @@ namespace transport
+ 	
+ 	void Transports::RequestComplete (std::shared_ptr<const i2p::data::RouterInfo> r, const i2p::data::IdentHash& ident)
+ 	{
+-		m_Service.post (std::bind (&Transports::HandleRequestComplete, this, r, ident));
++		m_Service->post (std::bind (&Transports::HandleRequestComplete, this, r, ident));
+ 	}		
+ 	
+ 	void Transports::HandleRequestComplete (std::shared_ptr<const i2p::data::RouterInfo> r, i2p::data::IdentHash ident)
+@@ -411,7 +426,7 @@ namespace transport
+ 
+ 	void Transports::NTCPResolve (const std::string& addr, const i2p::data::IdentHash& ident)
+ 	{
+-		auto resolver = std::make_shared<boost::asio::ip::tcp::resolver>(m_Service);
++		auto resolver = std::make_shared<boost::asio::ip::tcp::resolver>(*m_Service);
+ 		resolver->async_resolve (boost::asio::ip::tcp::resolver::query (addr, ""), 
+ 			std::bind (&Transports::HandleNTCPResolve, this, 
+ 				std::placeholders::_1, std::placeholders::_2, ident, resolver));
+@@ -454,7 +469,7 @@ namespace transport
+ 
+ 	void Transports::SSUResolve (const std::string& addr, const i2p::data::IdentHash& ident)
+ 	{
+-		auto resolver = std::make_shared<boost::asio::ip::tcp::resolver>(m_Service);
++		auto resolver = std::make_shared<boost::asio::ip::tcp::resolver>(*m_Service);
+ 		resolver->async_resolve (boost::asio::ip::tcp::resolver::query (addr, ""), 
+ 			std::bind (&Transports::HandleSSUResolve, this, 
+ 				std::placeholders::_1, std::placeholders::_2, ident, resolver));
+@@ -497,7 +512,7 @@ namespace transport
+ 	void Transports::CloseSession (std::shared_ptr<const i2p::data::RouterInfo> router)
+ 	{
+ 		if (!router) return;
+-		m_Service.post (std::bind (&Transports::PostCloseSession, this, router));		 
++		m_Service->post (std::bind (&Transports::PostCloseSession, this, router));		 
+ 	}	
+ 
+ 	void Transports::PostCloseSession (std::shared_ptr<const i2p::data::RouterInfo> router)
+@@ -584,7 +599,7 @@ namespace transport
+ 
+ 	void Transports::PeerConnected (std::shared_ptr<TransportSession> session)
+ 	{
+-		m_Service.post([session, this]()
++		m_Service->post([session, this]()
+ 		{		
+ 			auto remoteIdentity = session->GetRemoteIdentity (); 
+ 			if (!remoteIdentity) return;
+@@ -632,7 +647,7 @@ namespace transport
+ 		
+ 	void Transports::PeerDisconnected (std::shared_ptr<TransportSession> session)
+ 	{
+-		m_Service.post([session, this]()
++		m_Service->post([session, this]()
+ 		{
+ 			auto remoteIdentity = session->GetRemoteIdentity (); 
+ 			if (!remoteIdentity) return;
+@@ -690,8 +705,8 @@ namespace transport
+ 			UpdateBandwidth (); // TODO: use separate timer(s) for it
+ 			if (i2p::context.GetStatus () == eRouterStatusTesting) // if still testing,	 repeat peer test
+ 				DetectExternalIP ();
+-			m_PeerCleanupTimer.expires_from_now (boost::posix_time::seconds(5*SESSION_CREATION_TIMEOUT));
+-			m_PeerCleanupTimer.async_wait (std::bind (&Transports::HandlePeerCleanupTimer, this, std::placeholders::_1));
++			m_PeerCleanupTimer->expires_from_now (boost::posix_time::seconds(5*SESSION_CREATION_TIMEOUT));
++			m_PeerCleanupTimer->async_wait (std::bind (&Transports::HandlePeerCleanupTimer, this, std::placeholders::_1));
+ 		}	
+ 	}
+ 
+@@ -700,8 +715,8 @@ namespace transport
+ 		if (ecode != boost::asio::error::operation_aborted)
+ 		{
+ 			PeerTest ();
+-			m_PeerTestTimer.expires_from_now (boost::posix_time::minutes(PEER_TEST_INTERVAL));
+-			m_PeerTestTimer.async_wait (std::bind (&Transports::HandlePeerTestTimer, this, std::placeholders::_1));
++			m_PeerTestTimer->expires_from_now (boost::posix_time::minutes(PEER_TEST_INTERVAL));
++			m_PeerTestTimer->async_wait (std::bind (&Transports::HandlePeerTestTimer, this, std::placeholders::_1));
+ 		}	
+ 	}		
+ 		
+diff --git Transports.h Transports.h
+index d83c0370..a68838e2 100644
+--- Transports.h
++++ Transports.h
+@@ -84,7 +84,7 @@ namespace transport
+ 			bool IsOnline() const { return m_IsOnline; };
+ 			void SetOnline (bool online) { m_IsOnline = online; };
+ 
+-			boost::asio::io_service& GetService () { return m_Service; };
++			boost::asio::io_service& GetService () { return *m_Service; };
+ 			std::shared_ptr<i2p::crypto::DHKeys> GetNextDHKeysPair ();	
+ 			void ReuseDHKeysPair (std::shared_ptr<i2p::crypto::DHKeys> pair);
+ 
+@@ -144,9 +144,9 @@ namespace transport
+ 
+ 			bool m_IsOnline, m_IsRunning;
+ 			std::thread * m_Thread;	
+-			boost::asio::io_service m_Service;
+-			boost::asio::io_service::work m_Work;
+-			boost::asio::deadline_timer m_PeerCleanupTimer, m_PeerTestTimer;
++			boost::asio::io_service * m_Service;
++			boost::asio::io_service::work * m_Work;
++			boost::asio::deadline_timer * m_PeerCleanupTimer, * m_PeerTestTimer;
+ 
+ 			NTCPServer * m_NTCPServer;
+ 			SSUServer * m_SSUServer;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612241456.uBOEu73N075899>