diff --git a/src/stat_cache.c b/src/stat_cache.c index 1cd27657..9ea83ee7 100644 --- a/src/stat_cache.c +++ b/src/stat_cache.c @@ -342,6 +342,11 @@ static handler_t stat_cache_handle_fdevent(server *srv, void *_fce, int revent) if (revent & (FDEVENT_HUP|FDEVENT_RDHUP)) { /* fam closed the connection */ + log_error_write(srv, __FILE__, __LINE__, "s", + "FAM connection closed; disabling stat_cache."); + /* (although effectively STAT_CACHE_ENGINE_NONE, + * do not change here so that periodic jobs clean up memory)*/ + /*srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_NONE; */ fdevent_fdnode_event_del(srv->ev, scf->fdn); fdevent_unregister(srv->ev, scf->fd); scf->fdn = NULL; @@ -397,6 +402,7 @@ static void stat_cache_free_fam(stat_cache_fam *scf) { static fam_dir_entry * fam_dir_monitor(server *srv, stat_cache_fam *scf, char *fn, size_t dirlen, struct stat *st) { + if (NULL == scf->fdn) return NULL; /* FAM connection closed; do nothing */ const int fn_is_dir = S_ISDIR(st->st_mode); /*force_assert(0 != dirlen);*/ /*force_assert(fn[0] == '/');*/ @@ -780,12 +786,10 @@ static void stat_cache_invalidate_dir_tree_walk(splay_tree *t, if (blen > len && b->ptr[len] == '/' && 0 == memcmp(b->ptr, name, len)) { stat_cache_entry *sce = t->data; sce->stat_ts = 0; - #ifdef HAVE_FAM_H if (sce->fam_dir != NULL) { --((fam_dir_entry *)sce->fam_dir)->refcnt; sce->fam_dir = NULL; } - #endif } }