blob: 18856ab67dbddd3bfd57b5bdfcf36d260a401492 [file] [log] [blame]
michajlo3d8925d2019-05-20 16:10:41 -07001// Copyright 2014 The Bazel Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_
16#define BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_
17
18#include <string>
19#include <vector>
20
Googler057b6b72023-05-25 11:57:59 -070021#include "src/main/cpp/startup_options.h"
22#include "src/main/cpp/util/logging.h"
23
michajlo3d8925d2019-05-20 16:10:41 -070024namespace blaze {
25
michajlo6f38f342019-05-22 11:53:22 -070026// Determines the contents of the archive, storing the names of the contained
27// files into `files` and the install md5 key into `install_md5`.
28void DetermineArchiveContents(const std::string &archive_path,
michajlo6f38f342019-05-22 11:53:22 -070029 std::vector<std::string> *files,
30 std::string *install_md5);
michajlo3d8925d2019-05-20 16:10:41 -070031
Googler057b6b72023-05-25 11:57:59 -070032struct DurationMillis {
33 public:
34 const uint64_t millis;
35
36 DurationMillis() : millis(kUnknownDuration) {}
37 DurationMillis(const uint64_t ms) : millis(ms) {}
38
39 bool IsUnknown() const { return millis == kUnknownDuration; }
40
41 private:
42 // Value representing that a timing event never occurred or is unknown.
43 static constexpr uint64_t kUnknownDuration = 0;
44};
45
46// DurationMillis that tracks if an archive was extracted.
47struct ExtractionDurationMillis : DurationMillis {
48 const bool archive_extracted;
49 ExtractionDurationMillis() : DurationMillis(), archive_extracted(false) {}
50 ExtractionDurationMillis(const uint64_t ms, const bool archive_extracted)
51 : DurationMillis(ms), archive_extracted(archive_extracted) {}
52};
53
54// The reason for a blaze server restart.
55// Keep in sync with logging.proto.
56enum RestartReason {
57 NO_RESTART = 0,
58 NO_DAEMON,
59 NEW_VERSION,
60 NEW_OPTIONS,
61 PID_FILE_BUT_NO_SERVER,
62 SERVER_VANISHED,
63 SERVER_UNRESPONSIVE
64};
65
66// Encapsulates miscellaneous information reported to the server for logging and
67// profiling purposes.
68struct LoggingInfo {
69 public:
70 explicit LoggingInfo(const std::string &binary_path_,
71 const uint64_t start_time_ms_)
72 : binary_path(binary_path_),
73 start_time_ms(start_time_ms_),
74 restart_reason(NO_RESTART) {}
75
76 void SetRestartReasonIfNotSet(const RestartReason restart_reason_) {
77 if (restart_reason == NO_RESTART) {
78 restart_reason = restart_reason_;
79 }
80 }
81
82 // Path of this binary.
83 const std::string binary_path;
84
85 // The time in ms the binary started up, measured from approximately the time
86 // that "main" was called.
87 const uint64_t start_time_ms;
88
89 // The reason the server was restarted.
90 RestartReason restart_reason;
91};
92
93// Extracts the archive and ensures success via calls to ExtractArchiveOrDie and
94// BlessFiles. If the install base, the location the archive is unpacked,
95// already exists, extraction is skipped. Kills the client if an error is
96// encountered.
97ExtractionDurationMillis ExtractData(
98 const std::string &self_path,
99 const std::vector<std::string> &archive_contents,
100 const std::string &expected_install_md5,
101 const StartupOptions &startup_options, LoggingInfo *logging_info);
102
michajlo6f38f342019-05-22 11:53:22 -0700103// Extracts the embedded data files in `archive_path` into `output_dir`.
michajloaeae59a2020-03-27 12:21:25 -0700104// It's expected that `output_dir` already exists and that it's a directory.
michajlo6f38f342019-05-22 11:53:22 -0700105// Fails if `expected_install_md5` doesn't match that contained in the archive,
106// as this could indicate that the contents has unexpectedly changed.
107void ExtractArchiveOrDie(const std::string &archive_path,
108 const std::string &product_name,
109 const std::string &expected_install_md5,
110 const std::string &output_dir);
michajlo3d8925d2019-05-20 16:10:41 -0700111
Googler9b7b4cc2023-05-22 17:18:04 -0700112// Sets the timestamps of the extracted files to the future via
113// blaze_util::IFileMtime::SetToDistanceFuture and ensures that the files we
114// have written are actually on the disk. Later, the blaze client calls
115// blaze_util::IFileMtime::IsUntampered to ensure the files were "blessed" with
116// these distant mtimes.
117void BlessFiles(const std::string &embedded_binaries);
118
michajlo371a2e32019-05-23 13:14:39 -0700119// Retrieves the build label (version string) from `archive_path` into
120// `build_label`.
121void ExtractBuildLabel(const std::string &archive_path,
michajlo371a2e32019-05-23 13:14:39 -0700122 std::string *build_label);
michajlo97559ba2019-06-03 14:14:22 -0700123
124// Returns the server jar path from the archive contents.
125std::string GetServerJarPath(const std::vector<std::string> &archive_contents);
126
michajlo3d8925d2019-05-20 16:10:41 -0700127} // namespace blaze
128
129#endif // BAZEL_SRC_MAIN_CPP_ARCHIVE_UTILS_H_