static void tlsp_drain(char *unused_service, char **unused_argv) { int count; /* * After "postfix reload", complete work-in-progress in the background, * instead of dropping already-accepted connections on the floor. * * All error retry counts shall be limited. Instead of blocking here, we * could retry failed fork() operations in the event call-back routines, * but we don't need perfection. The host system is severely overloaded * and service levels are already way down. */ for (count = 0; /* see below */ ; count++) { if (count >= 5) { msg_fatal("fork: %m"); } else if (event_server_drain() != 0) { msg_warn("fork: %m"); sleep(1); continue; } else { return; } } }
static void pre_accept(char *unused_name, char **unused_argv) { static time_t last_event_time; time_t new_event_time; const char *name; /* * If some table has changed then stop accepting new connections. Don't * check the tables more than once a second. */ new_event_time = event_time(); if (new_event_time >= last_event_time + 1 && (name = dict_changed_name()) != 0) { msg_info("table %s has changed - finishing in the background", name); event_server_drain(); } else { last_event_time = new_event_time; } }
static void psc_drain(char *unused_service, char **unused_argv) { int count; /* * After "postfix reload", complete work-in-progress in the background, * instead of dropping already-accepted connections on the floor. * * Unfortunately we must close all writable tables, so we can't store or * look up reputation information. The reason is that we don't have any * multi-writer safety guarantees. We also can't use the single-writer * proxywrite service, because its latency guarantees are too weak. * * All error retry counts shall be limited. Instead of blocking here, we * could retry failed fork() operations in the event call-back routines, * but we don't need perfection. The host system is severely overloaded * and service levels are already way down. * * XXX Some Berkeley DB versions break with close-after-fork. Every new * version is an improvement over its predecessor. */ if (psc_cache_map != 0 /* XXX && psc_cache_map requires locking */ ) { dict_cache_close(psc_cache_map); psc_cache_map = 0; } for (count = 0; /* see below */ ; count++) { if (count >= 5) { msg_fatal("fork: %m"); } else if (event_server_drain() != 0) { msg_warn("fork: %m"); sleep(1); continue; } else { return; } } }