X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=main.cpp;h=1b6fb4f8103db87287646f258546e045e11dba5c;hb=94959e83930c70e3e91931e1fb1f9c0ec4a6f374;hp=32d654cee654bef1bea675585c1a0c23250e3129;hpb=d72af7eae68766b62560bdb171302bcc44d98ec2;p=cubemap diff --git a/main.cpp b/main.cpp index 32d654c..1b6fb4f 100644 --- a/main.cpp +++ b/main.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -67,14 +68,14 @@ void do_nothing(int signum) { } -CubemapStateProto collect_state(const timeval &serialize_start, +CubemapStateProto collect_state(const timespec &serialize_start, const vector acceptors, const multimap inputs, ServerPool *servers) { CubemapStateProto state = servers->serialize(); // Fills streams() and clients(). state.set_serialize_start_sec(serialize_start.tv_sec); - state.set_serialize_start_usec(serialize_start.tv_usec); + state.set_serialize_start_usec(serialize_start.tv_nsec / 1000); for (size_t i = 0; i < acceptors.size(); ++i) { state.add_acceptors()->MergeFrom(acceptors[i]->serialize()); @@ -230,6 +231,12 @@ void create_streams(const Config &config, ++input_it->second.refcount; } } + + // HTTP gen204 endpoints. + for (unsigned i = 0; i < config.pings.size(); ++i) { + const Gen204Config &ping_config = config.pings[i]; + servers->add_gen204(ping_config.url, ping_config.allow_origin); + } } void open_logs(const vector &log_destinations) @@ -248,7 +255,7 @@ void open_logs(const vector &log_destinations) start_logging(); } -bool dry_run_config(const std::string &argv0, const std::string &config_filename) +bool dry_run_config(const string &argv0, const string &config_filename) { char *argv0_copy = strdup(argv0.c_str()); char *config_filename_copy = strdup(config_filename.c_str()); @@ -390,7 +397,7 @@ start: find_deleted_streams(config, &deleted_urls); CubemapStateProto loaded_state; - struct timeval serialize_start; + timespec serialize_start; set deserialized_urls; map deserialized_acceptors; multimap inputs; // multimap due to older versions without deduplication. @@ -406,7 +413,7 @@ start: } serialize_start.tv_sec = loaded_state.serialize_start_sec(); - serialize_start.tv_usec = loaded_state.serialize_start_usec(); + serialize_start.tv_nsec = loaded_state.serialize_start_usec() * 1000ull; // Deserialize the streams. map stream_headers_for_url; // See below. @@ -529,23 +536,33 @@ start: input_stats_thread->run(); } - struct timeval server_start; - gettimeofday(&server_start, NULL); + timespec server_start; + int err = clock_gettime(CLOCK_MONOTONIC, &server_start); + assert(err != -1); if (state_fd != -1) { // Measure time from we started deserializing (below) to now, when basically everything // is up and running. This is, in other words, a conservative estimate of how long our // “glitch” period was, not counting of course reconnects if the configuration changed. double glitch_time = server_start.tv_sec - serialize_start.tv_sec + - 1e-6 * (server_start.tv_usec - serialize_start.tv_usec); + 1e-9 * (server_start.tv_nsec - serialize_start.tv_nsec); log(INFO, "Re-exec happened in approx. %.0f ms.", glitch_time * 1000.0); } + sd_notify(0, "READY=1"); + while (!hupped) { usleep(100000); } + if (stopped) { + sd_notify(0, "STOPPING=1"); + } else { + sd_notify(0, "RELOADING=1"); + } + // OK, we've been HUPed. Time to shut down everything, serialize, and re-exec. - gettimeofday(&serialize_start, NULL); + err = clock_gettime(CLOCK_MONOTONIC, &serialize_start); + assert(err != -1); if (input_stats_thread != NULL) { input_stats_thread->stop();