summaryrefslogtreecommitdiff
path: root/0277-geo-rep-Fix-Config-Get-Race.patch
diff options
context:
space:
mode:
Diffstat (limited to '0277-geo-rep-Fix-Config-Get-Race.patch')
-rw-r--r--0277-geo-rep-Fix-Config-Get-Race.patch109
1 files changed, 109 insertions, 0 deletions
diff --git a/0277-geo-rep-Fix-Config-Get-Race.patch b/0277-geo-rep-Fix-Config-Get-Race.patch
new file mode 100644
index 0000000..45dada1
--- /dev/null
+++ b/0277-geo-rep-Fix-Config-Get-Race.patch
@@ -0,0 +1,109 @@
+From f40570f2f784dc61edb061a4931dcfc16bf51e7e Mon Sep 17 00:00:00 2001
+From: Aravinda VK <avishwan@redhat.com>
+Date: Mon, 5 Aug 2019 19:00:21 +0530
+Subject: [PATCH 277/284] geo-rep: Fix Config Get Race
+
+When two threads(sync jobs) in Geo-rep worker calls `gconf.get` and
+`gconf.getr`(realtime) at the sametime, `getr` resets the conf object
+and other one gets None. Thread Lock is introduced to fix the issue.
+
+```
+ File "/usr/libexec/glusterfs/python/syncdaemon/syncdutils.py",
+ line 368, in twrap
+ tf(*aargs)
+ File "/usr/libexec/glusterfs/python/syncdaemon/master.py", line 1987,
+ in syncjob
+ po = self.sync_engine(pb, self.log_err)
+ File "/usr/libexec/glusterfs/python/syncdaemon/resource.py",
+ line 1444, in rsync
+ rconf.ssh_ctl_args + \
+AttributeError: 'NoneType' object has no attribute 'split'
+```
+
+Backport of:
+ > Patch: https://review.gluster.org/#/c/glusterfs/+/23158/
+ > Change-Id: I9c245e5c36338265354e158f5baa32b119eb2da5
+ > Updates: bz#1737484
+ > Signed-off-by: Aravinda VK <avishwan@redhat.com>
+
+Change-Id: I9c245e5c36338265354e158f5baa32b119eb2da5
+BUG: 1729915
+Signed-off-by: Kotresh HR <khiremat@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/178960
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
+---
+ geo-replication/syncdaemon/gsyncdconfig.py | 27 +++++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/geo-replication/syncdaemon/gsyncdconfig.py b/geo-replication/syncdaemon/gsyncdconfig.py
+index 1fc451f..38f3594 100644
+--- a/geo-replication/syncdaemon/gsyncdconfig.py
++++ b/geo-replication/syncdaemon/gsyncdconfig.py
+@@ -17,6 +17,7 @@ import os
+ import shutil
+ from string import Template
+ from datetime import datetime
++from threading import Lock
+
+
+ # Global object which can be used in other modules
+@@ -35,6 +36,7 @@ class GconfInvalidValue(Exception):
+ class Gconf(object):
+ def __init__(self, default_conf_file, custom_conf_file=None,
+ args={}, extra_tmpl_args={}, override_from_args=False):
++ self.lock = Lock()
+ self.default_conf_file = default_conf_file
+ self.custom_conf_file = custom_conf_file
+ self.tmp_conf_file = None
+@@ -163,6 +165,11 @@ class Gconf(object):
+ if value is not None and not self._is_valid_value(name, value):
+ raise GconfInvalidValue()
+
++
++ def _load_with_lock(self):
++ with self.lock:
++ self._load()
++
+ def _load(self):
+ self.gconf = {}
+ self.template_conf = []
+@@ -230,12 +237,19 @@ class Gconf(object):
+ self._tmpl_substitute()
+ self._do_typecast()
+
+- def reload(self):
++ def reload(self, with_lock=True):
+ if self._is_config_changed():
+- self._load()
++ if with_lock:
++ self._load_with_lock()
++ else:
++ self._load()
+
+- def get(self, name, default_value=None):
+- return self.gconf.get(name, default_value)
++ def get(self, name, default_value=None, with_lock=True):
++ if with_lock:
++ with self.lock:
++ return self.gconf.get(name, default_value)
++ else:
++ return self.gconf.get(name, default_value)
+
+ def getall(self, show_defaults=False, show_non_configurable=False):
+ cnf = {}
+@@ -276,8 +290,9 @@ class Gconf(object):
+ return cnf
+
+ def getr(self, name, default_value=None):
+- self.reload()
+- return self.get(name, default_value)
++ with self.lock:
++ self.reload(with_lock=False)
++ return self.get(name, default_value, with_lock=False)
+
+ def get_help(self, name=None):
+ pass
+--
+1.8.3.1
+