1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker *
4*33f37583SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker *
8*33f37583SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker *
10*33f37583SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker */
16*33f37583SAndroid Build Coastguard Worker
17*33f37583SAndroid Build Coastguard Worker #include "apexd_session.h"
18*33f37583SAndroid Build Coastguard Worker
19*33f37583SAndroid Build Coastguard Worker #include <android-base/errors.h>
20*33f37583SAndroid Build Coastguard Worker #include <android-base/logging.h>
21*33f37583SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
22*33f37583SAndroid Build Coastguard Worker #include <dirent.h>
23*33f37583SAndroid Build Coastguard Worker #include <sys/stat.h>
24*33f37583SAndroid Build Coastguard Worker
25*33f37583SAndroid Build Coastguard Worker #include <filesystem>
26*33f37583SAndroid Build Coastguard Worker #include <fstream>
27*33f37583SAndroid Build Coastguard Worker #include <optional>
28*33f37583SAndroid Build Coastguard Worker #include <utility>
29*33f37583SAndroid Build Coastguard Worker
30*33f37583SAndroid Build Coastguard Worker #include "apexd_utils.h"
31*33f37583SAndroid Build Coastguard Worker #include "session_state.pb.h"
32*33f37583SAndroid Build Coastguard Worker #include "string_log.h"
33*33f37583SAndroid Build Coastguard Worker
34*33f37583SAndroid Build Coastguard Worker using android::base::Error;
35*33f37583SAndroid Build Coastguard Worker using android::base::Result;
36*33f37583SAndroid Build Coastguard Worker using android::base::StringPrintf;
37*33f37583SAndroid Build Coastguard Worker using apex::proto::SessionState;
38*33f37583SAndroid Build Coastguard Worker
39*33f37583SAndroid Build Coastguard Worker namespace android {
40*33f37583SAndroid Build Coastguard Worker namespace apex {
41*33f37583SAndroid Build Coastguard Worker
42*33f37583SAndroid Build Coastguard Worker namespace {
43*33f37583SAndroid Build Coastguard Worker
44*33f37583SAndroid Build Coastguard Worker static constexpr const char* kStateFileName = "state";
45*33f37583SAndroid Build Coastguard Worker
ParseSessionState(const std::string & session_dir)46*33f37583SAndroid Build Coastguard Worker static Result<SessionState> ParseSessionState(const std::string& session_dir) {
47*33f37583SAndroid Build Coastguard Worker auto path = StringPrintf("%s/%s", session_dir.c_str(), kStateFileName);
48*33f37583SAndroid Build Coastguard Worker SessionState state;
49*33f37583SAndroid Build Coastguard Worker std::fstream state_file(path, std::ios::in | std::ios::binary);
50*33f37583SAndroid Build Coastguard Worker if (!state_file) {
51*33f37583SAndroid Build Coastguard Worker return Error() << "Failed to open " << path;
52*33f37583SAndroid Build Coastguard Worker }
53*33f37583SAndroid Build Coastguard Worker
54*33f37583SAndroid Build Coastguard Worker if (!state.ParseFromIstream(&state_file)) {
55*33f37583SAndroid Build Coastguard Worker return Error() << "Failed to parse " << path;
56*33f37583SAndroid Build Coastguard Worker }
57*33f37583SAndroid Build Coastguard Worker
58*33f37583SAndroid Build Coastguard Worker return std::move(state);
59*33f37583SAndroid Build Coastguard Worker }
60*33f37583SAndroid Build Coastguard Worker
61*33f37583SAndroid Build Coastguard Worker } // namespace
62*33f37583SAndroid Build Coastguard Worker
GetSessionsDir()63*33f37583SAndroid Build Coastguard Worker std::string GetSessionsDir() {
64*33f37583SAndroid Build Coastguard Worker static std::string result;
65*33f37583SAndroid Build Coastguard Worker static std::once_flag once_flag;
66*33f37583SAndroid Build Coastguard Worker std::call_once(once_flag, [&]() {
67*33f37583SAndroid Build Coastguard Worker auto status =
68*33f37583SAndroid Build Coastguard Worker FindFirstExistingDirectory(kNewApexSessionsDir, kOldApexSessionsDir);
69*33f37583SAndroid Build Coastguard Worker if (!status.ok()) {
70*33f37583SAndroid Build Coastguard Worker LOG(FATAL) << status.error();
71*33f37583SAndroid Build Coastguard Worker }
72*33f37583SAndroid Build Coastguard Worker result = std::move(*status);
73*33f37583SAndroid Build Coastguard Worker });
74*33f37583SAndroid Build Coastguard Worker return result;
75*33f37583SAndroid Build Coastguard Worker }
76*33f37583SAndroid Build Coastguard Worker
ApexSession(SessionState state,std::string session_dir)77*33f37583SAndroid Build Coastguard Worker ApexSession::ApexSession(SessionState state, std::string session_dir)
78*33f37583SAndroid Build Coastguard Worker : state_(std::move(state)), session_dir_(std::move(session_dir)) {}
79*33f37583SAndroid Build Coastguard Worker
GetState() const80*33f37583SAndroid Build Coastguard Worker SessionState::State ApexSession::GetState() const { return state_.state(); }
81*33f37583SAndroid Build Coastguard Worker
GetId() const82*33f37583SAndroid Build Coastguard Worker int ApexSession::GetId() const { return state_.id(); }
83*33f37583SAndroid Build Coastguard Worker
GetBuildFingerprint() const84*33f37583SAndroid Build Coastguard Worker const std::string& ApexSession::GetBuildFingerprint() const {
85*33f37583SAndroid Build Coastguard Worker return state_.expected_build_fingerprint();
86*33f37583SAndroid Build Coastguard Worker }
87*33f37583SAndroid Build Coastguard Worker
IsFinalized() const88*33f37583SAndroid Build Coastguard Worker bool ApexSession::IsFinalized() const {
89*33f37583SAndroid Build Coastguard Worker switch (GetState()) {
90*33f37583SAndroid Build Coastguard Worker case SessionState::SUCCESS:
91*33f37583SAndroid Build Coastguard Worker case SessionState::ACTIVATION_FAILED:
92*33f37583SAndroid Build Coastguard Worker case SessionState::REVERTED:
93*33f37583SAndroid Build Coastguard Worker case SessionState::REVERT_FAILED:
94*33f37583SAndroid Build Coastguard Worker return true;
95*33f37583SAndroid Build Coastguard Worker default:
96*33f37583SAndroid Build Coastguard Worker return false;
97*33f37583SAndroid Build Coastguard Worker }
98*33f37583SAndroid Build Coastguard Worker }
99*33f37583SAndroid Build Coastguard Worker
HasRollbackEnabled() const100*33f37583SAndroid Build Coastguard Worker bool ApexSession::HasRollbackEnabled() const {
101*33f37583SAndroid Build Coastguard Worker return state_.rollback_enabled();
102*33f37583SAndroid Build Coastguard Worker }
103*33f37583SAndroid Build Coastguard Worker
IsRollback() const104*33f37583SAndroid Build Coastguard Worker bool ApexSession::IsRollback() const { return state_.is_rollback(); }
105*33f37583SAndroid Build Coastguard Worker
GetRollbackId() const106*33f37583SAndroid Build Coastguard Worker int ApexSession::GetRollbackId() const { return state_.rollback_id(); }
107*33f37583SAndroid Build Coastguard Worker
GetCrashingNativeProcess() const108*33f37583SAndroid Build Coastguard Worker const std::string& ApexSession::GetCrashingNativeProcess() const {
109*33f37583SAndroid Build Coastguard Worker return state_.crashing_native_process();
110*33f37583SAndroid Build Coastguard Worker }
111*33f37583SAndroid Build Coastguard Worker
GetErrorMessage() const112*33f37583SAndroid Build Coastguard Worker const std::string& ApexSession::GetErrorMessage() const {
113*33f37583SAndroid Build Coastguard Worker return state_.error_message();
114*33f37583SAndroid Build Coastguard Worker }
115*33f37583SAndroid Build Coastguard Worker
GetChildSessionIds() const116*33f37583SAndroid Build Coastguard Worker const google::protobuf::RepeatedField<int> ApexSession::GetChildSessionIds()
117*33f37583SAndroid Build Coastguard Worker const {
118*33f37583SAndroid Build Coastguard Worker return state_.child_session_ids();
119*33f37583SAndroid Build Coastguard Worker }
120*33f37583SAndroid Build Coastguard Worker
SetChildSessionIds(const std::vector<int> & child_session_ids)121*33f37583SAndroid Build Coastguard Worker void ApexSession::SetChildSessionIds(
122*33f37583SAndroid Build Coastguard Worker const std::vector<int>& child_session_ids) {
123*33f37583SAndroid Build Coastguard Worker *(state_.mutable_child_session_ids()) = {child_session_ids.begin(),
124*33f37583SAndroid Build Coastguard Worker child_session_ids.end()};
125*33f37583SAndroid Build Coastguard Worker }
126*33f37583SAndroid Build Coastguard Worker
127*33f37583SAndroid Build Coastguard Worker const google::protobuf::RepeatedPtrField<std::string>
GetApexNames() const128*33f37583SAndroid Build Coastguard Worker ApexSession::GetApexNames() const {
129*33f37583SAndroid Build Coastguard Worker return state_.apex_names();
130*33f37583SAndroid Build Coastguard Worker }
131*33f37583SAndroid Build Coastguard Worker
132*33f37583SAndroid Build Coastguard Worker const google::protobuf::RepeatedPtrField<std::string>
GetApexFileHashes() const133*33f37583SAndroid Build Coastguard Worker ApexSession::GetApexFileHashes() const {
134*33f37583SAndroid Build Coastguard Worker return state_.apex_file_hashes();
135*33f37583SAndroid Build Coastguard Worker }
136*33f37583SAndroid Build Coastguard Worker
GetSessionDir() const137*33f37583SAndroid Build Coastguard Worker const std::string& ApexSession::GetSessionDir() const { return session_dir_; }
138*33f37583SAndroid Build Coastguard Worker
SetBuildFingerprint(const std::string & fingerprint)139*33f37583SAndroid Build Coastguard Worker void ApexSession::SetBuildFingerprint(const std::string& fingerprint) {
140*33f37583SAndroid Build Coastguard Worker *(state_.mutable_expected_build_fingerprint()) = fingerprint;
141*33f37583SAndroid Build Coastguard Worker }
142*33f37583SAndroid Build Coastguard Worker
SetHasRollbackEnabled(const bool enabled)143*33f37583SAndroid Build Coastguard Worker void ApexSession::SetHasRollbackEnabled(const bool enabled) {
144*33f37583SAndroid Build Coastguard Worker state_.set_rollback_enabled(enabled);
145*33f37583SAndroid Build Coastguard Worker }
146*33f37583SAndroid Build Coastguard Worker
SetIsRollback(const bool is_rollback)147*33f37583SAndroid Build Coastguard Worker void ApexSession::SetIsRollback(const bool is_rollback) {
148*33f37583SAndroid Build Coastguard Worker state_.set_is_rollback(is_rollback);
149*33f37583SAndroid Build Coastguard Worker }
150*33f37583SAndroid Build Coastguard Worker
SetRollbackId(const int rollback_id)151*33f37583SAndroid Build Coastguard Worker void ApexSession::SetRollbackId(const int rollback_id) {
152*33f37583SAndroid Build Coastguard Worker state_.set_rollback_id(rollback_id);
153*33f37583SAndroid Build Coastguard Worker }
154*33f37583SAndroid Build Coastguard Worker
SetCrashingNativeProcess(const std::string & crashing_process)155*33f37583SAndroid Build Coastguard Worker void ApexSession::SetCrashingNativeProcess(
156*33f37583SAndroid Build Coastguard Worker const std::string& crashing_process) {
157*33f37583SAndroid Build Coastguard Worker state_.set_crashing_native_process(crashing_process);
158*33f37583SAndroid Build Coastguard Worker }
159*33f37583SAndroid Build Coastguard Worker
SetErrorMessage(const std::string & error_message)160*33f37583SAndroid Build Coastguard Worker void ApexSession::SetErrorMessage(const std::string& error_message) {
161*33f37583SAndroid Build Coastguard Worker state_.set_error_message(error_message);
162*33f37583SAndroid Build Coastguard Worker }
163*33f37583SAndroid Build Coastguard Worker
AddApexName(const std::string & apex_name)164*33f37583SAndroid Build Coastguard Worker void ApexSession::AddApexName(const std::string& apex_name) {
165*33f37583SAndroid Build Coastguard Worker state_.add_apex_names(apex_name);
166*33f37583SAndroid Build Coastguard Worker }
167*33f37583SAndroid Build Coastguard Worker
SetApexFileHashes(const std::vector<std::string> & hashes)168*33f37583SAndroid Build Coastguard Worker void ApexSession::SetApexFileHashes(const std::vector<std::string>& hashes) {
169*33f37583SAndroid Build Coastguard Worker *(state_.mutable_apex_file_hashes()) = {hashes.begin(), hashes.end()};
170*33f37583SAndroid Build Coastguard Worker }
171*33f37583SAndroid Build Coastguard Worker
UpdateStateAndCommit(const SessionState::State & session_state)172*33f37583SAndroid Build Coastguard Worker Result<void> ApexSession::UpdateStateAndCommit(
173*33f37583SAndroid Build Coastguard Worker const SessionState::State& session_state) {
174*33f37583SAndroid Build Coastguard Worker state_.set_state(session_state);
175*33f37583SAndroid Build Coastguard Worker
176*33f37583SAndroid Build Coastguard Worker auto state_file_path =
177*33f37583SAndroid Build Coastguard Worker StringPrintf("%s/%s", session_dir_.c_str(), kStateFileName);
178*33f37583SAndroid Build Coastguard Worker
179*33f37583SAndroid Build Coastguard Worker std::fstream state_file(state_file_path,
180*33f37583SAndroid Build Coastguard Worker std::ios::out | std::ios::trunc | std::ios::binary);
181*33f37583SAndroid Build Coastguard Worker if (!state_.SerializeToOstream(&state_file)) {
182*33f37583SAndroid Build Coastguard Worker return Error() << "Failed to write state file " << state_file_path;
183*33f37583SAndroid Build Coastguard Worker }
184*33f37583SAndroid Build Coastguard Worker
185*33f37583SAndroid Build Coastguard Worker return {};
186*33f37583SAndroid Build Coastguard Worker }
187*33f37583SAndroid Build Coastguard Worker
DeleteSession() const188*33f37583SAndroid Build Coastguard Worker Result<void> ApexSession::DeleteSession() const {
189*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "Deleting " << session_dir_;
190*33f37583SAndroid Build Coastguard Worker auto path = std::filesystem::path(session_dir_);
191*33f37583SAndroid Build Coastguard Worker std::error_code error_code;
192*33f37583SAndroid Build Coastguard Worker std::filesystem::remove_all(path, error_code);
193*33f37583SAndroid Build Coastguard Worker if (error_code) {
194*33f37583SAndroid Build Coastguard Worker return Error() << "Failed to delete " << session_dir_ << " : "
195*33f37583SAndroid Build Coastguard Worker << error_code.message();
196*33f37583SAndroid Build Coastguard Worker }
197*33f37583SAndroid Build Coastguard Worker return {};
198*33f37583SAndroid Build Coastguard Worker }
199*33f37583SAndroid Build Coastguard Worker
operator <<(std::ostream & out,const ApexSession & session)200*33f37583SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const ApexSession& session) {
201*33f37583SAndroid Build Coastguard Worker return out << "[id = " << session.GetId()
202*33f37583SAndroid Build Coastguard Worker << "; state = " << SessionState::State_Name(session.GetState())
203*33f37583SAndroid Build Coastguard Worker << "; session_dir = " << session.GetSessionDir() << "]";
204*33f37583SAndroid Build Coastguard Worker }
205*33f37583SAndroid Build Coastguard Worker
GetStagedApexDirs(const std::string & staged_session_dir) const206*33f37583SAndroid Build Coastguard Worker std::vector<std::string> ApexSession::GetStagedApexDirs(
207*33f37583SAndroid Build Coastguard Worker const std::string& staged_session_dir) const {
208*33f37583SAndroid Build Coastguard Worker const google::protobuf::RepeatedField<int>& child_session_ids =
209*33f37583SAndroid Build Coastguard Worker state_.child_session_ids();
210*33f37583SAndroid Build Coastguard Worker std::vector<std::string> dirs;
211*33f37583SAndroid Build Coastguard Worker if (child_session_ids.empty()) {
212*33f37583SAndroid Build Coastguard Worker dirs.push_back(staged_session_dir + "/session_" + std::to_string(GetId()));
213*33f37583SAndroid Build Coastguard Worker } else {
214*33f37583SAndroid Build Coastguard Worker for (auto child_session_id : child_session_ids) {
215*33f37583SAndroid Build Coastguard Worker dirs.push_back(staged_session_dir + "/session_" +
216*33f37583SAndroid Build Coastguard Worker std::to_string(child_session_id));
217*33f37583SAndroid Build Coastguard Worker }
218*33f37583SAndroid Build Coastguard Worker }
219*33f37583SAndroid Build Coastguard Worker return dirs;
220*33f37583SAndroid Build Coastguard Worker }
221*33f37583SAndroid Build Coastguard Worker
ApexSessionManager(std::string sessions_base_dir)222*33f37583SAndroid Build Coastguard Worker ApexSessionManager::ApexSessionManager(std::string sessions_base_dir)
223*33f37583SAndroid Build Coastguard Worker : sessions_base_dir_(std::move(sessions_base_dir)) {}
224*33f37583SAndroid Build Coastguard Worker
ApexSessionManager(ApexSessionManager && other)225*33f37583SAndroid Build Coastguard Worker ApexSessionManager::ApexSessionManager(ApexSessionManager&& other) noexcept
226*33f37583SAndroid Build Coastguard Worker : sessions_base_dir_(std::move(other.sessions_base_dir_)) {}
227*33f37583SAndroid Build Coastguard Worker
operator =(ApexSessionManager && other)228*33f37583SAndroid Build Coastguard Worker ApexSessionManager& ApexSessionManager::operator=(
229*33f37583SAndroid Build Coastguard Worker ApexSessionManager&& other) noexcept {
230*33f37583SAndroid Build Coastguard Worker sessions_base_dir_ = std::move(other.sessions_base_dir_);
231*33f37583SAndroid Build Coastguard Worker return *this;
232*33f37583SAndroid Build Coastguard Worker }
233*33f37583SAndroid Build Coastguard Worker
Create(std::string sessions_base_dir)234*33f37583SAndroid Build Coastguard Worker std::unique_ptr<ApexSessionManager> ApexSessionManager::Create(
235*33f37583SAndroid Build Coastguard Worker std::string sessions_base_dir) {
236*33f37583SAndroid Build Coastguard Worker return std::unique_ptr<ApexSessionManager>(
237*33f37583SAndroid Build Coastguard Worker new ApexSessionManager(std::move(sessions_base_dir)));
238*33f37583SAndroid Build Coastguard Worker }
239*33f37583SAndroid Build Coastguard Worker
CreateSession(int session_id)240*33f37583SAndroid Build Coastguard Worker Result<ApexSession> ApexSessionManager::CreateSession(int session_id) {
241*33f37583SAndroid Build Coastguard Worker SessionState state;
242*33f37583SAndroid Build Coastguard Worker // Create session directory
243*33f37583SAndroid Build Coastguard Worker std::string session_dir =
244*33f37583SAndroid Build Coastguard Worker sessions_base_dir_ + "/" + std::to_string(session_id);
245*33f37583SAndroid Build Coastguard Worker OR_RETURN(CreateDirIfNeeded(session_dir, 0700));
246*33f37583SAndroid Build Coastguard Worker state.set_id(session_id);
247*33f37583SAndroid Build Coastguard Worker
248*33f37583SAndroid Build Coastguard Worker return ApexSession(std::move(state), std::move(session_dir));
249*33f37583SAndroid Build Coastguard Worker }
250*33f37583SAndroid Build Coastguard Worker
GetSession(int session_id) const251*33f37583SAndroid Build Coastguard Worker Result<ApexSession> ApexSessionManager::GetSession(int session_id) const {
252*33f37583SAndroid Build Coastguard Worker auto session_dir =
253*33f37583SAndroid Build Coastguard Worker StringPrintf("%s/%d", sessions_base_dir_.c_str(), session_id);
254*33f37583SAndroid Build Coastguard Worker
255*33f37583SAndroid Build Coastguard Worker auto state = OR_RETURN(ParseSessionState(session_dir));
256*33f37583SAndroid Build Coastguard Worker return ApexSession(std::move(state), std::move(session_dir));
257*33f37583SAndroid Build Coastguard Worker }
258*33f37583SAndroid Build Coastguard Worker
GetSessions() const259*33f37583SAndroid Build Coastguard Worker std::vector<ApexSession> ApexSessionManager::GetSessions() const {
260*33f37583SAndroid Build Coastguard Worker std::vector<ApexSession> sessions;
261*33f37583SAndroid Build Coastguard Worker
262*33f37583SAndroid Build Coastguard Worker auto walk_status = WalkDir(sessions_base_dir_, [&](const auto& entry) {
263*33f37583SAndroid Build Coastguard Worker if (!entry.is_directory()) {
264*33f37583SAndroid Build Coastguard Worker return;
265*33f37583SAndroid Build Coastguard Worker }
266*33f37583SAndroid Build Coastguard Worker
267*33f37583SAndroid Build Coastguard Worker std::string session_dir = entry.path();
268*33f37583SAndroid Build Coastguard Worker auto state = ParseSessionState(session_dir);
269*33f37583SAndroid Build Coastguard Worker if (!state.ok()) {
270*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << state.error();
271*33f37583SAndroid Build Coastguard Worker return;
272*33f37583SAndroid Build Coastguard Worker }
273*33f37583SAndroid Build Coastguard Worker
274*33f37583SAndroid Build Coastguard Worker ApexSession session(std::move(*state), std::move(session_dir));
275*33f37583SAndroid Build Coastguard Worker sessions.push_back(std::move(session));
276*33f37583SAndroid Build Coastguard Worker });
277*33f37583SAndroid Build Coastguard Worker
278*33f37583SAndroid Build Coastguard Worker if (!walk_status.ok()) {
279*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << walk_status.error();
280*33f37583SAndroid Build Coastguard Worker return sessions;
281*33f37583SAndroid Build Coastguard Worker }
282*33f37583SAndroid Build Coastguard Worker
283*33f37583SAndroid Build Coastguard Worker return sessions;
284*33f37583SAndroid Build Coastguard Worker }
285*33f37583SAndroid Build Coastguard Worker
GetSessionsInState(const SessionState::State & state) const286*33f37583SAndroid Build Coastguard Worker std::vector<ApexSession> ApexSessionManager::GetSessionsInState(
287*33f37583SAndroid Build Coastguard Worker const SessionState::State& state) const {
288*33f37583SAndroid Build Coastguard Worker std::vector<ApexSession> sessions = GetSessions();
289*33f37583SAndroid Build Coastguard Worker sessions.erase(std::remove_if(sessions.begin(), sessions.end(),
290*33f37583SAndroid Build Coastguard Worker [&](const ApexSession& s) {
291*33f37583SAndroid Build Coastguard Worker return s.GetState() != state;
292*33f37583SAndroid Build Coastguard Worker }),
293*33f37583SAndroid Build Coastguard Worker sessions.end());
294*33f37583SAndroid Build Coastguard Worker
295*33f37583SAndroid Build Coastguard Worker return sessions;
296*33f37583SAndroid Build Coastguard Worker }
297*33f37583SAndroid Build Coastguard Worker
MigrateFromOldSessionsDir(const std::string & old_sessions_base_dir)298*33f37583SAndroid Build Coastguard Worker Result<void> ApexSessionManager::MigrateFromOldSessionsDir(
299*33f37583SAndroid Build Coastguard Worker const std::string& old_sessions_base_dir) {
300*33f37583SAndroid Build Coastguard Worker if (old_sessions_base_dir == sessions_base_dir_) {
301*33f37583SAndroid Build Coastguard Worker LOG(INFO)
302*33f37583SAndroid Build Coastguard Worker << old_sessions_base_dir
303*33f37583SAndroid Build Coastguard Worker << " is the same as the current session directory. Nothing to migrate";
304*33f37583SAndroid Build Coastguard Worker return {};
305*33f37583SAndroid Build Coastguard Worker }
306*33f37583SAndroid Build Coastguard Worker
307*33f37583SAndroid Build Coastguard Worker return MoveDir(old_sessions_base_dir, sessions_base_dir_);
308*33f37583SAndroid Build Coastguard Worker }
309*33f37583SAndroid Build Coastguard Worker
HasActiveSession()310*33f37583SAndroid Build Coastguard Worker bool ApexSessionManager::HasActiveSession() {
311*33f37583SAndroid Build Coastguard Worker for (auto& s : GetSessions()) {
312*33f37583SAndroid Build Coastguard Worker if (!s.IsFinalized() &&
313*33f37583SAndroid Build Coastguard Worker s.GetState() != ::apex::proto::SessionState::UNKNOWN) {
314*33f37583SAndroid Build Coastguard Worker return true;
315*33f37583SAndroid Build Coastguard Worker }
316*33f37583SAndroid Build Coastguard Worker }
317*33f37583SAndroid Build Coastguard Worker return false;
318*33f37583SAndroid Build Coastguard Worker }
319*33f37583SAndroid Build Coastguard Worker
DeleteFinalizedSessions()320*33f37583SAndroid Build Coastguard Worker void ApexSessionManager::DeleteFinalizedSessions() {
321*33f37583SAndroid Build Coastguard Worker auto sessions = GetSessions();
322*33f37583SAndroid Build Coastguard Worker for (const ApexSession& session : sessions) {
323*33f37583SAndroid Build Coastguard Worker if (!session.IsFinalized()) {
324*33f37583SAndroid Build Coastguard Worker continue;
325*33f37583SAndroid Build Coastguard Worker }
326*33f37583SAndroid Build Coastguard Worker auto result = session.DeleteSession();
327*33f37583SAndroid Build Coastguard Worker if (!result.ok()) {
328*33f37583SAndroid Build Coastguard Worker LOG(WARNING) << "Failed to delete finalized session: " << session.GetId();
329*33f37583SAndroid Build Coastguard Worker }
330*33f37583SAndroid Build Coastguard Worker }
331*33f37583SAndroid Build Coastguard Worker }
332*33f37583SAndroid Build Coastguard Worker
333*33f37583SAndroid Build Coastguard Worker } // namespace apex
334*33f37583SAndroid Build Coastguard Worker } // namespace android
335