// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_ #define BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_ #include #include #include "src/main/cpp/startup_options.h" #include "src/main/cpp/util/logging.h" namespace blaze { // Determines the contents of the archive, storing the names of the contained // files into `files` and the install md5 key into `install_md5`. void DetermineArchiveContents(const std::string &archive_path, std::vector *files, std::string *install_md5); struct DurationMillis { public: const uint64_t millis; DurationMillis() : millis(kUnknownDuration) {} DurationMillis(const uint64_t ms) : millis(ms) {} bool IsUnknown() const { return millis == kUnknownDuration; } private: // Value representing that a timing event never occurred or is unknown. static constexpr uint64_t kUnknownDuration = 0; }; // DurationMillis that tracks if an archive was extracted. struct ExtractionDurationMillis : DurationMillis { const bool archive_extracted; ExtractionDurationMillis() : DurationMillis(), archive_extracted(false) {} ExtractionDurationMillis(const uint64_t ms, const bool archive_extracted) : DurationMillis(ms), archive_extracted(archive_extracted) {} }; // The reason for a blaze server restart. // Keep in sync with logging.proto. enum RestartReason { NO_RESTART = 0, NO_DAEMON, NEW_VERSION, NEW_OPTIONS, PID_FILE_BUT_NO_SERVER, SERVER_VANISHED, SERVER_UNRESPONSIVE }; // Encapsulates miscellaneous information reported to the server for logging and // profiling purposes. struct LoggingInfo { public: explicit LoggingInfo(const std::string &binary_path_, const uint64_t start_time_ms_) : binary_path(binary_path_), start_time_ms(start_time_ms_), restart_reason(NO_RESTART) {} void SetRestartReasonIfNotSet(const RestartReason restart_reason_) { if (restart_reason == NO_RESTART) { restart_reason = restart_reason_; } } // Path of this binary. const std::string binary_path; // The time in ms the binary started up, measured from approximately the time // that "main" was called. const uint64_t start_time_ms; // The reason the server was restarted. RestartReason restart_reason; }; // Extracts the archive and ensures success via calls to ExtractArchiveOrDie and // BlessFiles. If the install base, the location the archive is unpacked, // already exists, extraction is skipped. Kills the client if an error is // encountered. ExtractionDurationMillis ExtractData( const std::string &self_path, const std::vector &archive_contents, const std::string &expected_install_md5, const StartupOptions &startup_options, LoggingInfo *logging_info); // Extracts the embedded data files in `archive_path` into `output_dir`. // It's expected that `output_dir` already exists and that it's a directory. // Fails if `expected_install_md5` doesn't match that contained in the archive, // as this could indicate that the contents has unexpectedly changed. void ExtractArchiveOrDie(const std::string &archive_path, const std::string &product_name, const std::string &expected_install_md5, const std::string &output_dir); // Sets the timestamps of the extracted files to the future via // blaze_util::IFileMtime::SetToDistanceFuture and ensures that the files we // have written are actually on the disk. Later, the blaze client calls // blaze_util::IFileMtime::IsUntampered to ensure the files were "blessed" with // these distant mtimes. void BlessFiles(const std::string &embedded_binaries); // Retrieves the build label (version string) from `archive_path` into // `build_label`. void ExtractBuildLabel(const std::string &archive_path, std::string *build_label); // Returns the server jar path from the archive contents. std::string GetServerJarPath(const std::vector &archive_contents); } // namespace blaze #endif // BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_