{"id":215,"date":"2011-09-26T02:43:10","date_gmt":"2011-09-26T00:43:10","guid":{"rendered":"http:\/\/www.instruyete.org\/?p=215"},"modified":"2011-09-26T02:43:10","modified_gmt":"2011-09-26T00:43:10","slug":"cups-polld-im-busy-loop","status":"publish","type":"post","link":"https:\/\/www.instruyete.org\/?p=215","title":{"rendered":"cups-polld im busy-loop"},"content":{"rendered":"<p>Falls man in seiner <strong>CUPS<\/strong> Konfiguration einen Host permanent abfr\u00e4gt (<em>BrowsePoll<\/em>), und CUPS der Version 1.4.x einsetzt, kann es passieren, dass bei l\u00e4nger aussetzender Netzwerkverbindung zum <em>BrowsePoll<\/em> Zielrechner der <strong>cups-polld<\/strong> Prozess in einen busy-loop ger\u00e4t aus dem der Prozess nicht mehr herauskommt.<\/p>\n<p>Dies kann v.a. auftreten, wenn der CUPS Client sich mit WLAN zum CUPS Server verbindet. Das Fehlverhalten merkt man dann an 100% Auslastung eines CPU-Cores durch cups-polld. Selber konnte ich dass seit l\u00e4ngerem auf Mac OS X Clients erleben.<br \/>\n<strong>Mac OS X 10.6.8<\/strong> beinhaltet derzeit <strong>CUPS 1.4.7<\/strong>, w\u00e4hrend Mac OS X Lion CUPS 1.5.x einsetzt, welches ein Bugfix f\u00fcr dieses Problem beinhaltet.<\/p>\n<p><a href=\"http:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=634325\">Eine genaue Fehlerbeschreibgung und einen source patch gibt es auf den Bugs Seiten des Debian Projektes<\/a><br \/>\nDie Seite wiederum widmet sich aber dem Problem unter Linux &#8211; um das Problem auf Mac OS X <\/p>\n<ol>\n<li>reproduzierbar zu machen (und damit testbar)<\/li>\n<li>zu l\u00f6sen<\/li>\n<\/ol>\n<p>stellte ich folgende Vorgehensweise auf:<\/p>\n<ol>\n<li>Auf dem Mac OS X Client wird der <strong>cups-polld<\/strong> Prozess mangels <em>strace<\/em> mit der <em>Aktivit\u00e4tsanzeige<\/em> beobachtet<\/li>\n<li>Im Normallzustand war der letzte Call von cups-polld:<br \/>\n<code>_semwait_signal(..)<br \/>\n<\/code><\/li>\n<li>Auf Linux Seite wird nun die erste Firewallregel geschaltet<br \/>\n<code>iptables -I OUTPUT 1 -p tcp -d <IP_ADDR_MAC_OS_X_CLIENT> --sport ipp -j REJECT --reject-with tcp-reset<\/code><\/li>\n<li>Danach wartet man bis der cups-polld Prozess in die Phase<br \/>\n<code>recvfrom(...)<br \/>\n<\/code>kommt, danach wird auf Linux noch die 2 FW Regel gestartet.<\/li>\n<li><code>iptables -I INPUT 1 -p tcp -s <IP_ADDR_MAC_OS_X_CLIENT> --dport ipp -j REJECT --reject-with tcp-reset<\/code><\/li>\n<li>Danach wird nach ca. 7 Minuten der cups-polld Prozess in den busy-loop \u00fcbergehen.<\/li>\n<\/ol>\n<p>Jetzt muss CUPS mit dem auf den Debian Seiten verf\u00fcgbaren Patch versehen werden. Dazu l\u00e4dt man derzeit auf den <a href=\"http:\/\/www.cups.org\">CUPS Seiten<\/a> die letze 1.4 Version herunter (1.4.8) und patcht diesen. Der Patch beschr\u00e4nkt sich auf die Datei <em>cups\/request.c<\/em> und lautet folgendermassen<br \/>\n<code><br \/>\n+   {<br \/>\n+     status = httpUpdate(http);<br \/>\n+   }<br \/>\n+-  while (http->state == HTTP_POST_RECV);<br \/>\n++  while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);<br \/>\n+<br \/>\n+   DEBUG_printf((\"2cupsGetResponse: status=%d\", status));<br \/>\n+ <\/code><\/p>\n<p>Beim anschliessenden kompilieren unter Mac OS X ist nat\u00fcrlich die Entwicklungsumgebung notwendig, zumindest die gcc toolchain auf der Kommandozeile. Folgende Schritte sind notwendig:<\/p>\n<ul>\n<li>.\/configure CFLAGS=&#8220;-arch i386 -arch x86_64&#8243; LDFLAGS=&#8220;-arch i386 -arch x86_64&#8243;\n<p>Dies f\u00fchrt zum Kompilat von 32- und 64bit Varianten der Objects, der statischen Archive und von executables.<\/li>\n<li>Das Mischkompilat (Universal Binary f\u00fcr 32- und 64bit Varianten) ist notwendig um die zentrale Bibliothek <strong>libcups.2.dylib<\/strong> f\u00fcr beide Architekturen anzubieten. Ansonsten w\u00fcrde so ziemlich alle 32bit Applikationen beim Start crashen.\n<p>Leider reicht das o.g. <em>configure<\/em> nicht aus um die dynamische Bibliothek auch auf 32bit zum Kompilieren (auf einem aktuellen 64bit Rechner). <em>LDFLAGS<\/em> greift hier nicht &#8211; deshalb muss manuell in der Datei <strong>Makedefs<\/strong> in der Zeile <strong>ARCHFLAGS<\/strong> ebenfalls <em>-arch i386 -arch x86_64<\/em> eingetragen werden. Danach nur noch<\/li>\n<li>make<\/li>\n<li>make install<\/li>\n<\/ul>\n<p>Jetzt noch ein bischen zittern beim Neustart und dann war&#8217;s das schon,<br \/>\n<a href='http:\/\/www.instruyete.org\/wp-content\/uploads\/2011\/09\/CUPS-1.4.8.pkg'>hier ein fertiges CUPS 1.4.8 Paket f\u00fcr Mac OS X Snow Leopard OHNE JEGLICHE GEW\u00c4HR!<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Falls man in seiner CUPS Konfiguration einen Host permanent abfr\u00e4gt (BrowsePoll), und CUPS der Version 1.4.x einsetzt, kann es passieren, dass bei l\u00e4nger aussetzender Netzwerkverbindung zum BrowsePoll Zielrechner der cups-polld Prozess in einen busy-loop ger\u00e4t aus dem der Prozess nicht mehr herauskommt. Dies kann v.a. auftreten, wenn der CUPS Client sich mit WLAN zum CUPS &hellip; <a href=\"https:\/\/www.instruyete.org\/?p=215\" class=\"more-link\"><span class=\"screen-reader-text\">cups-polld im busy-loop<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,7],"tags":[],"class_list":["post-215","post","type-post","status-publish","format-standard","hentry","category-macos","category-unix"],"_links":{"self":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=215"}],"version-history":[{"count":0,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/215\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}