[OE-core] [PATCH 1/3] pseudo: Handle too many files deadlock

Richard Purdie richard.purdie at linuxfoundation.org
Fri Jun 16 09:03:00 UTC 2017


On Wed, 2017-06-14 at 15:51 +0200, Gary Thomas wrote:
> On 2017-06-14 15:42, Richard Purdie wrote:
> > 
> > If we have large amounts of parallelism, pseudo can end up with too
> > many open connections and will no longer accept further
> > connections,
> > hanging. This patch works around that by closing some clients,
> > allowing
> > turnover of connections and unblocking the system. The downside is
> > a small
> > but theoretical window of data loss. This is likely better than
> > locking
> > up entirely though. Discussions with Peter are onging about how we
> > could
> > better fix this.
> > 
> > Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> > ---
> >   .../pseudo/files/toomanyfiles.patch                | 62
> > ++++++++++++++++++++++
> >   meta/recipes-devtools/pseudo/pseudo_1.8.2.bb       |  1 +
> >   2 files changed, 63 insertions(+)
> >   create mode 100644 meta/recipes-
> > devtools/pseudo/files/toomanyfiles.patch
> > 
> > diff --git a/meta/recipes-devtools/pseudo/files/toomanyfiles.patch
> > b/meta/recipes-devtools/pseudo/files/toomanyfiles.patch
> > new file mode 100644
> > index 0000000..14a8975
> > --- /dev/null
> > +++ b/meta/recipes-devtools/pseudo/files/toomanyfiles.patch
> > @@ -0,0 +1,62 @@
> > +Currently if we max out the maximum number of files, pseudo can
> > deadlock, unable to
> > +accept new connections yet unable to move forward and unblock the
> > other processes
> > +waiting either.
> > +
> > +Rather than hang, when this happens, close out inactive
> > connections, allowing us
> > +to accept the new ones. The disconnected clients will simply
> > reconnect. There is
> > +a small risk of data loss here sadly but its better than hanging.
> > +
> > +RP
> > +2017/4/25
> > +
> > +Upstream-Status: Pending [Peter is aware of the issue]
> > +
> > +Index: pseudo-1.8.2/pseudo_server.c
> > +==================================================================
> > =
> > +--- pseudo-1.8.2.orig/pseudo_server.c
> > ++++ pseudo-1.8.2/pseudo_server.c
> > +@@ -581,6 +581,7 @@ pseudo_server_loop(void) {
> > + 	int rc;
> > + 	int fd;
> > + 	int loop_timeout = pseudo_server_timeout;
> > ++	int hitmaxfiles;
> > +
> > + 	clients = malloc(16 * sizeof(*clients));
> > +
> > +@@ -597,6 +598,7 @@ pseudo_server_loop(void) {
> > + 	active_clients = 1;
> > + 	max_clients = 16;
> > + 	highest_client = 0;
> > ++	hitmaxfiles = 0;
> > +
> > + 	pseudo_debug(PDBGF_SERVER, "server loop started.\n");
> > + 	if (listen_fd < 0) {
> > +@@ -663,10 +665,18 @@ pseudo_server_loop(void) {
> > + 						message_time.tv_u
> > sec -= 1000000;
> > + 						++message_time.tv
> > _sec;
> > + 					}
> > ++				} else if (hitmaxfiles) {
> > ++					/* In theory there is a
> > potential race here where if we close a client,
> > ++					   it may have sent us a
> > fastop message which we don't act upon.
> > ++					   If we don't close a
> > filehandle we'll loop indefinitely thought.
> > ++					   Only close one per
> > loop iteration in the interests of caution */
> > ++					close_client(i);
> > ++					histmaxfiles = 0;
> Typo?  s/histmaxfiles/hitmaxfiles/

I wondered if anyone would spot that! :)

Its fixed in the version on master-next.

Cheers,

Richard



More information about the Openembedded-core mailing list