autobuild v6.0-13
Resolves: bz#1729915 bz#1732376 bz#1743611 bz#1743627 bz#1743634 Resolves: bz#1744518 Signed-off-by: Rinku Kothiya <rkothiya@redhat.com>
This commit is contained in:
parent
9bd22fde48
commit
a297aa883e
109
0277-geo-rep-Fix-Config-Get-Race.patch
Normal file
109
0277-geo-rep-Fix-Config-Get-Race.patch
Normal file
@ -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
|
||||
|
45
0278-geo-rep-Fix-worker-connection-issue.patch
Normal file
45
0278-geo-rep-Fix-worker-connection-issue.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From 924a25990948c9d76001cf4134fc5a2fcbf5c02c Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Fri, 16 Aug 2019 15:38:49 +0530
|
||||
Subject: [PATCH 278/284] geo-rep: Fix worker connection issue
|
||||
|
||||
All the workers connects to primary slave node. It should
|
||||
connect to available slave nodes in round robin fashion
|
||||
and choose different slave node if the corresponding slave
|
||||
node is down. This patch fixes the same.
|
||||
|
||||
Thanks Aravinda for the help in root causing this.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23247/
|
||||
> Change-Id: I9f8e7744f4adb8a24833cf173681d109710f98cb
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
> Updates: bz#1737484
|
||||
|
||||
Change-Id: I9f8e7744f4adb8a24833cf173681d109710f98cb
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
BUG: 1729915
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/178961
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
geo-replication/syncdaemon/subcmds.py | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/geo-replication/syncdaemon/subcmds.py b/geo-replication/syncdaemon/subcmds.py
|
||||
index 4ece7e0..8de7db2 100644
|
||||
--- a/geo-replication/syncdaemon/subcmds.py
|
||||
+++ b/geo-replication/syncdaemon/subcmds.py
|
||||
@@ -73,7 +73,8 @@ def subcmd_worker(args):
|
||||
Popen.init_errhandler()
|
||||
fcntl.fcntl(args.feedback_fd, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
|
||||
local = GLUSTER("localhost", args.master)
|
||||
- slavehost, slavevol = args.slave.split("::")
|
||||
+ slavevol = args.slave.split("::")[-1]
|
||||
+ slavehost = args.resource_remote
|
||||
remote = SSH(slavehost, slavevol)
|
||||
remote.connect_remote()
|
||||
local.connect()
|
||||
--
|
||||
1.8.3.1
|
||||
|
253
0279-posix-In-brick_mux-brick-is-crashed-while-start-stop.patch
Normal file
253
0279-posix-In-brick_mux-brick-is-crashed-while-start-stop.patch
Normal file
@ -0,0 +1,253 @@
|
||||
From bf24623765817ede84ea47f3265f5e6c2ae17ee7 Mon Sep 17 00:00:00 2001
|
||||
From: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Date: Tue, 16 Jul 2019 20:36:57 +0530
|
||||
Subject: [PATCH 279/284] posix: In brick_mux brick is crashed while start/stop
|
||||
volume in loop
|
||||
|
||||
Problem: In brick_mux environment sometime brick is crashed while
|
||||
volume stop/start in a loop.Brick is crashed in janitor task
|
||||
at the time of accessing priv.If posix priv is cleaned up before
|
||||
call janitor task then janitor task is crashed.
|
||||
|
||||
Solution: To avoid the crash in brick_mux environment introduce a new
|
||||
flag janitor_task_stop in posix_private and before send CHILD_DOWN event
|
||||
wait for update the flag by janitor_task_done
|
||||
|
||||
> Change-Id: Id9fa5d183a463b2b682774ab5cb9868357d139a4
|
||||
> fixes: bz#1730409
|
||||
> Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
|
||||
> (Cherry picked from commit f138d3fa2237e7fa940ecf17153fd700350c4138)
|
||||
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/23060/)
|
||||
|
||||
Change-Id: Id9fa5d183a463b2b682774ab5cb9868357d139a4
|
||||
fixex: bz#1729971
|
||||
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/178934
|
||||
Tested-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
libglusterfs/src/glusterfs/xlator.h | 3 +++
|
||||
xlators/mgmt/glusterd/src/glusterd-utils.c | 5 ++--
|
||||
xlators/protocol/server/src/server.c | 6 ++++-
|
||||
xlators/storage/posix/src/posix-common.c | 40 +++++++++++++++++++++++++++++-
|
||||
xlators/storage/posix/src/posix-helpers.c | 16 ++++++++++++
|
||||
xlators/storage/posix/src/posix.h | 3 +++
|
||||
6 files changed, 69 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libglusterfs/src/glusterfs/xlator.h b/libglusterfs/src/glusterfs/xlator.h
|
||||
index b78daad..da551e9 100644
|
||||
--- a/libglusterfs/src/glusterfs/xlator.h
|
||||
+++ b/libglusterfs/src/glusterfs/xlator.h
|
||||
@@ -861,6 +861,9 @@ struct _xlator {
|
||||
|
||||
/* Flag to notify got CHILD_DOWN event for detach brick */
|
||||
uint32_t notify_down;
|
||||
+
|
||||
+ /* Flag to avoid throw duplicate PARENT_DOWN event */
|
||||
+ uint32_t parent_down;
|
||||
};
|
||||
|
||||
/* This would be the only structure which needs to be exported by
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
index 2aa975b..812c698 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
@@ -4082,8 +4082,9 @@ out:
|
||||
if (msg[0]) {
|
||||
gf_msg("glusterd", GF_LOG_ERROR, 0, GD_MSG_BRICK_IMPORT_FAIL, "%s",
|
||||
msg);
|
||||
- gf_event(EVENT_IMPORT_BRICK_FAILED, "peer=%s;brick=%s",
|
||||
- new_brickinfo->hostname, new_brickinfo->path);
|
||||
+ if (new_brickinfo)
|
||||
+ gf_event(EVENT_IMPORT_BRICK_FAILED, "peer=%s;brick=%s",
|
||||
+ new_brickinfo->hostname, new_brickinfo->path);
|
||||
}
|
||||
gf_msg_debug("glusterd", 0, "Returning with %d", ret);
|
||||
return ret;
|
||||
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
|
||||
index 6ae63ba..a5f09fe 100644
|
||||
--- a/xlators/protocol/server/src/server.c
|
||||
+++ b/xlators/protocol/server/src/server.c
|
||||
@@ -580,6 +580,7 @@ server_graph_janitor_threads(void *data)
|
||||
gf_boolean_t victim_found = _gf_false;
|
||||
xlator_list_t **trav_p = NULL;
|
||||
xlator_t *top = NULL;
|
||||
+ uint32_t parent_down = 0;
|
||||
|
||||
GF_ASSERT(data);
|
||||
|
||||
@@ -598,7 +599,10 @@ server_graph_janitor_threads(void *data)
|
||||
victim = (*trav_p)->xlator;
|
||||
if (victim->cleanup_starting &&
|
||||
strcmp(victim->name, victim_name) == 0) {
|
||||
- victim_found = _gf_true;
|
||||
+ parent_down = victim->parent_down;
|
||||
+ victim->parent_down = 1;
|
||||
+ if (!parent_down)
|
||||
+ victim_found = _gf_true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
diff --git a/xlators/storage/posix/src/posix-common.c b/xlators/storage/posix/src/posix-common.c
|
||||
index d738692..69857d9 100644
|
||||
--- a/xlators/storage/posix/src/posix-common.c
|
||||
+++ b/xlators/storage/posix/src/posix-common.c
|
||||
@@ -146,10 +146,15 @@ int32_t
|
||||
posix_notify(xlator_t *this, int32_t event, void *data, ...)
|
||||
{
|
||||
xlator_t *victim = data;
|
||||
+ struct posix_private *priv = this->private;
|
||||
+ int ret = 0;
|
||||
+ struct timespec sleep_till = {
|
||||
+ 0,
|
||||
+ };
|
||||
|
||||
switch (event) {
|
||||
case GF_EVENT_PARENT_UP: {
|
||||
- /* Tell the parent that posix xlator is up */
|
||||
+ /* the parent that posix xlator is up */
|
||||
default_notify(this, GF_EVENT_CHILD_UP, data);
|
||||
} break;
|
||||
|
||||
@@ -158,6 +163,31 @@ posix_notify(xlator_t *this, int32_t event, void *data, ...)
|
||||
break;
|
||||
gf_log(this->name, GF_LOG_INFO, "Sending CHILD_DOWN for brick %s",
|
||||
victim->name);
|
||||
+
|
||||
+ if (priv->janitor) {
|
||||
+ pthread_mutex_lock(&priv->janitor_mutex);
|
||||
+ {
|
||||
+ priv->janitor_task_stop = _gf_true;
|
||||
+ ret = gf_tw_del_timer(this->ctx->tw->timer_wheel,
|
||||
+ priv->janitor);
|
||||
+ if (!ret) {
|
||||
+ clock_gettime(CLOCK_REALTIME, &sleep_till);
|
||||
+ sleep_till.tv_sec += 1;
|
||||
+ /* Wait to set janitor_task flag to _gf_false by
|
||||
+ * janitor_task_done */
|
||||
+ while (priv->janitor_task_stop) {
|
||||
+ (void)pthread_cond_timedwait(&priv->janitor_cond,
|
||||
+ &priv->janitor_mutex,
|
||||
+ &sleep_till);
|
||||
+ clock_gettime(CLOCK_REALTIME, &sleep_till);
|
||||
+ sleep_till.tv_sec += 1;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ pthread_mutex_unlock(&priv->janitor_mutex);
|
||||
+ GF_FREE(priv->janitor);
|
||||
+ }
|
||||
+ priv->janitor = NULL;
|
||||
default_notify(this->parents->xlator, GF_EVENT_CHILD_DOWN, data);
|
||||
} break;
|
||||
default:
|
||||
@@ -1008,6 +1038,8 @@ posix_init(xlator_t *this)
|
||||
|
||||
pthread_mutex_init(&_private->fsync_mutex, NULL);
|
||||
pthread_cond_init(&_private->fsync_cond, NULL);
|
||||
+ pthread_mutex_init(&_private->janitor_mutex, NULL);
|
||||
+ pthread_cond_init(&_private->janitor_cond, NULL);
|
||||
INIT_LIST_HEAD(&_private->fsyncs);
|
||||
ret = posix_spawn_ctx_janitor_thread(this);
|
||||
if (ret)
|
||||
@@ -1128,6 +1160,7 @@ posix_fini(xlator_t *this)
|
||||
(void)gf_thread_cleanup_xint(priv->disk_space_check);
|
||||
priv->disk_space_check = 0;
|
||||
}
|
||||
+
|
||||
if (priv->janitor) {
|
||||
/*TODO: Make sure the synctask is also complete */
|
||||
ret = gf_tw_del_timer(this->ctx->tw->timer_wheel, priv->janitor);
|
||||
@@ -1135,8 +1168,10 @@ posix_fini(xlator_t *this)
|
||||
gf_msg(this->name, GF_LOG_ERROR, errno, P_MSG_TIMER_DELETE_FAILED,
|
||||
"Failed to delete janitor timer");
|
||||
}
|
||||
+ GF_FREE(priv->janitor);
|
||||
priv->janitor = NULL;
|
||||
}
|
||||
+
|
||||
if (priv->fsyncer) {
|
||||
(void)gf_thread_cleanup_xint(priv->fsyncer);
|
||||
priv->fsyncer = 0;
|
||||
@@ -1148,6 +1183,9 @@ posix_fini(xlator_t *this)
|
||||
GF_FREE(priv->base_path);
|
||||
LOCK_DESTROY(&priv->lock);
|
||||
pthread_mutex_destroy(&priv->fsync_mutex);
|
||||
+ pthread_cond_destroy(&priv->fsync_cond);
|
||||
+ pthread_mutex_destroy(&priv->janitor_mutex);
|
||||
+ pthread_cond_destroy(&priv->janitor_cond);
|
||||
GF_FREE(priv->hostname);
|
||||
GF_FREE(priv->trash_path);
|
||||
GF_FREE(priv);
|
||||
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
||||
index 07169b5..ef5bfd5 100644
|
||||
--- a/xlators/storage/posix/src/posix-helpers.c
|
||||
+++ b/xlators/storage/posix/src/posix-helpers.c
|
||||
@@ -1432,12 +1432,24 @@ posix_janitor_task_done(int ret, call_frame_t *frame, void *data)
|
||||
this = data;
|
||||
priv = this->private;
|
||||
|
||||
+ pthread_mutex_lock(&priv->janitor_mutex);
|
||||
+ {
|
||||
+ if (priv->janitor_task_stop) {
|
||||
+ priv->janitor_task_stop = _gf_false;
|
||||
+ pthread_cond_signal(&priv->janitor_cond);
|
||||
+ pthread_mutex_unlock(&priv->janitor_mutex);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ pthread_mutex_unlock(&priv->janitor_mutex);
|
||||
+
|
||||
LOCK(&priv->lock);
|
||||
{
|
||||
__posix_janitor_timer_start(this);
|
||||
}
|
||||
UNLOCK(&priv->lock);
|
||||
|
||||
+out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1456,6 +1468,9 @@ posix_janitor_task(void *data)
|
||||
old_this = THIS;
|
||||
THIS = this;
|
||||
|
||||
+ if (!priv)
|
||||
+ goto out;
|
||||
+
|
||||
time(&now);
|
||||
if ((now - priv->last_landfill_check) > priv->janitor_sleep_duration) {
|
||||
if (priv->disable_landfill_purge) {
|
||||
@@ -1475,6 +1490,7 @@ posix_janitor_task(void *data)
|
||||
|
||||
THIS = old_this;
|
||||
|
||||
+out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
|
||||
index b0935a7..64288a7 100644
|
||||
--- a/xlators/storage/posix/src/posix.h
|
||||
+++ b/xlators/storage/posix/src/posix.h
|
||||
@@ -203,6 +203,8 @@ struct posix_private {
|
||||
struct list_head fsyncs;
|
||||
pthread_mutex_t fsync_mutex;
|
||||
pthread_cond_t fsync_cond;
|
||||
+ pthread_mutex_t janitor_mutex;
|
||||
+ pthread_cond_t janitor_cond;
|
||||
int fsync_queue_count;
|
||||
|
||||
enum {
|
||||
@@ -257,6 +259,7 @@ struct posix_private {
|
||||
|
||||
gf_boolean_t fips_mode_rchecksum;
|
||||
gf_boolean_t ctime;
|
||||
+ gf_boolean_t janitor_task_stop;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
--
|
||||
1.8.3.1
|
||||
|
153
0280-performance-md-cache-Do-not-skip-caching-of-null-cha.patch
Normal file
153
0280-performance-md-cache-Do-not-skip-caching-of-null-cha.patch
Normal file
@ -0,0 +1,153 @@
|
||||
From 2d7d9165c6a8619eef553859b4b7136b8e9ccb55 Mon Sep 17 00:00:00 2001
|
||||
From: Anoop C S <anoopcs@redhat.com>
|
||||
Date: Sat, 10 Aug 2019 10:30:26 +0530
|
||||
Subject: [PATCH 280/284] performance/md-cache: Do not skip caching of null
|
||||
character xattr values
|
||||
|
||||
Null character string is a valid xattr value in file system. But for
|
||||
those xattrs processed by md-cache, it does not update its entries if
|
||||
value is null('\0'). This results in ENODATA when those xattrs are
|
||||
queried afterwards via getxattr() causing failures in basic operations
|
||||
like create, copy etc in a specially configured Samba setup for Mac OS
|
||||
clients.
|
||||
|
||||
On the other side snapview-server is internally setting empty string("")
|
||||
as value for xattrs received as part of listxattr() and are not intended
|
||||
to be cached. Therefore we try to maintain that behaviour using an
|
||||
additional dictionary key to prevent updation of entries in getxattr()
|
||||
and fgetxattr() callbacks in md-cache.
|
||||
|
||||
Credits: Poornima G <pgurusid@redhat.com>
|
||||
|
||||
Backport of https://review.gluster.org/c/glusterfs/+/23206
|
||||
|
||||
Change-Id: I7859cbad0a06ca6d788420c2a495e658699c6ff7
|
||||
Fixes: bz#1732376
|
||||
Signed-off-by: Anoop C S <anoopcs@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/179048
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
tests/bugs/md-cache/bug-1726205.t | 22 +++++++++++++++
|
||||
.../features/snapview-server/src/snapview-server.c | 12 ++++++++-
|
||||
xlators/performance/md-cache/src/md-cache.c | 31 +++++++++-------------
|
||||
3 files changed, 45 insertions(+), 20 deletions(-)
|
||||
create mode 100644 tests/bugs/md-cache/bug-1726205.t
|
||||
|
||||
diff --git a/tests/bugs/md-cache/bug-1726205.t b/tests/bugs/md-cache/bug-1726205.t
|
||||
new file mode 100644
|
||||
index 0000000..795130e
|
||||
--- /dev/null
|
||||
+++ b/tests/bugs/md-cache/bug-1726205.t
|
||||
@@ -0,0 +1,22 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../../include.rc
|
||||
+. $(dirname $0)/../../volume.rc
|
||||
+
|
||||
+cleanup;
|
||||
+
|
||||
+TEST glusterd;
|
||||
+
|
||||
+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};
|
||||
+
|
||||
+TEST $CLI volume start $V0
|
||||
+
|
||||
+TEST $CLI volume set $V0 group samba
|
||||
+
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
+
|
||||
+TEST touch $M0/file
|
||||
+TEST "setfattr -n "user.DosStream.Zone.Identifier:\$DATA" -v '\0' $M0/file"
|
||||
+TEST "getfattr -n "user.DosStream.Zone.Identifier:\$DATA" -e hex $M0/file | grep -q 0x00"
|
||||
+
|
||||
+cleanup;
|
||||
diff --git a/xlators/features/snapview-server/src/snapview-server.c b/xlators/features/snapview-server/src/snapview-server.c
|
||||
index b4998b8..1d6a5e5 100644
|
||||
--- a/xlators/features/snapview-server/src/snapview-server.c
|
||||
+++ b/xlators/features/snapview-server/src/snapview-server.c
|
||||
@@ -828,7 +828,8 @@ out:
|
||||
* back into the dict. But to get the values for those xattrs it has to do the
|
||||
* getxattr operation on each xattr which might turn out to be a costly
|
||||
* operation. So for each of the xattrs present in the list, a 0 byte value
|
||||
- * ("") is set into the dict before unwinding. This can be treated as an
|
||||
+ * ("") is set into the dict before unwinding. Since ("") is also a valid xattr
|
||||
+ * value(in a file system) we use an extra key in the same dictionary as an
|
||||
* indicator to other xlators which want to cache the xattrs (as of now,
|
||||
* md-cache which caches acl and selinux related xattrs) to not to cache the
|
||||
* values of the xattrs present in the dict.
|
||||
@@ -871,6 +872,15 @@ svs_add_xattrs_to_dict(xlator_t *this, dict_t *dict, char *list, ssize_t size)
|
||||
list_offset += strlen(keybuffer) + 1;
|
||||
} /* while (remaining_size > 0) */
|
||||
|
||||
+ /* Add an additional key to indicate that we don't need to cache these
|
||||
+ * xattrs(with value "") */
|
||||
+ ret = dict_set_str(dict, "glusterfs.skip-cache", "");
|
||||
+ if (ret < 0) {
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, SVS_MSG_DICT_SET_FAILED,
|
||||
+ "dict set operation for the key glusterfs.skip-cache failed.");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c
|
||||
index 6e0468f..a6b363f 100644
|
||||
--- a/xlators/performance/md-cache/src/md-cache.c
|
||||
+++ b/xlators/performance/md-cache/src/md-cache.c
|
||||
@@ -698,25 +698,6 @@ updatefn(dict_t *dict, char *key, data_t *value, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
- /* posix xlator as part of listxattr will send both names
|
||||
- * and values of the xattrs in the dict. But as per man page
|
||||
- * listxattr is mainly supposed to send names of the all the
|
||||
- * xattrs. gfapi, as of now will put all the keys it obtained
|
||||
- * in the dict (sent by posix) into a buffer provided by the
|
||||
- * caller (thus the values of those xattrs are lost). If some
|
||||
- * xlator makes gfapi based calls (ex: snapview-server), then
|
||||
- * it has to unwind the calls by putting those names it got
|
||||
- * in the buffer again into the dict. But now it would not be
|
||||
- * having the values for those xattrs. So it might just put
|
||||
- * a 0 byte value ("") into the dict for each xattr and unwind
|
||||
- * the call. So the xlators which cache the xattrs (as of now
|
||||
- * md-cache caches the acl and selinux related xattrs), should
|
||||
- * not update their cache if the value of a xattr is a 0 byte
|
||||
- * data (i.e. "").
|
||||
- */
|
||||
- if (value->len == 1 && value->data[0] == '\0')
|
||||
- return 0;
|
||||
-
|
||||
if (dict_set(u->dict, key, value) < 0) {
|
||||
u->ret = -1;
|
||||
return -1;
|
||||
@@ -2406,6 +2387,12 @@ mdc_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ if (dict_get(xattr, "glusterfs.skip-cache")) {
|
||||
+ gf_msg(this->name, GF_LOG_DEBUG, 0, 0,
|
||||
+ "Skipping xattr update due to empty value");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
mdc_inode_xatt_set(this, local->loc.inode, xdata);
|
||||
|
||||
out:
|
||||
@@ -2488,6 +2475,12 @@ mdc_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ if (dict_get(xattr, "glusterfs.skip-cache")) {
|
||||
+ gf_msg(this->name, GF_LOG_DEBUG, 0, 0,
|
||||
+ "Skipping xattr update due to empty value");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
mdc_inode_xatt_set(this, local->fd->inode, xdata);
|
||||
|
||||
out:
|
||||
--
|
||||
1.8.3.1
|
||||
|
105
0281-ctime-Fix-incorrect-realtime-passed-to-frame-root-ct.patch
Normal file
105
0281-ctime-Fix-incorrect-realtime-passed-to-frame-root-ct.patch
Normal file
@ -0,0 +1,105 @@
|
||||
From fa3cc9971bf1bf4ea52edfedc0cea67a0d6990d1 Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Tue, 20 Aug 2019 15:49:40 +0530
|
||||
Subject: [PATCH 281/284] ctime: Fix incorrect realtime passed to
|
||||
frame->root->ctime
|
||||
|
||||
On systems that don't support "timespec_get"(e.g., centos6), it
|
||||
was using "clock_gettime" with "CLOCK_MONOTONIC" to get unix epoch
|
||||
time which is incorrect. This patch introduces "timespec_now_realtime"
|
||||
which uses "clock_gettime" with "CLOCK_REALTIME" which fixes
|
||||
the issue.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23274/
|
||||
> Change-Id: I57be35ce442d7e05319e82112b687eb4f28d7612
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
> fixes: bz#1743652
|
||||
|
||||
Change-Id: I57be35ce442d7e05319e82112b687eb4f28d7612
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
BUG: 1743611
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/179185
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
libglusterfs/src/glusterfs/timespec.h | 2 ++
|
||||
libglusterfs/src/libglusterfs.sym | 1 +
|
||||
libglusterfs/src/timespec.c | 22 ++++++++++++++++++++++
|
||||
xlators/features/utime/src/utime-helpers.c | 2 +-
|
||||
4 files changed, 26 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libglusterfs/src/glusterfs/timespec.h b/libglusterfs/src/glusterfs/timespec.h
|
||||
index 871871d..bb9ab44 100644
|
||||
--- a/libglusterfs/src/glusterfs/timespec.h
|
||||
+++ b/libglusterfs/src/glusterfs/timespec.h
|
||||
@@ -21,6 +21,8 @@
|
||||
void
|
||||
timespec_now(struct timespec *ts);
|
||||
void
|
||||
+timespec_now_realtime(struct timespec *ts);
|
||||
+void
|
||||
timespec_adjust_delta(struct timespec *ts, struct timespec delta);
|
||||
void
|
||||
timespec_sub(const struct timespec *begin, const struct timespec *end,
|
||||
diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym
|
||||
index b161380..467a1b7 100644
|
||||
--- a/libglusterfs/src/libglusterfs.sym
|
||||
+++ b/libglusterfs/src/libglusterfs.sym
|
||||
@@ -1073,6 +1073,7 @@ sys_accept
|
||||
tbf_init
|
||||
tbf_throttle
|
||||
timespec_now
|
||||
+timespec_now_realtime
|
||||
timespec_sub
|
||||
timespec_adjust_delta
|
||||
timespec_cmp
|
||||
diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c
|
||||
index c01527f..d0d5005 100644
|
||||
--- a/libglusterfs/src/timespec.c
|
||||
+++ b/libglusterfs/src/timespec.c
|
||||
@@ -71,6 +71,28 @@ timespec_now(struct timespec *ts)
|
||||
}
|
||||
|
||||
void
|
||||
+timespec_now_realtime(struct timespec *ts)
|
||||
+{
|
||||
+#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || \
|
||||
+ defined GF_BSD_HOST_OS
|
||||
+ if (0 == clock_gettime(CLOCK_REALTIME, ts)) {
|
||||
+ return;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ /* Fall back to gettimeofday()*/
|
||||
+ struct timeval tv = {
|
||||
+ 0,
|
||||
+ };
|
||||
+ if (0 == gettimeofday(&tv, NULL)) {
|
||||
+ TIMEVAL_TO_TIMESPEC(&tv, ts);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
timespec_adjust_delta(struct timespec *ts, struct timespec delta)
|
||||
{
|
||||
ts->tv_nsec = ((ts->tv_nsec + delta.tv_nsec) % 1000000000);
|
||||
diff --git a/xlators/features/utime/src/utime-helpers.c b/xlators/features/utime/src/utime-helpers.c
|
||||
index 79cc014..29d9ad9 100644
|
||||
--- a/xlators/features/utime/src/utime-helpers.c
|
||||
+++ b/xlators/features/utime/src/utime-helpers.c
|
||||
@@ -17,7 +17,7 @@ gl_timespec_get(struct timespec *ts)
|
||||
#ifdef TIME_UTC
|
||||
timespec_get(ts, TIME_UTC);
|
||||
#else
|
||||
- timespec_now(ts);
|
||||
+ timespec_now_realtime(ts);
|
||||
#endif
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
116
0282-geo-rep-Fix-the-name-of-changelog-archive-file.patch
Normal file
116
0282-geo-rep-Fix-the-name-of-changelog-archive-file.patch
Normal file
@ -0,0 +1,116 @@
|
||||
From 98c9fc8d774ae153ca6b44d3337cf5d9f7a030e2 Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Fri, 16 Aug 2019 16:07:03 +0530
|
||||
Subject: [PATCH 282/284] geo-rep: Fix the name of changelog archive file
|
||||
|
||||
Background:
|
||||
The processed changelogs are archived each month in a single tar file.
|
||||
The default format is "archive_YYYYMM.tar" which is specified as "%%Y%%m"
|
||||
in configuration file.
|
||||
|
||||
Problem:
|
||||
The created changelog archive file didn't have corresponding year
|
||||
and month. It created as "archive_%Y%m.tar" on python2 only systems.
|
||||
|
||||
Cause and Fix:
|
||||
Geo-rep expects "%Y%m" after the ConfigParser reads it from config file.
|
||||
Since it was "%%Y%%m" in config file, geo-rep used to get correct value
|
||||
"%Y%m" in python3 and "%%Y%%m" in python2 which is incorrect.
|
||||
The fix can be to use "%Y%m" in config file but that fails in python3.
|
||||
So the fix is to use "RawConfigParser" in geo-rep and use "%Y%m". This
|
||||
works both in python2 and python3.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23248
|
||||
> Change-Id: Ie5b7d2bc04d0d53cd1769e064c2d67aaf95d557c
|
||||
> fixes: bz#1741890
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
|
||||
Change-Id: Ie5b7d2bc04d0d53cd1769e064c2d67aaf95d557c
|
||||
BUG: 1743634
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/179188
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
geo-replication/gsyncd.conf.in | 2 +-
|
||||
geo-replication/syncdaemon/gsyncdconfig.py | 14 +++++++-------
|
||||
2 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/geo-replication/gsyncd.conf.in b/geo-replication/gsyncd.conf.in
|
||||
index c2e4f0d..5ebd57a 100644
|
||||
--- a/geo-replication/gsyncd.conf.in
|
||||
+++ b/geo-replication/gsyncd.conf.in
|
||||
@@ -109,7 +109,7 @@ type=int
|
||||
help=Minimum time interval in seconds for passive worker to become Active
|
||||
|
||||
[changelog-archive-format]
|
||||
-value=%%Y%%m
|
||||
+value=%Y%m
|
||||
help=Processed changelogs will be archived in working directory. Pattern for archive file
|
||||
|
||||
[use-meta-volume]
|
||||
diff --git a/geo-replication/syncdaemon/gsyncdconfig.py b/geo-replication/syncdaemon/gsyncdconfig.py
|
||||
index 38f3594..f823311 100644
|
||||
--- a/geo-replication/syncdaemon/gsyncdconfig.py
|
||||
+++ b/geo-replication/syncdaemon/gsyncdconfig.py
|
||||
@@ -10,9 +10,9 @@
|
||||
#
|
||||
|
||||
try:
|
||||
- from ConfigParser import ConfigParser, NoSectionError
|
||||
+ from ConfigParser import RawConfigParser, NoSectionError
|
||||
except ImportError:
|
||||
- from configparser import ConfigParser, NoSectionError
|
||||
+ from configparser import RawConfigParser, NoSectionError
|
||||
import os
|
||||
import shutil
|
||||
from string import Template
|
||||
@@ -94,7 +94,7 @@ class Gconf(object):
|
||||
if name != "all" and not self._is_configurable(name):
|
||||
raise GconfNotConfigurable()
|
||||
|
||||
- cnf = ConfigParser()
|
||||
+ cnf = RawConfigParser()
|
||||
with open(self.custom_conf_file) as f:
|
||||
cnf.readfp(f)
|
||||
|
||||
@@ -138,7 +138,7 @@ class Gconf(object):
|
||||
if curr_val == value:
|
||||
return True
|
||||
|
||||
- cnf = ConfigParser()
|
||||
+ cnf = RawConfigParser()
|
||||
with open(self.custom_conf_file) as f:
|
||||
cnf.readfp(f)
|
||||
|
||||
@@ -178,7 +178,7 @@ class Gconf(object):
|
||||
self.session_conf_items = []
|
||||
self.default_values = {}
|
||||
|
||||
- conf = ConfigParser()
|
||||
+ conf = RawConfigParser()
|
||||
# Default Template config file
|
||||
with open(self.default_conf_file) as f:
|
||||
conf.readfp(f)
|
||||
@@ -342,7 +342,7 @@ class Gconf(object):
|
||||
return False
|
||||
|
||||
def is_config_file_old(config_file, mastervol, slavevol):
|
||||
- cnf = ConfigParser()
|
||||
+ cnf = RawConfigParser()
|
||||
cnf.read(config_file)
|
||||
session_section = "peers %s %s" % (mastervol, slavevol)
|
||||
try:
|
||||
@@ -357,7 +357,7 @@ def config_upgrade(config_file, ret):
|
||||
shutil.copyfile(config_file, config_file_backup)
|
||||
|
||||
#write a new config file
|
||||
- config = ConfigParser()
|
||||
+ config = RawConfigParser()
|
||||
config.add_section('vars')
|
||||
|
||||
for key, value in ret.items():
|
||||
--
|
||||
1.8.3.1
|
||||
|
285
0283-ctime-Fix-ctime-issue-with-utime-family-of-syscalls.patch
Normal file
285
0283-ctime-Fix-ctime-issue-with-utime-family-of-syscalls.patch
Normal file
@ -0,0 +1,285 @@
|
||||
From 55eb2e7642e3428eaa1b2d833c0daa1d34b98324 Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Thu, 8 Aug 2019 10:05:12 +0530
|
||||
Subject: [PATCH 283/284] ctime: Fix ctime issue with utime family of syscalls
|
||||
|
||||
When atime|mtime is updated via utime family of syscalls,
|
||||
ctime is not updated. This patch fixes the same.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23177
|
||||
> Change-Id: I7f86d8f8a1e06a332c3449b5bbdbf128c9690f25
|
||||
> fixes: bz#1738786
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
|
||||
Change-Id: I7f86d8f8a1e06a332c3449b5bbdbf128c9690f25
|
||||
BUG: 1743627
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/179184
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
xlators/features/utime/src/utime-gen-fops-c.py | 13 +++-
|
||||
xlators/storage/posix/src/posix-inode-fd-ops.c | 8 +--
|
||||
xlators/storage/posix/src/posix-metadata.c | 96 ++++++++++++++------------
|
||||
xlators/storage/posix/src/posix-metadata.h | 3 +-
|
||||
4 files changed, 68 insertions(+), 52 deletions(-)
|
||||
|
||||
diff --git a/xlators/features/utime/src/utime-gen-fops-c.py b/xlators/features/utime/src/utime-gen-fops-c.py
|
||||
index a8637ff..8730a51 100755
|
||||
--- a/xlators/features/utime/src/utime-gen-fops-c.py
|
||||
+++ b/xlators/features/utime/src/utime-gen-fops-c.py
|
||||
@@ -82,7 +82,18 @@ gf_utime_@NAME@ (call_frame_t *frame, xlator_t *this,
|
||||
@LONG_ARGS@)
|
||||
{
|
||||
gl_timespec_get(&frame->root->ctime);
|
||||
- frame->root->flags |= MDATA_CTIME;
|
||||
+
|
||||
+ if (!valid) {
|
||||
+ frame->root->flags |= MDATA_CTIME;
|
||||
+ }
|
||||
+
|
||||
+ if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {
|
||||
+ frame->root->flags |= MDATA_CTIME;
|
||||
+ }
|
||||
+
|
||||
+ if (valid & GF_SET_ATTR_MODE) {
|
||||
+ frame->root->flags |= MDATA_CTIME;
|
||||
+ }
|
||||
|
||||
STACK_WIND (frame, gf_utime_@NAME@_cbk, FIRST_CHILD(this),
|
||||
FIRST_CHILD(this)->fops->@NAME@, @SHORT_ARGS@);
|
||||
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
index d22bbc2..e0ea85b 100644
|
||||
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
@@ -425,8 +425,8 @@ posix_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,
|
||||
real_path);
|
||||
goto out;
|
||||
}
|
||||
- posix_update_utime_in_mdata(this, real_path, -1, loc->inode, stbuf,
|
||||
- valid);
|
||||
+ posix_update_utime_in_mdata(this, real_path, -1, loc->inode,
|
||||
+ &frame->root->ctime, stbuf, valid);
|
||||
}
|
||||
|
||||
if (valid & GF_SET_ATTR_CTIME && !priv->ctime) {
|
||||
@@ -652,8 +652,8 @@ posix_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,
|
||||
fd);
|
||||
goto out;
|
||||
}
|
||||
- posix_update_utime_in_mdata(this, NULL, pfd->fd, fd->inode, stbuf,
|
||||
- valid);
|
||||
+ posix_update_utime_in_mdata(this, NULL, pfd->fd, fd->inode,
|
||||
+ &frame->root->ctime, stbuf, valid);
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
diff --git a/xlators/storage/posix/src/posix-metadata.c b/xlators/storage/posix/src/posix-metadata.c
|
||||
index 5cbdc98..532daa2 100644
|
||||
--- a/xlators/storage/posix/src/posix-metadata.c
|
||||
+++ b/xlators/storage/posix/src/posix-metadata.c
|
||||
@@ -432,8 +432,10 @@ out:
|
||||
*/
|
||||
static int
|
||||
posix_set_mdata_xattr(xlator_t *this, const char *real_path, int fd,
|
||||
- inode_t *inode, struct timespec *time, struct iatt *stbuf,
|
||||
- posix_mdata_flag_t *flag, gf_boolean_t update_utime)
|
||||
+ inode_t *inode, struct timespec *time,
|
||||
+ struct timespec *u_atime, struct timespec *u_mtime,
|
||||
+ struct iatt *stbuf, posix_mdata_flag_t *flag,
|
||||
+ gf_boolean_t update_utime)
|
||||
{
|
||||
posix_mdata_t *mdata = NULL;
|
||||
int ret = -1;
|
||||
@@ -443,6 +445,10 @@ posix_set_mdata_xattr(xlator_t *this, const char *real_path, int fd,
|
||||
GF_VALIDATE_OR_GOTO(this->name, inode, out);
|
||||
GF_VALIDATE_OR_GOTO(this->name, time, out);
|
||||
|
||||
+ if (update_utime && (!u_atime || !u_mtime)) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
LOCK(&inode->lock);
|
||||
{
|
||||
ret = __inode_ctx_get1(inode, this, (uint64_t *)&mdata);
|
||||
@@ -506,32 +512,30 @@ posix_set_mdata_xattr(xlator_t *this, const char *real_path, int fd,
|
||||
}
|
||||
}
|
||||
|
||||
- /* Earlier, mdata was updated only if the existing time is less
|
||||
- * than the time to be updated. This would fail the scenarios
|
||||
- * where mtime can be set to any time using the syscall. Hence
|
||||
- * just updating without comparison. But the ctime is not
|
||||
- * allowed to changed to older date.
|
||||
- */
|
||||
-
|
||||
- if (flag->ctime && posix_compare_timespec(time, &mdata->ctime) > 0) {
|
||||
- mdata->ctime = *time;
|
||||
- }
|
||||
-
|
||||
/* In distributed systems, there could be races with fops
|
||||
* updating mtime/atime which could result in different
|
||||
* mtime/atime for same file. So this makes sure, only the
|
||||
* highest time is retained. If the mtime/atime update comes
|
||||
* from the explicit utime syscall, it is allowed to set to
|
||||
- * previous time
|
||||
+ * previous or future time but the ctime is always set to
|
||||
+ * current time.
|
||||
*/
|
||||
if (update_utime) {
|
||||
+ if (flag->ctime &&
|
||||
+ posix_compare_timespec(time, &mdata->ctime) > 0) {
|
||||
+ mdata->ctime = *time;
|
||||
+ }
|
||||
if (flag->mtime) {
|
||||
- mdata->mtime = *time;
|
||||
+ mdata->mtime = *u_mtime;
|
||||
}
|
||||
if (flag->atime) {
|
||||
- mdata->atime = *time;
|
||||
+ mdata->atime = *u_atime;
|
||||
}
|
||||
} else {
|
||||
+ if (flag->ctime &&
|
||||
+ posix_compare_timespec(time, &mdata->ctime) > 0) {
|
||||
+ mdata->ctime = *time;
|
||||
+ }
|
||||
if (flag->mtime &&
|
||||
posix_compare_timespec(time, &mdata->mtime) > 0) {
|
||||
mdata->mtime = *time;
|
||||
@@ -584,15 +588,22 @@ out:
|
||||
*/
|
||||
void
|
||||
posix_update_utime_in_mdata(xlator_t *this, const char *real_path, int fd,
|
||||
- inode_t *inode, struct iatt *stbuf, int valid)
|
||||
+ inode_t *inode, struct timespec *ctime,
|
||||
+ struct iatt *stbuf, int valid)
|
||||
{
|
||||
int32_t ret = 0;
|
||||
#if defined(HAVE_UTIMENSAT)
|
||||
- struct timespec tv = {
|
||||
+ struct timespec tv_atime = {
|
||||
+ 0,
|
||||
+ };
|
||||
+ struct timespec tv_mtime = {
|
||||
0,
|
||||
};
|
||||
#else
|
||||
- struct timeval tv = {
|
||||
+ struct timeval tv_atime = {
|
||||
+ 0,
|
||||
+ };
|
||||
+ struct timeval tv_mtime = {
|
||||
0,
|
||||
};
|
||||
#endif
|
||||
@@ -611,35 +622,28 @@ posix_update_utime_in_mdata(xlator_t *this, const char *real_path, int fd,
|
||||
*/
|
||||
if (inode && priv->ctime) {
|
||||
if ((valid & GF_SET_ATTR_ATIME) == GF_SET_ATTR_ATIME) {
|
||||
- tv.tv_sec = stbuf->ia_atime;
|
||||
- SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_atime_nsec);
|
||||
+ tv_atime.tv_sec = stbuf->ia_atime;
|
||||
+ SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv_atime, stbuf->ia_atime_nsec);
|
||||
|
||||
- flag.ctime = 0;
|
||||
- flag.mtime = 0;
|
||||
+ flag.ctime = 1;
|
||||
flag.atime = 1;
|
||||
- ret = posix_set_mdata_xattr(this, real_path, -1, inode, &tv, NULL,
|
||||
- &flag, _gf_true);
|
||||
- if (ret) {
|
||||
- gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
- "posix set mdata atime failed on file:"
|
||||
- " %s gfid:%s",
|
||||
- real_path, uuid_utoa(inode->gfid));
|
||||
- }
|
||||
}
|
||||
|
||||
if ((valid & GF_SET_ATTR_MTIME) == GF_SET_ATTR_MTIME) {
|
||||
- tv.tv_sec = stbuf->ia_mtime;
|
||||
- SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_mtime_nsec);
|
||||
+ tv_mtime.tv_sec = stbuf->ia_mtime;
|
||||
+ SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv_mtime, stbuf->ia_mtime_nsec);
|
||||
|
||||
- flag.ctime = 0;
|
||||
+ flag.ctime = 1;
|
||||
flag.mtime = 1;
|
||||
- flag.atime = 0;
|
||||
+ }
|
||||
|
||||
- ret = posix_set_mdata_xattr(this, real_path, -1, inode, &tv, NULL,
|
||||
- &flag, _gf_true);
|
||||
+ if (flag.mtime || flag.atime) {
|
||||
+ ret = posix_set_mdata_xattr(this, real_path, -1, inode, ctime,
|
||||
+ &tv_atime, &tv_mtime, NULL, &flag,
|
||||
+ _gf_true);
|
||||
if (ret) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
- "posix set mdata mtime failed on file:"
|
||||
+ "posix set mdata atime failed on file:"
|
||||
" %s gfid:%s",
|
||||
real_path, uuid_utoa(inode->gfid));
|
||||
}
|
||||
@@ -702,8 +706,8 @@ posix_set_ctime(call_frame_t *frame, xlator_t *this, const char *real_path,
|
||||
goto out;
|
||||
}
|
||||
ret = posix_set_mdata_xattr(this, real_path, fd, inode,
|
||||
- &frame->root->ctime, stbuf, &flag,
|
||||
- _gf_false);
|
||||
+ &frame->root->ctime, NULL, NULL, stbuf,
|
||||
+ &flag, _gf_false);
|
||||
if (ret) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
"posix set mdata failed on file: %s gfid:%s", real_path,
|
||||
@@ -733,8 +737,8 @@ posix_set_parent_ctime(call_frame_t *frame, xlator_t *this,
|
||||
goto out;
|
||||
}
|
||||
ret = posix_set_mdata_xattr(this, real_path, fd, inode,
|
||||
- &frame->root->ctime, stbuf, &flag,
|
||||
- _gf_false);
|
||||
+ &frame->root->ctime, NULL, NULL, stbuf,
|
||||
+ &flag, _gf_false);
|
||||
if (ret) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
"posix set mdata failed on file: %s gfid:%s", real_path,
|
||||
@@ -792,8 +796,8 @@ posix_set_ctime_cfr(call_frame_t *frame, xlator_t *this,
|
||||
flag_dup.atime = 0;
|
||||
|
||||
ret = posix_set_mdata_xattr(this, real_path_out, fd_out, inode_out,
|
||||
- &frame->root->ctime, stbuf_out, &flag_dup,
|
||||
- _gf_false);
|
||||
+ &frame->root->ctime, NULL, NULL, stbuf_out,
|
||||
+ &flag_dup, _gf_false);
|
||||
if (ret) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
"posix set mdata failed on file: %s gfid:%s", real_path_out,
|
||||
@@ -811,8 +815,8 @@ posix_set_ctime_cfr(call_frame_t *frame, xlator_t *this,
|
||||
flag_dup.ctime = 0;
|
||||
|
||||
ret = posix_set_mdata_xattr(this, real_path_in, fd_out, inode_out,
|
||||
- &frame->root->ctime, stbuf_out, &flag_dup,
|
||||
- _gf_false);
|
||||
+ &frame->root->ctime, NULL, NULL, stbuf_out,
|
||||
+ &flag_dup, _gf_false);
|
||||
if (ret) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_SETMDATA_FAILED,
|
||||
"posix set mdata failed on file: %s gfid:%s", real_path_in,
|
||||
diff --git a/xlators/storage/posix/src/posix-metadata.h b/xlators/storage/posix/src/posix-metadata.h
|
||||
index dc25e59..c176699 100644
|
||||
--- a/xlators/storage/posix/src/posix-metadata.h
|
||||
+++ b/xlators/storage/posix/src/posix-metadata.h
|
||||
@@ -40,7 +40,8 @@ __posix_get_mdata_xattr(xlator_t *this, const char *real_path, int _fd,
|
||||
inode_t *inode, struct iatt *stbuf);
|
||||
void
|
||||
posix_update_utime_in_mdata(xlator_t *this, const char *real_path, int fd,
|
||||
- inode_t *inode, struct iatt *stbuf, int valid);
|
||||
+ inode_t *inode, struct timespec *ctime,
|
||||
+ struct iatt *stbuf, int valid);
|
||||
void
|
||||
posix_set_ctime(call_frame_t *frame, xlator_t *this, const char *real_path,
|
||||
int fd, inode_t *inode, struct iatt *stbuf);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,61 @@
|
||||
From 243075b593c6fccbffb3e82ffcfdb58acfd68269 Mon Sep 17 00:00:00 2001
|
||||
From: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Date: Thu, 22 Aug 2019 15:51:43 +0530
|
||||
Subject: [PATCH 284/284] posix: log aio_error return codes in
|
||||
posix_fs_health_check
|
||||
|
||||
Problem: Sometime brick is going down to health check thread is
|
||||
failed without logging error codes return by aio system calls.
|
||||
As per aio_error man page it returns a positive error number
|
||||
if the asynchronous I/O operation failed.
|
||||
|
||||
Solution: log aio_error return codes in error message
|
||||
|
||||
> Change-Id: I2496b1bc16e602b0fd3ad53e211de11ec8c641ef
|
||||
> Fixes: bz#1744519
|
||||
> Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
|
||||
> Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/23284/
|
||||
|
||||
Change-Id: I2496b1bc16e602b0fd3ad53e211de11ec8c641ef
|
||||
BUG: 1744518
|
||||
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/179211
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
xlators/storage/posix/src/posix-helpers.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
||||
index ef5bfd5..d143d4c 100644
|
||||
--- a/xlators/storage/posix/src/posix-helpers.c
|
||||
+++ b/xlators/storage/posix/src/posix-helpers.c
|
||||
@@ -2025,7 +2025,6 @@ posix_fs_health_check(xlator_t *this)
|
||||
if (ret != 0) {
|
||||
op_errno = errno;
|
||||
op = "aio_write_error";
|
||||
- ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2064,7 +2063,6 @@ posix_fs_health_check(xlator_t *this)
|
||||
if (ret != 0) {
|
||||
op_errno = errno;
|
||||
op = "aio_read_error";
|
||||
- ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2089,7 +2087,8 @@ out:
|
||||
}
|
||||
if (ret && file_path[0]) {
|
||||
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_HEALTHCHECK_FAILED,
|
||||
- "%s() on %s returned", op, file_path);
|
||||
+ "%s() on %s returned ret is %d error is %s", op, file_path, ret,
|
||||
+ ret != -1 ? strerror(ret) : strerror(op_errno));
|
||||
gf_event(EVENT_POSIX_HEALTH_CHECK_FAILED,
|
||||
"op=%s;path=%s;error=%s;brick=%s:%s timeout is %d", op,
|
||||
file_path, strerror(op_errno), priv->hostname, priv->base_path,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -231,7 +231,7 @@ Release: 0.1%{?prereltag:.%{prereltag}}%{?dist}
|
||||
%else
|
||||
Name: glusterfs
|
||||
Version: 6.0
|
||||
Release: 12%{?dist}
|
||||
Release: 13%{?dist}
|
||||
ExcludeArch: i686
|
||||
%endif
|
||||
License: GPLv2 or LGPLv3+
|
||||
@ -585,6 +585,14 @@ Patch0273: 0273-cluster-ec-Fix-reopen-flags-to-avoid-misbehavior.patch
|
||||
Patch0274: 0274-cluster-ec-Update-lock-good_mask-on-parent-fop-failu.patch
|
||||
Patch0275: 0275-cluster-ec-Create-heal-task-with-heal-process-id.patch
|
||||
Patch0276: 0276-features-utime-always-update-ctime-at-setattr.patch
|
||||
Patch0277: 0277-geo-rep-Fix-Config-Get-Race.patch
|
||||
Patch0278: 0278-geo-rep-Fix-worker-connection-issue.patch
|
||||
Patch0279: 0279-posix-In-brick_mux-brick-is-crashed-while-start-stop.patch
|
||||
Patch0280: 0280-performance-md-cache-Do-not-skip-caching-of-null-cha.patch
|
||||
Patch0281: 0281-ctime-Fix-incorrect-realtime-passed-to-frame-root-ct.patch
|
||||
Patch0282: 0282-geo-rep-Fix-the-name-of-changelog-archive-file.patch
|
||||
Patch0283: 0283-ctime-Fix-ctime-issue-with-utime-family-of-syscalls.patch
|
||||
Patch0284: 0284-posix-log-aio_error-return-codes-in-posix_fs_health_.patch
|
||||
|
||||
%description
|
||||
GlusterFS is a distributed file-system capable of scaling to several
|
||||
@ -2293,6 +2301,9 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Aug 23 2019 Rinku Kothiya <rkothiya@redhat.com> - 6.0-13
|
||||
- fixes bugs bz#1729915 bz#1732376 bz#1743611 bz#1743627 bz#1743634 bz#1744518
|
||||
|
||||
* Fri Aug 09 2019 Sunil Kumar Acharya <sheggodu@redhat.com> - 6.0-12
|
||||
- fixes bugs bz#1730914 bz#1731448 bz#1732770 bz#1732792 bz#1733531
|
||||
bz#1734305 bz#1734534 bz#1734734 bz#1735514 bz#1737705 bz#1732774
|
||||
|
Loading…
Reference in New Issue
Block a user