Ik heb een script dat gebruik maakt van een queueing bestand; werking: ik schiet een commando in, dat komt in de queue terecht, en een ander script haalt dat eruit en past de queue-file aan.
Om te voorkomen dat de queue-file ongeldig bewerkt wordt door twee gelijktijdige processen, zet ik met flock() een lock op het bestand bij schrijven, en haal dat er wanneer ik klaar ben weer vanaf. Om te voorkomen dat het script de mist in gaat omdat er niet naar de queue-file geschreven kan worden, breekt het script af als de functie is_writable false teruggeeft.
Dit werkt allemaal goed, maar ik wil natuurlijk dat het script zo vaak mogelijk wél doorgang vindt. Daarom probeer ik het eerst een aantal keer, in de hoop dat het bestand toch writable wordt:
In een periode van 4 seconde wordt dus 20 keer gekeken of de status alweer OK is. Meestal gaat dit goed, maar wanneer het drukker wordt krijg ik steeds vaker dat hij echt doorgaat tot 20 keer, en dan alsnog afbreekt. Dit terwijl het bestand op dat moment niet echt beschreven wordt!
Ik heb het idee dat ik iets over het hoofd zie waardoor een bestand onbeschrijfbaar kan worden; ik ga er op dit moment vanuit dat dat alleen het geval kan zijn als een ander script daarin aan het schrijven is en het bestand nog niet gesloten heeft. Zijn er meer redenen waarom dit het geval kan zijn en die ik niet weet, waardoor dit probleem veroorzaakt wordt?
Om te voorkomen dat de queue-file ongeldig bewerkt wordt door twee gelijktijdige processen, zet ik met flock() een lock op het bestand bij schrijven, en haal dat er wanneer ik klaar ben weer vanaf. Om te voorkomen dat het script de mist in gaat omdat er niet naar de queue-file geschreven kan worden, breekt het script af als de functie is_writable false teruggeeft.
Dit werkt allemaal goed, maar ik wil natuurlijk dat het script zo vaak mogelijk wél doorgang vindt. Daarom probeer ik het eerst een aantal keer, in de hoop dat het bestand toch writable wordt:
PHP:
1
2
3
4
5
6
7
8
9
10
| $max_retry = 20; $retry_count = 0; while (($retry_count++ < $max_retry) && !is_writeable($spool)) { $this->log(E_INFO, $this->thread, 'could not write to '.$spool.'; trying again ('.$retry_count.')'); clearstatcache(); usleep(200000); } if (!is_writeable($spool)) $this->log(E_FATAL, $this->thread, 'could definitely not write to '.$spool); |
In een periode van 4 seconde wordt dus 20 keer gekeken of de status alweer OK is. Meestal gaat dit goed, maar wanneer het drukker wordt krijg ik steeds vaker dat hij echt doorgaat tot 20 keer, en dan alsnog afbreekt. Dit terwijl het bestand op dat moment niet echt beschreven wordt!
Ik heb het idee dat ik iets over het hoofd zie waardoor een bestand onbeschrijfbaar kan worden; ik ga er op dit moment vanuit dat dat alleen het geval kan zijn als een ander script daarin aan het schrijven is en het bestand nog niet gesloten heeft. Zijn er meer redenen waarom dit het geval kan zijn en die ik niet weet, waardoor dit probleem veroorzaakt wordt?