summaryrefslogtreecommitdiff
path: root/0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch
diff options
context:
space:
mode:
Diffstat (limited to '0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch')
-rw-r--r--0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch134
1 files changed, 134 insertions, 0 deletions
diff --git a/0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch b/0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch
new file mode 100644
index 0000000..c5bd888
--- /dev/null
+++ b/0031-fix-CRI-SetupPod-and-TearDownPod-deadlock.patch
@@ -0,0 +1,134 @@
+From a87e8aeea252e5aec9e1dea0daf99562eb86b092 Mon Sep 17 00:00:00 2001
+From: zhangxiaoyu <zhangxiaoyu58@huawei.com>
+Date: Thu, 2 Mar 2023 20:05:49 +0800
+Subject: [PATCH 31/53] fix CRI SetupPod and TearDownPod deadlock
+
+Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
+---
+ src/daemon/entry/cri/cni_network_plugin.cc | 14 +++++++----
+ .../cri/cri_pod_sandbox_manager_service.cc | 2 ++
+ src/daemon/entry/cri/network_plugin.cc | 25 +++++++++++++------
+ 3 files changed, 29 insertions(+), 12 deletions(-)
+
+diff --git a/src/daemon/entry/cri/cni_network_plugin.cc b/src/daemon/entry/cri/cni_network_plugin.cc
+index 1bce13f6..0fe095b6 100644
+--- a/src/daemon/entry/cri/cni_network_plugin.cc
++++ b/src/daemon/entry/cri/cni_network_plugin.cc
+@@ -120,8 +120,10 @@ auto CniNetworkPlugin::Name() const -> const std::string &
+
+ void CniNetworkPlugin::CheckInitialized(Errors &err)
+ {
+- RLockNetworkMap(err);
+- if (err.NotEmpty()) {
++ Errors tmpErr;
++ RLockNetworkMap(tmpErr);
++ if (tmpErr.NotEmpty()) {
++ err.AppendError(tmpErr.GetCMessage());
+ return;
+ }
+
+@@ -129,9 +131,10 @@ void CniNetworkPlugin::CheckInitialized(Errors &err)
+ err.SetError("cni config uninitialized");
+ }
+
+- UnlockNetworkMap(err);
+- if (err.NotEmpty()) {
+- WARN("Unable to update cni config: %s", err.GetCMessage());
++ UnlockNetworkMap(tmpErr);
++ if (tmpErr.NotEmpty()) {
++ WARN("Unable to update cni config: %s", tmpErr.GetCMessage());
++ err.AppendError(tmpErr.GetCMessage());
+ }
+ }
+
+@@ -623,6 +626,7 @@ void CniNetworkPlugin::SetUpPod(const std::string &ns, const std::string &name,
+ return;
+ }
+
++ err.Clear();
+ RLockNetworkMap(err);
+ if (err.NotEmpty()) {
+ ERROR("%s", err.GetCMessage());
+diff --git a/src/daemon/entry/cri/cri_pod_sandbox_manager_service.cc b/src/daemon/entry/cri/cri_pod_sandbox_manager_service.cc
+index 3d183861..ee523b9c 100644
+--- a/src/daemon/entry/cri/cri_pod_sandbox_manager_service.cc
++++ b/src/daemon/entry/cri/cri_pod_sandbox_manager_service.cc
+@@ -705,6 +705,7 @@ auto PodSandboxManagerService::GetRealSandboxIDToStop(const std::string &podSand
+ if (status->linux().namespaces().has_options()) {
+ hostNetwork = (status->linux().namespaces().options().network() == runtime::v1alpha2::NamespaceMode::NODE);
+ }
++ // if metadata is invalid, don't return -1 and continue stopping pod
+ if (status->has_metadata()) {
+ name = status->metadata().name();
+ ns = status->metadata().namespace_();
+@@ -831,6 +832,7 @@ auto PodSandboxManagerService::ClearCniNetwork(const std::string &realSandboxID,
+ }
+
+ stdAnnos.insert(std::pair<std::string, std::string>(CRIHelpers::Constants::POD_SANDBOX_KEY, netnsPath));
++ pluginErr.Clear();
+ m_pluginManager->TearDownPod(ns, name, Network::DEFAULT_NETWORK_INTERFACE_NAME, realSandboxID, stdAnnos,
+ pluginErr);
+ if (pluginErr.NotEmpty()) {
+diff --git a/src/daemon/entry/cri/network_plugin.cc b/src/daemon/entry/cri/network_plugin.cc
+index 4a119d6b..e55db4ea 100644
+--- a/src/daemon/entry/cri/network_plugin.cc
++++ b/src/daemon/entry/cri/network_plugin.cc
+@@ -425,20 +425,26 @@ void PluginManager::SetUpPod(const std::string &ns, const std::string &name, con
+ return;
+ }
+
++ Errors tmpErr;
+ std::string fullName = name + "_" + ns;
+- Lock(fullName, error);
+- if (error.NotEmpty()) {
++ Lock(fullName, tmpErr);
++ if (tmpErr.NotEmpty()) {
++ error.AppendError(tmpErr.GetCMessage());
+ return;
+ }
+ INFO("Calling network plugin %s to set up pod %s", m_plugin->Name().c_str(), fullName.c_str());
+
+- Errors tmpErr;
+ m_plugin->SetUpPod(ns, name, interfaceName, podSandboxID, annotations, options, network_settings_json, tmpErr);
+ if (tmpErr.NotEmpty()) {
+ error.Errorf("NetworkPlugin %s failed to set up pod %s network: %s", m_plugin->Name().c_str(), fullName.c_str(),
+ tmpErr.GetCMessage());
+ }
+- Unlock(fullName, error);
++
++ tmpErr.Clear();
++ Unlock(fullName, tmpErr);
++ if (tmpErr.NotEmpty()) {
++ error.AppendError(tmpErr.GetCMessage());
++ }
+ }
+
+ void PluginManager::TearDownPod(const std::string &ns, const std::string &name, const std::string &interfaceName,
+@@ -447,8 +453,9 @@ void PluginManager::TearDownPod(const std::string &ns, const std::string &name,
+ {
+ Errors tmpErr;
+ std::string fullName = name + "_" + ns;
+- Lock(fullName, error);
+- if (error.NotEmpty()) {
++ Lock(fullName, tmpErr);
++ if (tmpErr.NotEmpty()) {
++ error.AppendError(tmpErr.GetCMessage());
+ return;
+ }
+ if (m_plugin == nullptr) {
+@@ -462,7 +469,11 @@ void PluginManager::TearDownPod(const std::string &ns, const std::string &name,
+ fullName.c_str(), tmpErr.GetCMessage());
+ }
+ unlock:
+- Unlock(fullName, error);
++ tmpErr.Clear();
++ Unlock(fullName, tmpErr);
++ if (tmpErr.NotEmpty()) {
++ error.AppendError(tmpErr.GetCMessage());
++ }
+ }
+
+ void NoopNetworkPlugin::Init(const std::string &hairpinMode, const std::string &nonMasqueradeCIDR, int mtu,
+--
+2.25.1
+