
Ich schreibe an einem Apache-Modul, das derzeit unter 2.2.22 läuft. Das Modul führt Skripte aus, die in einer neuen Programmiersprache geschrieben sind, und speichert zur Optimierung die Ergebnisse der Analyse für spätere Verwendungen im Cache.
Da die zwischengespeicherte Analyse gelöscht werden sollte, wenn die Datei geändert wird, speichere ich den Änderungszeitpunkt und vergleiche ihn bei jedem Durchlauf mit dem Dateisystem.
Dies ist ein Teil des Codes mit einer Debug-Meldung:
if (file->is_modified (mtime)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"P* removing cached file");
files.erase(it);
}
Was ich beim Testen (Seite abrufen, Datei ändern, erneut abrufen) entdeckt habe, ist, dass dieser Block nie erreicht wird. Die Datei wird nach der Änderung erneut analysiert, aber nicht aufgrund dieser Prüfung. Für mich sieht es so aus, als ob Apache selbst die Änderungszeit überprüft und den gesamten Speicher im Modul freigibt.
Die analysierten Dateien werden korrekt wiederverwendet, sofern sie unverändert bleiben.
Ist dies das beabsichtigte Verhalten des Apache-Servers und wenn ja, wie wird es genannt und wo ist es dokumentiert?
Vollständiger Code für die Funktion, die nach zwischengespeicherten Programmen sucht
shared_ptr<pstar_file> pstar_pool::get_file_handle (
request_rec *r,
wpl_io &io,
const char *filename,
int mtime
)
{
pstar_map_t::iterator it;
apr_proc_mutex_lock (mutex);
// Check if a cached program exists
it = files.find(filename);
if (it != files.end()) {
if (it->second->is_modified (mtime)) {
files.erase(it);
}
else {
apr_proc_mutex_unlock (mutex);
return it->second;
}
}
apr_proc_mutex_unlock (mutex);
shared_ptr<pstar_file> file_ptr(new pstar_file(io, filename, mtime));
apr_proc_mutex_lock (mutex);
files.insert(std::pair<string,shared_ptr<pstar_file>>(filename, file_ptr));
apr_proc_mutex_unlock (mutex);
return file_ptr;
}
Vollständiger Code für das gesamte Modul auf Github (mehrere Dateien):https://github.com/atlesn/P-star/blob/master/src/apache2/pstar_pool.cpp
Antwort1
Hier fehlt ziemlich viel Kontext. Ich denke jedoch, dass die Antwort ganz einfach sein könnte.
Module werden geladen, wenn ein Arbeitsprozess instanziiert wird. Wenn ein Modul geladen wird, wird es normalerweise in das Prozessabbild im Speicher kopiert und Änderungen auf der Festplatte wirken sich nicht darauf aus. Ob dies relevant ist, hängt davon ab, was Sie in Ihrem benutzerdefinierten Modul tun.
Apache zeigt sicherlich kein seltsames oder undefiniertes Verhalten, wenn von Modulen aufgerufene Dateien verwendet und geändert werden. Wenn Ihr Modul eine Datei öffnet, wäre es sehr seltsam, wenn eine spätere Änderung dieser Datei das von Ihnen Gesagte bewirken würde, obwohl ich das Gefühl habe, dass es dafür einen Grund gibt, der nicht klar ist.
Überprüfen Sie auch, ob das zugrunde liegende Dateisystem Mtime tatsächlich so speichert und aktualisiert, wie Sie es erwarten. Das ist nicht immer der Fall. Ihre Mtime-Prüfung (die Sie nicht einbezogen haben) könnte auch falsch sein.
Da Sie sagen, dass die Datei auf unbekannte Weise neu geladen wird, ist es durchaus möglich, dass für jede Anforderung ein neuer Arbeitsprozess instanziiert wird oder dass Sie bei jedem Versuch einen anderen Arbeitsprozess erhalten.
Erwägen Sie die Verwendung des Debug-Drucks in Ihrer Mtime-Prüfung, um dies zu isolieren.