Wahnsinn verpackt in Bits und Bytes

Es gibt Code. Und dann gibts da noch …anderes.

Thou shall not trust exit code

Verfasst von harenber am November 2, 2009

Auch wenn es uns persönlich nicht betrifft, aber diese Mail ging gerade an alle deutschen Grid-Sites und die muss ich hier einfach wiedergeben… ohne Worte

Dear ALL,

as agreed in our last ROC-DECH meeting I send around a few information about problems using CRAB (CMS remote analysis builder) with the golden D-Cache release (1.9.5). If you do not support the CMS VO you can safely press the delete button now.

For those still reading, that’s the problem: CRAB does not trust the return codes of the lcg-tools and does some parsing of error messages in addition. Unfortunately some messages slightly changed in D-Cache 1.9.5 leading to CRAB failures when writing out files. The problem was identified about two weeks ago after the SE upgrade at RWTH-AACHEN.

The problem has been discussed during the CMS computing week last week at CERN. It was agreed that it does not make sense to prevent sites from upgrading that close to the planed start of LHC beam operation. The bug can be fixed easily in CRAB, but until today only a fixed pre-release of CRAB is existing (2_6_4_pre1). A production release is planned soon.

In view of these facts DESY-HH upgraded the CMS D-Cache instance to 1.9.5 last week. We had some complains of users already in the following days. You can only ask users to move to the new pre-release and hope that CMS proceeds quickly with the roll-out of 2_6_4 and does a proper deprecation of older CRAB versions.

Veröffentlicht in Allgemein | Kommentar schreiben »

Thou shall not speak in foreign languages, not even in a worldwide Grid

Verfasst von harenber am Oktober 28, 2009

Wer dachte, so etwas passiert nur in kommerziellen, amerikanisch dominierten Scripten.. nein!

Im worldwide LHC Computing Grid (wLCG), einen Zusammenschluss von mehreren 10.000 Maschinen über die ganze Welt verteilt, gibt es natürlich auch ein zentrales Informationssystem. Dieses wird gefüttert von einigen – meist in perl geschriebenen – Skripten, die versuchen, den aktuellen Status eines Dienstes herauszubekommen.

Nachdem das auf unseren Servern nicht vollständig funktioniert hat, habe ich herausgefunden, dass ein Script Befehle wie

service globus-gridftp status

ausführt und den Output ohne weiteres über ein slapd weiterleitet. Diese Antwort sieht bei einem Server, der auf Deutsch steht, so aus:

service globus-gridftp status
globus-gridftp-server (PID 3522) wird ausgeführt…

Antwort der Experten:

„OK, this looks like the problem, probably there’s an invalid character in the status text. What do you get from „service globus-gridftp status“? Anyway I guess it’s a bug in the info provider, it strips out control characters but not top-bit-set characters, and:
„IA5String (OID=1.3.6.1.4.1.1466.115.121.1.26) IA5 (almost ASCII) character set (7-bit). Does NOT allow extended characters e.g. é, Ø, å etc.“

Merke: Auch wenn wir 10000e Rechner auf 5 Kontinenten vernetzen, fremde Sprache spreche nicht!

Veröffentlicht in Allgemein | Kommentar schreiben »

*In Tastatur beiss* II

Verfasst von phloog am Januar 13, 2009

Braaagh!

Braaagh!

Veröffentlicht in Allgemein | Verschlagwortet mit : , | Kommentar schreiben »

*in Tastatur beiss*

Verfasst von phloog am November 28, 2008

In [14]:j.application.atlas_environment = []
Ganga.GPIDev.Base.Proxy: WARNING type-checking is incomplete: type information
not provided for a sequence atlas_environment, contact plugin developer
Attribute "atlas_environment" expects a value of the following types: []
In [15]:

(ohne Worte oder weitere Erklärungen. Musste raus.)

– Tim

Veröffentlicht in Allgemein | Verschlagwortet mit : , | 3 Kommentare »

Alt trifft neu (ACAT08 Vortragsraum)

Verfasst von phloog am November 4, 2008

Mit Grüßen von Sizilien sei hier gezeigt, welch überraschende, moderne Seminartechnologien sich in hübschen, alten Gemäuern verbergen können :)

Veröffentlicht in Allgemein | Verschlagwortet mit : , , , | 1 Kommentar »

So nah(eliegend) und doch so fern

Verfasst von phloog am Oktober 29, 2008

Manchmal sind es die einfachsten Dinge, die man in seiner Betriebsblindheit übersieht, die aber zu den skurrilsten Fehlern führen. An denen hat man dann in aller Regel recht lange seinen Spaß. So wie wir…

Kurze Vorgeschichte, um das folgende nachvollziehen zu können (Stilistisch aufgepeppt, damit’s nicht langweilig wird):

Es war einmal eine Job-Monitoring-Anwendung, die während Rechenjobs auf weltweiten Computing Grids laufen diese überwacht und Informationen in fast-Echtzeit zum User überträgt. Informationen wie „Was macht der Job gerade?“, „Wieviele Ressourcen verbraucht er, und wieviele sind noch frei?“ oder „Mit was für einem Fehler ist der Job soeben abgeraucht?“. Sachen die der User eben braucht, um ggf. fehlerhafte Jobs zu debuggen. Soweit, so prächtig. Dieses Monitoring-Tool kann bisher Bash- und Pythonscripte überwachen (Neumittelhochdeutsch „supervisen“…). Um Bashscripte zu überwachen, wird eine modifizierte Bash eingesetzt. Und damit fingen die Probleme an…

(Obacht, es folgt ein epic post mit techie-talk drin. Es geht also recht weit ins Eingemachte…)

Die modifizierte Bash (Nennen wir sie mal foosh, die Foo Shell) muss, da im Grid beides vorkommt, sowohl für 32bit als auch für 64bit kompiliert werden. Diese Aufgabe übernahm der Kollege, der die foosh-Modifikationen vor einiger Zeit vornahm (Sie basiert auf der bash 3.2). Seitdem verrichtete sie brav ihre Dienste (Kommandos vor der Ausführung inspizieren und gegebenenfalls Monitoring-Daten über sie verschicken). Nun befindet sich das Monitoring-Tool in aktiver Entwicklung (u.a. durch mich). In diesem Rahmen wurde auch die foosh erneut angefasst und einige Änderungen vorgenommen. Foosh neu kompiliert, verpackt, getestet: Wunderbar.

Komplett wunderbar? Nein, es stellte sich heraus, dass foosh mit einigen Scripten Probleme hatte. Diese äußerten sich in stderr-Meldungen folgender Art:

bash: unexpected EOF while looking for matching ``'
bash: syntax error: unexpected end of file

Das Script konnte offensichtlich nicht korrekt geparsed werden. Der Ausschnitt des Scriptes, in dem der Fehler geschah, war folgender (Zeile des Scriptfehlers in rot):

newpath=""
for p in `echo ${CLASSPATH} | sed 's/:/ /g'`; do
  if test ! "`echo ${p} | egrep CMT`" ; then
    if test "${newpath}" = "" ; then
      newpath=${p}
    else
      newpath=${newpath}:${p}
    fi
  fi
done

Offensichtlich wurde der Abschließende Backtick nach „CMT“ nicht gefunden. Die unmodifizierte bash machte hingegen mit dem Script keine Probleme. Auch die foosh in ihrer ursprünglichen Form (Ohne meine Änderungen, aber mit den Änderungen gegenüber der originalen bash 3.2, die vom Kollegen „damals“ eingebaut wurden) fraß das Script ohne zu zicken. Was macht also ein braver Programmierer? Richtig, er schaut sich seine Änderungen nochmal genau an, und/oder nimmt sie schrittweise zurück, um das Problem einzugrenzen.

Ich kürze den Vorgang, der aus Stunden angefüllt mit Kaffee (Oder bei mir eher Tee), Schweiß und Blut bestand, im Sinne des Lesers etwas ab – das Resultat jedoch war: Auch die völlig unveränderte foosh, von mir kompiliert, wies den Fehler auf. Die foosh, von meinem Kollegen damals kompiliert, nicht. Ich ging gar noch einen Schritt weiter, und kompilierte die original bash 3.2 – auch hier trat der Fehler auf. An dieser Stelle vermuteten wir einen Unterschied im Build-System. Also auf dem Rechner, auf dem ich die bashs kompilierte, musste irgendetwas anders sein, als auf der Kiste, auf der der Kollege damals die bashs gebaut hatte. Ich kontaktierte ihn, riss ihn aus seinem vertrauten Alltag (Okay, wir wollen’s nicht übertreiben…) und glich meine Buildskripte und Umgebung mit ihm ab.

Doch leider war es zwecklos. Der Fehler beharrte auf seiner Anwesenheit. Witzigerweise funktionierte das oben zitierte Stück code, für sich genommen, auch mit der von mir kompilierten foosh. Nur im Grid-Kontext trat der Fehler auf. Mittlerweile war die Zahl derer, die sich mit dem Problem befassten, auf (mit mir) drei angewachsen.

Zu dritt ermittelten wir nach angeregter Diskussion (Man nennt das ja immer so), dass der eigentliche Fehler nicht in dem zitierten Stück Code auftrat, sondern weiter oben (Oh wunder, oh wunder!) im Script, und zwar in folgender Zeile:

CMTBIN=`uname`-`uname -m | sed -e 's# ##g'`; export CMTBIN

Auch hier hantierte das Script mit Backticks, und hier wurde scheinbar der abschließende Backtick nicht gefunden. Die Zeile kam uns dennoch etwas komisch vor. Vor allem der sed-Aufruf. Hashmarks („Rauten“) leiten in Bashscripts Kommentare ein – könnte also eine der Hashmarks im sed-Aufruf als Kommentarbeginn misinterpretiert worden sein, so dass der abschließende Backtick nach ##g’ überlesen wurde? Und warum taten dies nur auf meinem System kompilierte Bashs (egal ob foosh oder vanilla)? Wir erstellten einen kleinen Testcase:

echo `seq -w 00 05 | sed -e 's# ##g'`

Und testeten weiter. Stocherten, zugegeben, ein wenig herum. Bis ich auf die banale Lösung kam…

Es folgt: Die LÖSUNG. Und vorsicht: Sie ist banal. So banal, dass ich sie eigentlich gar nicht schreiben mag. Aber da wir uns auf bitschupser befinden und nicht immer nur die anderen dämlich sind, sondern auch man selbst, sei hier die Lösung nicht vorenthalten.

Für die bash 3.2 wurden nach dem Release auch weiter Patche veröffentlicht. Der allerallererste davon, namens bash32-001 (ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-001), ist mit folgendem Kommentar des Patchautors versehen:

When using historical ``-style command substitution, bash incorrectly attempts
to interpret shell comments while scanning for the closing backquote.

…der Kollege, der die foosh damals kompilierte, hat sie wohl vor dem Kompilieren gepatcht. Was an und für sich ja die natürlichste Sache der Welt ist. Allerdings tat er dies, nachdem er die foosh-Sourcen in unser Code-Repository eincheckte. Ich checkte den Code aus, kompilierte ihn im Vertrauen, identischen Code zu benutzen, und so war das Problem geboren.

Seufz…

- Tim

Veröffentlicht in Betriebsblindheit | Verschlagwortet mit : , , | 1 Kommentar »

Thou shall not speak in foreign languages

Verfasst von mschroers am Oktober 24, 2008

Früher da war die Welt noch einfach gestrickt. Twix hieß noch Raiders, Bohlen noch Modern Talking und Betriebssysteme waren mit englischer Sprache ausgerüstet. Aber im Angesicht der Zeit ändert sich bekanntlich alles. Raider wird zu Twix (sonst ändert sich nix), Bohlen nervt bei DSDS und Betriebssysteme bekommen $LANG-Variablen, mit denen der Benutzer schnell und einfach die Sprache seines Betriebssystems auf landestypische Gepflogenheiten umstellen kann.

Nur die Entwickler des SFS-Systems von HP scheinen dem ewig Vergangenen nachzuhängen und somit dem unbedachten Benutzer/Administrator von lokalen SFS Systemen Kopfschmerzen zu bereiten. Doch ein unbedeutendes Installations-Script (geschrieben in der menschenverachtenden Perl-Scriptsprache) weigerte sich wehement anzuerkennen das es sehr wohl eine Netzwerk-Schnittstelle im System gab, welche über die nötigen Vorraussetzungen verfügte (richtige IP Adresse, aktiviert, etc.) um dem Script einen verheißungsvollen exitcode 0 zu entlocken.

Um dem geneigten Leser es näher zu bringen. Um eine SFS Installation abzuschließen muss besagtes Perlscript ausgeführt werden, welches die nötigen Informationen über die Netzwerk-Schnittstelle sammelt und diese in die verschiedenen Konfigurations-Dateien des SFS’s abspeichert. Dieses Script ist einfach wie dumm gestrickt: Es führt ein grep auf den Befehl ifconfig aus. Und sucht dabei den Eintrag „Inet Addr.:“ um die Netzwerkadresse der Schnittstelle herraus zu finden. Schade nur wenn die Umgebungsvariable für die Sprache auf deutsch steht und sich somit das „Inet Addr.:“ in „Inet Adresse“ (mit nur einem d) verwandelt. Da kann unser Script nämlich lange suchen, bis es das findet…

Liebe Leser, was Sie hier in wenigen Minuten zusammengefasst lesen, hat und mehrere Tage debugging und mehrere Jahre unsere kostbaren Lebens inkl. der dafür notwendigen Nerven gekostet.

Und die Moral von der Geschicht? mit perl und grep programmiert man nicht.

In diesem Sinne,

-m

Veröffentlicht in Stupid Code | Verschlagwortet mit : , , , , | Kommentar schreiben »

Unsinn

Verfasst von mschroers am Oktober 24, 2008

Dieser Blog soll dazu dienen Code-Verbrechen offen zulegen. Jeden Tag werden Millionen von unschuldigen Usern an den Rand der Verzweiflung getrieben durch die schiere Bequemlich- oder Dämlichkeit der Programmierknechte auf dieser Welt.

 

Die lustigsten, skurillsten Fehler werden hier gezeigt und erläutert.

 

Ich hoffe auch Sie werden soviel Spass daran haben wie wir es hatten ;)

 

Viele Grüße,

 -m

Veröffentlicht in Allgemein | Kommentar schreiben »