Commit c96c622e authored by Yusuke Sato's avatar Yusuke Sato Committed by Commit Bot

arc: Detect ARCVM exits and crashes

This allows arc::ArcSessionManager to restart the VM when needed.

BUG=b:135556154, b:141966414
TEST=kill off ARCVM's crosvm, verify the observer detects the event.

Change-Id: Iba71de782db078b1b89d196ef06c749ebd17f260
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1841250Reviewed-by: default avatarHidehiko Abe <hidehiko@chromium.org>
Commit-Queue: Yusuke Sato <yusukes@chromium.org>
Auto-Submit: Yusuke Sato <yusukes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#704091}
parent b8dcdddb
...@@ -16,17 +16,43 @@ ...@@ -16,17 +16,43 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/system/sys_info.h" #include "base/system/sys_info.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "chromeos/dbus/concierge_client.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/login_manager/arc.pb.h" #include "chromeos/dbus/login_manager/arc.pb.h"
#include "chromeos/dbus/upstart/upstart_client.h" #include "chromeos/dbus/upstart/upstart_client.h"
#include "components/arc/arc_util.h" #include "components/arc/arc_util.h"
namespace arc { namespace arc {
namespace {
class ArcVmClientAdapter : public ArcClientAdapter { chromeos::ConciergeClient* GetConciergeClient() {
return chromeos::DBusThreadManager::Get()->GetConciergeClient();
}
} // namespace
class ArcVmClientAdapter : public ArcClientAdapter,
public chromeos::ConciergeClient::VmObserver {
public: public:
ArcVmClientAdapter() {} ArcVmClientAdapter() { GetConciergeClient()->AddVmObserver(this); }
~ArcVmClientAdapter() override = default; ~ArcVmClientAdapter() override {
GetConciergeClient()->RemoveVmObserver(this);
}
// chromeos::ConciergeClient::VmObserver overrides:
void OnVmStarted(
const vm_tools::concierge::VmStartedSignal& signal) override {
if (signal.name() == kArcVmName)
VLOG(1) << "OnVmStarted: ARCVM cid=" << signal.vm_info().cid();
}
void OnVmStopped(
const vm_tools::concierge::VmStoppedSignal& signal) override {
if (signal.name() != kArcVmName)
return;
VLOG(1) << "OnVmStopped: ARCVM";
OnArcInstanceStopped();
}
// ArcClientAdapter overrides: // ArcClientAdapter overrides:
void StartMiniArc(const StartArcMiniContainerRequest& request, void StartMiniArc(const StartArcMiniContainerRequest& request,
...@@ -72,7 +98,7 @@ class ArcVmClientAdapter : public ArcClientAdapter { ...@@ -72,7 +98,7 @@ class ArcVmClientAdapter : public ArcClientAdapter {
std::vector<std::string> env{{"USER_ID_HASH=" + user_id_hash_}}; std::vector<std::string> env{{"USER_ID_HASH=" + user_id_hash_}};
chromeos::UpstartClient::Get()->StopJob( chromeos::UpstartClient::Get()->StopJob(
"arcvm", env, "arcvm", env,
base::BindOnce(&ArcVmClientAdapter::OnVmStopped, base::BindOnce(&ArcVmClientAdapter::OnArcVmJobStopped,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
...@@ -82,18 +108,16 @@ class ArcVmClientAdapter : public ArcClientAdapter { ...@@ -82,18 +108,16 @@ class ArcVmClientAdapter : public ArcClientAdapter {
} }
private: private:
// TODO(yusukes|cmtm): Monitor unexpected crosvm crash/shutdown and call this
// method.
void OnArcInstanceStopped() { void OnArcInstanceStopped() {
VLOG(1) << "arcvm stopped."; VLOG(1) << "arcvm stopped.";
for (auto& observer : observer_list_) for (auto& observer : observer_list_)
observer.ArcInstanceStopped(); observer.ArcInstanceStopped();
} }
void OnVmStopped(bool result) { // TODO(yusukes): Remove this method when we remove arcvm.conf.
void OnArcVmJobStopped(bool result) {
if (!result) if (!result)
LOG(ERROR) << "Failed to stop arcvm."; LOG(ERROR) << "Failed to stop arcvm.";
OnArcInstanceStopped();
} }
// A hash of the primary profile user ID. // A hash of the primary profile user ID.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment