autobuild v6.0-27
Resolves: bz#1789447 Signed-off-by: Rinku Kothiya <rkothiya@redhat.com>
This commit is contained in:
parent
61de5f4d9d
commit
9d5f2fefff
236
0347-tools-glusterfind-handle-offline-bricks.patch
Normal file
236
0347-tools-glusterfind-handle-offline-bricks.patch
Normal file
@ -0,0 +1,236 @@
|
||||
From 87e6ea2cd63898c5d243b0f0c719f4f6347fb829 Mon Sep 17 00:00:00 2001
|
||||
From: Milind Changire <mchangir@redhat.com>
|
||||
Date: Thu, 5 Jan 2017 19:53:19 +0530
|
||||
Subject: [PATCH 347/349] tools/glusterfind: handle offline bricks
|
||||
|
||||
Problem:
|
||||
glusterfind is unable to copy remote output file to local node when a
|
||||
remove-brick is in progress on the remote node. After copying remote
|
||||
files, in the --full output listing path, a "sort -u" command is run on
|
||||
the collected files. However, "sort" exits with an error code if it
|
||||
finds any file missing.
|
||||
|
||||
Solution:
|
||||
Maintain a map of (pid, output file) when the node commands are started
|
||||
and remove the mapping for the pid for which the command returns an
|
||||
error. Use the list of files present in the map for the "sort" command.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/16332
|
||||
> Change-Id: Ie6e019037379f4cb163f24b1c65eb382efc2fb3b
|
||||
> fixes: bz#1410439
|
||||
> Signed-off-by: Milind Changire <mchangir@redhat.com>
|
||||
> Signed-off-by: Shwetha K Acharya <sacharya@redhat.com>
|
||||
|
||||
BUG: 1789447
|
||||
Change-Id: Ie6e019037379f4cb163f24b1c65eb382efc2fb3b
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/189214
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
---
|
||||
tools/glusterfind/src/gfind_py2py3.py | 25 ++++++++++++++
|
||||
tools/glusterfind/src/main.py | 61 +++++++++++++++++++++--------------
|
||||
2 files changed, 61 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/tools/glusterfind/src/gfind_py2py3.py b/tools/glusterfind/src/gfind_py2py3.py
|
||||
index 1d41ec5..87324fb 100644
|
||||
--- a/tools/glusterfind/src/gfind_py2py3.py
|
||||
+++ b/tools/glusterfind/src/gfind_py2py3.py
|
||||
@@ -40,6 +40,19 @@ if sys.version_info >= (3,):
|
||||
def gfind_history_changelog_done(libgfc, clfile):
|
||||
return libgfc.gf_history_changelog_done(clfile.encode())
|
||||
|
||||
+ def gfind_write_row(f, row, field_separator, p_rep, row_2_rep):
|
||||
+ f.write(u"{0}{1}{2}{3}{4}\n".format(row,
|
||||
+ field_separator,
|
||||
+ p_rep,
|
||||
+ field_separator,
|
||||
+ row_2_rep))
|
||||
+
|
||||
+ def gfind_write(f, row, field_separator, p_rep):
|
||||
+ f.write(u"{0}{1}{2}\n".format(row,
|
||||
+ field_separator,
|
||||
+ p_rep))
|
||||
+
|
||||
+
|
||||
else:
|
||||
|
||||
# Raw conversion of bytearray to string
|
||||
@@ -61,3 +74,15 @@ else:
|
||||
|
||||
def gfind_history_changelog_done(libgfc, clfile):
|
||||
return libgfc.gf_history_changelog_done(clfile)
|
||||
+
|
||||
+ def gfind_write_row(f, row, field_separator, p_rep, row_2_rep):
|
||||
+ f.write(u"{0}{1}{2}{3}{4}\n".format(row,
|
||||
+ field_separator,
|
||||
+ p_rep,
|
||||
+ field_separator,
|
||||
+ row_2_rep).encode())
|
||||
+
|
||||
+ def gfind_write(f, row, field_separator, p_rep):
|
||||
+ f.write(u"{0}{1}{2}\n".format(row,
|
||||
+ field_separator,
|
||||
+ p_rep).encode())
|
||||
diff --git a/tools/glusterfind/src/main.py b/tools/glusterfind/src/main.py
|
||||
index cc5a86f..fefe4a3 100644
|
||||
--- a/tools/glusterfind/src/main.py
|
||||
+++ b/tools/glusterfind/src/main.py
|
||||
@@ -16,6 +16,7 @@ from multiprocessing import Process
|
||||
import os
|
||||
import xml.etree.cElementTree as etree
|
||||
from argparse import ArgumentParser, RawDescriptionHelpFormatter, Action
|
||||
+from gfind_py2py3 import gfind_write_row, gfind_write
|
||||
import logging
|
||||
import shutil
|
||||
import tempfile
|
||||
@@ -35,9 +36,9 @@ GlusterFS Incremental API
|
||||
ParseError = etree.ParseError if hasattr(etree, 'ParseError') else SyntaxError
|
||||
|
||||
logger = logging.getLogger()
|
||||
-node_outfiles = []
|
||||
vol_statusStr = ""
|
||||
gtmpfilename = None
|
||||
+g_pid_nodefile_map = {}
|
||||
|
||||
|
||||
class StoreAbsPath(Action):
|
||||
@@ -111,7 +112,7 @@ def node_cmd(host, host_uuid, task, cmd, args, opts):
|
||||
|
||||
|
||||
def run_cmd_nodes(task, args, **kwargs):
|
||||
- global node_outfiles
|
||||
+ global g_pid_nodefile_map
|
||||
nodes = get_nodes(args.volume)
|
||||
pool = []
|
||||
for num, node in enumerate(nodes):
|
||||
@@ -142,7 +143,6 @@ def run_cmd_nodes(task, args, **kwargs):
|
||||
if tag == "":
|
||||
tag = '""' if not is_host_local(host_uuid) else ""
|
||||
|
||||
- node_outfiles.append(node_outfile)
|
||||
# remote file will be copied into this directory
|
||||
mkdirp(os.path.dirname(node_outfile),
|
||||
exit_on_err=True, logger=logger)
|
||||
@@ -180,7 +180,6 @@ def run_cmd_nodes(task, args, **kwargs):
|
||||
if tag == "":
|
||||
tag = '""' if not is_host_local(host_uuid) else ""
|
||||
|
||||
- node_outfiles.append(node_outfile)
|
||||
# remote file will be copied into this directory
|
||||
mkdirp(os.path.dirname(node_outfile),
|
||||
exit_on_err=True, logger=logger)
|
||||
@@ -264,6 +263,7 @@ def run_cmd_nodes(task, args, **kwargs):
|
||||
args=(host, host_uuid, task, cmd, args, opts))
|
||||
p.start()
|
||||
pool.append(p)
|
||||
+ g_pid_nodefile_map[p.pid] = node_outfile
|
||||
|
||||
for num, p in enumerate(pool):
|
||||
p.join()
|
||||
@@ -271,8 +271,11 @@ def run_cmd_nodes(task, args, **kwargs):
|
||||
logger.warn("Command %s failed in %s" % (task, nodes[num][1]))
|
||||
if task in ["create", "delete"]:
|
||||
fail("Command %s failed in %s" % (task, nodes[num][1]))
|
||||
- elif task == "pre" and args.disable_partial:
|
||||
- sys.exit(1)
|
||||
+ elif task == "pre" or task == "query":
|
||||
+ if args.disable_partial:
|
||||
+ sys.exit(1)
|
||||
+ else:
|
||||
+ del g_pid_nodefile_map[p.pid]
|
||||
|
||||
|
||||
@cache_output
|
||||
@@ -512,16 +515,10 @@ def write_output(outfile, outfilemerger, field_separator):
|
||||
continue
|
||||
|
||||
if row_2_rep and row_2_rep != "":
|
||||
- f.write(u"{0}{1}{2}{3}{4}\n".format(row[0],
|
||||
- field_separator,
|
||||
- p_rep,
|
||||
- field_separator,
|
||||
- row_2_rep).encode())
|
||||
- else:
|
||||
- f.write(u"{0}{1}{2}\n".format(row[0],
|
||||
- field_separator,
|
||||
- p_rep).encode())
|
||||
+ gfind_write_row(f, row[0], field_separator, p_rep, field_separator, row_2_rep)
|
||||
|
||||
+ else:
|
||||
+ gfind_write(f, row[0], field_separator, p_rep)
|
||||
|
||||
def mode_create(session_dir, args):
|
||||
logger.debug("Init is called - Session: %s, Volume: %s"
|
||||
@@ -571,6 +568,7 @@ def mode_create(session_dir, args):
|
||||
|
||||
def mode_query(session_dir, args):
|
||||
global gtmpfilename
|
||||
+ global g_pid_nodefile_map
|
||||
|
||||
# Verify volume status
|
||||
cmd = ["gluster", 'volume', 'info', args.volume, "--xml"]
|
||||
@@ -634,14 +632,20 @@ def mode_query(session_dir, args):
|
||||
|
||||
# Merger
|
||||
if args.full:
|
||||
- cmd = ["sort", "-u"] + node_outfiles + ["-o", args.outfile]
|
||||
- execute(cmd,
|
||||
- exit_msg="Failed to merge output files "
|
||||
- "collected from nodes", logger=logger)
|
||||
+ if len(g_pid_nodefile_map) > 0:
|
||||
+ cmd = ["sort", "-u"] + g_pid_nodefile_map.values() + \
|
||||
+ ["-o", args.outfile]
|
||||
+ execute(cmd,
|
||||
+ exit_msg="Failed to merge output files "
|
||||
+ "collected from nodes", logger=logger)
|
||||
+ else:
|
||||
+ fail("Failed to collect any output files from peers. "
|
||||
+ "Looks like all bricks are offline.", logger=logger)
|
||||
else:
|
||||
# Read each Changelogs db and generate finaldb
|
||||
create_file(args.outfile, exit_on_err=True, logger=logger)
|
||||
- outfilemerger = OutputMerger(args.outfile + ".db", node_outfiles)
|
||||
+ outfilemerger = OutputMerger(args.outfile + ".db",
|
||||
+ g_pid_nodefile_map.values())
|
||||
write_output(args.outfile, outfilemerger, args.field_separator)
|
||||
|
||||
try:
|
||||
@@ -656,6 +660,7 @@ def mode_query(session_dir, args):
|
||||
|
||||
def mode_pre(session_dir, args):
|
||||
global gtmpfilename
|
||||
+ global g_pid_nodefile_map
|
||||
|
||||
"""
|
||||
Read from Session file and write to session.pre file
|
||||
@@ -696,14 +701,20 @@ def mode_pre(session_dir, args):
|
||||
|
||||
# Merger
|
||||
if args.full:
|
||||
- cmd = ["sort", "-u"] + node_outfiles + ["-o", args.outfile]
|
||||
- execute(cmd,
|
||||
- exit_msg="Failed to merge output files "
|
||||
- "collected from nodes", logger=logger)
|
||||
+ if len(g_pid_nodefile_map) > 0:
|
||||
+ cmd = ["sort", "-u"] + g_pid_nodefile_map.values() + \
|
||||
+ ["-o", args.outfile]
|
||||
+ execute(cmd,
|
||||
+ exit_msg="Failed to merge output files "
|
||||
+ "collected from nodes", logger=logger)
|
||||
+ else:
|
||||
+ fail("Failed to collect any output files from peers. "
|
||||
+ "Looks like all bricks are offline.", logger=logger)
|
||||
else:
|
||||
# Read each Changelogs db and generate finaldb
|
||||
create_file(args.outfile, exit_on_err=True, logger=logger)
|
||||
- outfilemerger = OutputMerger(args.outfile + ".db", node_outfiles)
|
||||
+ outfilemerger = OutputMerger(args.outfile + ".db",
|
||||
+ g_pid_nodefile_map.values())
|
||||
write_output(args.outfile, outfilemerger, args.field_separator)
|
||||
|
||||
try:
|
||||
--
|
||||
1.8.3.1
|
||||
|
113
0348-glusterfind-Fix-py2-py3-issues.patch
Normal file
113
0348-glusterfind-Fix-py2-py3-issues.patch
Normal file
@ -0,0 +1,113 @@
|
||||
From 1ca8a545833e0a6e674984245338b8675ddc58bc Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Fri, 10 Jan 2020 16:48:14 +0530
|
||||
Subject: [PATCH 348/349] glusterfind: Fix py2/py3 issues
|
||||
|
||||
1. In dictionary values(), returns list in py2 and not in py3.
|
||||
So explicitly convert it into list.
|
||||
2. xattr module returns values in bytes. So explicitly convert
|
||||
them to str to work both with py2 and py3
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23993
|
||||
> fixes: bz#1789439
|
||||
> Change-Id: I27a639cda4f7a4ece9744a97c3d16e247906bd94
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
|
||||
BUG: 1789447
|
||||
Change-Id: I27a639cda4f7a4ece9744a97c3d16e247906bd94
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/189215
|
||||
Reviewed-by: Shwetha Acharya <sacharya@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Hari Gowtham Gopal <hgowtham@redhat.com>
|
||||
Reviewed-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
---
|
||||
tools/glusterfind/src/changelog.py | 14 +++++++++-----
|
||||
tools/glusterfind/src/main.py | 8 ++++----
|
||||
2 files changed, 13 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/tools/glusterfind/src/changelog.py b/tools/glusterfind/src/changelog.py
|
||||
index d8f97e0..d972fb5 100644
|
||||
--- a/tools/glusterfind/src/changelog.py
|
||||
+++ b/tools/glusterfind/src/changelog.py
|
||||
@@ -14,6 +14,7 @@ import sys
|
||||
import time
|
||||
import xattr
|
||||
import logging
|
||||
+from gfind_py2py3 import bytearray_to_str
|
||||
from argparse import ArgumentParser, RawDescriptionHelpFormatter
|
||||
import hashlib
|
||||
try:
|
||||
@@ -105,9 +106,10 @@ def populate_pgfid_and_inodegfid(brick, changelog_data):
|
||||
changelog_data.inodegfid_add(os.stat(p).st_ino, gfid)
|
||||
file_xattrs = xattr.list(p)
|
||||
for x in file_xattrs:
|
||||
- if x.startswith("trusted.pgfid."):
|
||||
+ x_str = bytearray_to_str(x)
|
||||
+ if x_str.startswith("trusted.pgfid."):
|
||||
# PGFID in pgfid table
|
||||
- changelog_data.pgfid_add(x.split(".")[-1])
|
||||
+ changelog_data.pgfid_add(x_str.split(".")[-1])
|
||||
except (IOError, OSError):
|
||||
# All OS Errors ignored, since failures will be logged
|
||||
# in End. All GFIDs present in gfidpath table
|
||||
@@ -122,10 +124,12 @@ def enum_hard_links_using_gfid2path(brick, gfid, args):
|
||||
try:
|
||||
file_xattrs = xattr.list(p)
|
||||
for x in file_xattrs:
|
||||
- if x.startswith("trusted.gfid2path."):
|
||||
+ x_str = bytearray_to_str(x)
|
||||
+ if x_str.startswith("trusted.gfid2path."):
|
||||
# get the value for the xattr i.e. <PGFID>/<BN>
|
||||
- v = xattr.getxattr(p, x)
|
||||
- pgfid, bn = v.split(os.sep)
|
||||
+ v = xattr.getxattr(p, x_str)
|
||||
+ v_str = bytearray_to_str(v)
|
||||
+ pgfid, bn = v_str.split(os.sep)
|
||||
try:
|
||||
path = symlink_gfid_to_path(brick, pgfid)
|
||||
fullpath = os.path.join(path, bn)
|
||||
diff --git a/tools/glusterfind/src/main.py b/tools/glusterfind/src/main.py
|
||||
index fefe4a3..dfc9d07 100644
|
||||
--- a/tools/glusterfind/src/main.py
|
||||
+++ b/tools/glusterfind/src/main.py
|
||||
@@ -633,7 +633,7 @@ def mode_query(session_dir, args):
|
||||
# Merger
|
||||
if args.full:
|
||||
if len(g_pid_nodefile_map) > 0:
|
||||
- cmd = ["sort", "-u"] + g_pid_nodefile_map.values() + \
|
||||
+ cmd = ["sort", "-u"] + list(g_pid_nodefile_map.values()) + \
|
||||
["-o", args.outfile]
|
||||
execute(cmd,
|
||||
exit_msg="Failed to merge output files "
|
||||
@@ -645,7 +645,7 @@ def mode_query(session_dir, args):
|
||||
# Read each Changelogs db and generate finaldb
|
||||
create_file(args.outfile, exit_on_err=True, logger=logger)
|
||||
outfilemerger = OutputMerger(args.outfile + ".db",
|
||||
- g_pid_nodefile_map.values())
|
||||
+ list(g_pid_nodefile_map.values()))
|
||||
write_output(args.outfile, outfilemerger, args.field_separator)
|
||||
|
||||
try:
|
||||
@@ -702,7 +702,7 @@ def mode_pre(session_dir, args):
|
||||
# Merger
|
||||
if args.full:
|
||||
if len(g_pid_nodefile_map) > 0:
|
||||
- cmd = ["sort", "-u"] + g_pid_nodefile_map.values() + \
|
||||
+ cmd = ["sort", "-u"] + list(g_pid_nodefile_map.values()) + \
|
||||
["-o", args.outfile]
|
||||
execute(cmd,
|
||||
exit_msg="Failed to merge output files "
|
||||
@@ -714,7 +714,7 @@ def mode_pre(session_dir, args):
|
||||
# Read each Changelogs db and generate finaldb
|
||||
create_file(args.outfile, exit_on_err=True, logger=logger)
|
||||
outfilemerger = OutputMerger(args.outfile + ".db",
|
||||
- g_pid_nodefile_map.values())
|
||||
+ list(g_pid_nodefile_map.values()))
|
||||
write_output(args.outfile, outfilemerger, args.field_separator)
|
||||
|
||||
try:
|
||||
--
|
||||
1.8.3.1
|
||||
|
56
0349-glusterfind-python3-compatibility.patch
Normal file
56
0349-glusterfind-python3-compatibility.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 1354a492cbc758f9801568153380ca896fab7765 Mon Sep 17 00:00:00 2001
|
||||
From: Sunny Kumar <sunkumar@redhat.com>
|
||||
Date: Fri, 10 Jan 2020 14:28:35 +0000
|
||||
Subject: [PATCH 349/349] glusterfind: python3 compatibility
|
||||
|
||||
Problem:
|
||||
While we delete gluster volume the hook script 'S57glusterfind-delete-post.py'
|
||||
is failed to execute and error message can be observed in glusterd log.
|
||||
|
||||
Traceback:
|
||||
File "/var/lib/glusterd/hooks/1/delete/post/S57glusterfind-delete-post", line 69, in <module>
|
||||
main()
|
||||
File "/var/lib/glusterd/hooks/1/delete/post/S57glusterfind-delete-post", line 39, in main
|
||||
glusterfind_dir = os.path.join(get_glusterd_workdir(), "glusterfind")
|
||||
File "/usr/lib64/python3.7/posixpath.py", line 94, in join
|
||||
genericpath._check_arg_types('join', a, *p)
|
||||
File "/usr/lib64/python3.7/genericpath.py", line 155, in _check_arg_types
|
||||
raise TypeError("Can't mix strings and bytes in path components") from None
|
||||
TypeError: Can't mix strings and bytes in path components
|
||||
|
||||
Solution:
|
||||
|
||||
Added the 'universal_newlines' flag to Popen to support backward compatibility.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/23994
|
||||
> Change-Id: Ie5655b11b55535c5ad2338108d0448e6fdaacf4f
|
||||
> Fixes: bz#1789478
|
||||
> Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
|
||||
Change-Id: Ie5655b11b55535c5ad2338108d0448e6fdaacf4f
|
||||
BUG: 1789447
|
||||
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/189216
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
---
|
||||
tools/glusterfind/S57glusterfind-delete-post.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tools/glusterfind/S57glusterfind-delete-post.py b/tools/glusterfind/S57glusterfind-delete-post.py
|
||||
index 5b5142d..5beece2 100755
|
||||
--- a/tools/glusterfind/S57glusterfind-delete-post.py
|
||||
+++ b/tools/glusterfind/S57glusterfind-delete-post.py
|
||||
@@ -18,7 +18,7 @@ def handle_rm_error(func, path, exc_info):
|
||||
|
||||
def get_glusterd_workdir():
|
||||
p = Popen(["gluster", "system::", "getwd"],
|
||||
- stdout=PIPE, stderr=PIPE)
|
||||
+ stdout=PIPE, stderr=PIPE, universal_newlines=True)
|
||||
|
||||
out, _ = p.communicate()
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -231,7 +231,7 @@ Release: 0.1%{?prereltag:.%{prereltag}}%{?dist}
|
||||
%else
|
||||
Name: glusterfs
|
||||
Version: 6.0
|
||||
Release: 26%{?dist}
|
||||
Release: 27%{?dist}
|
||||
ExcludeArch: i686
|
||||
%endif
|
||||
License: GPLv2 or LGPLv3+
|
||||
@ -655,6 +655,9 @@ Patch0343: 0343-extras-hooks-syntactical-errors-in-SELinux-hooks-sci.patch
|
||||
Patch0344: 0344-Revert-all-fixes-to-include-SELinux-hook-scripts.patch
|
||||
Patch0345: 0345-read-ahead-io-cache-turn-off-by-default.patch
|
||||
Patch0346: 0346-fuse-degrade-logging-of-write-failure-to-fuse-device.patch
|
||||
Patch0347: 0347-tools-glusterfind-handle-offline-bricks.patch
|
||||
Patch0348: 0348-glusterfind-Fix-py2-py3-issues.patch
|
||||
Patch0349: 0349-glusterfind-python3-compatibility.patch
|
||||
|
||||
%description
|
||||
GlusterFS is a distributed file-system capable of scaling to several
|
||||
@ -2382,6 +2385,9 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Mon Jan 13 2020 Rinku Kothiya <rkothiya@redhat.com> - 6.0-27
|
||||
- fixes bugs bz#1789447
|
||||
|
||||
* Fri Jan 10 2020 Rinku Kothiya <rkothiya@redhat.com> - 6.0-26
|
||||
- fixes bugs bz#1763208 bz#1788656
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user