pNFS/flexfiles: Add support for FF_FLAGS_NO_IO_THRU_MDS
For loosely coupled pNFS/flexfiles systems, there is often no advantage at all in going through the MDS for I/O, since the MDS is subject to the same limitations as all other clients when talking to DSes. If a DS is unresponsive, I/O through the MDS will fail. For such systems, the only scalable solution is to have the pNFS clients retry doing pNFS, and so the protocol now provides a flag that allows the pNFS server to signal this. If LAYOUTGET returns FF_FLAGS_NO_IO_THRU_MDS, then we should assume that the MDS wants the client to retry using these devices, even if they were previously marked as being unavailable. To do so, we add a helper, ff_layout_mark_devices_valid() that will be called from layoutget. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
135444126a
commit
260074cd84
|
@ -339,6 +339,19 @@ static void ff_layout_sort_mirrors(struct nfs4_ff_layout_segment *fls)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ff_layout_mark_devices_valid(struct nfs4_ff_layout_segment *fls)
|
||||||
|
{
|
||||||
|
struct nfs4_deviceid_node *node;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!(fls->flags & FF_FLAGS_NO_IO_THRU_MDS))
|
||||||
|
return;
|
||||||
|
for (i = 0; i < fls->mirror_array_cnt; i++) {
|
||||||
|
node = &fls->mirror_array[i]->mirror_ds->id_node;
|
||||||
|
clear_bit(NFS_DEVICEID_UNAVAILABLE, &node->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct pnfs_layout_segment *
|
static struct pnfs_layout_segment *
|
||||||
ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
||||||
struct nfs4_layoutget_res *lgr,
|
struct nfs4_layoutget_res *lgr,
|
||||||
|
@ -499,6 +512,7 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
|
||||||
rc = ff_layout_check_layout(lgr);
|
rc = ff_layout_check_layout(lgr);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out_err_free;
|
goto out_err_free;
|
||||||
|
ff_layout_mark_devices_valid(fls);
|
||||||
|
|
||||||
ret = &fls->generic_hdr;
|
ret = &fls->generic_hdr;
|
||||||
dprintk("<-- %s (success)\n", __func__);
|
dprintk("<-- %s (success)\n", __func__);
|
||||||
|
@ -1035,7 +1049,8 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
|
||||||
rpc_wake_up(&tbl->slot_tbl_waitq);
|
rpc_wake_up(&tbl->slot_tbl_waitq);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
default:
|
default:
|
||||||
if (ff_layout_has_available_ds(lseg))
|
if (ff_layout_no_fallback_to_mds(lseg) ||
|
||||||
|
ff_layout_has_available_ds(lseg))
|
||||||
return -NFS4ERR_RESET_TO_PNFS;
|
return -NFS4ERR_RESET_TO_PNFS;
|
||||||
reset:
|
reset:
|
||||||
dprintk("%s Retry through MDS. Error %d\n", __func__,
|
dprintk("%s Retry through MDS. Error %d\n", __func__,
|
||||||
|
@ -1153,7 +1168,6 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NFS_PROTO call done callback routines */
|
/* NFS_PROTO call done callback routines */
|
||||||
|
|
||||||
static int ff_layout_read_done_cb(struct rpc_task *task,
|
static int ff_layout_read_done_cb(struct rpc_task *task,
|
||||||
struct nfs_pgio_header *hdr)
|
struct nfs_pgio_header *hdr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#define FS_NFS_NFS4FLEXFILELAYOUT_H
|
#define FS_NFS_NFS4FLEXFILELAYOUT_H
|
||||||
|
|
||||||
#define FF_FLAGS_NO_LAYOUTCOMMIT 1
|
#define FF_FLAGS_NO_LAYOUTCOMMIT 1
|
||||||
|
#define FF_FLAGS_NO_IO_THRU_MDS 2
|
||||||
|
|
||||||
#include "../pnfs.h"
|
#include "../pnfs.h"
|
||||||
|
|
||||||
|
@ -145,6 +146,12 @@ FF_LAYOUT_MIRROR_COUNT(struct pnfs_layout_segment *lseg)
|
||||||
return FF_LAYOUT_LSEG(lseg)->mirror_array_cnt;
|
return FF_LAYOUT_LSEG(lseg)->mirror_array_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
ff_layout_no_fallback_to_mds(struct pnfs_layout_segment *lseg)
|
||||||
|
{
|
||||||
|
return FF_LAYOUT_LSEG(lseg)->flags & FF_FLAGS_NO_IO_THRU_MDS;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
ff_layout_test_devid_unavailable(struct nfs4_deviceid_node *node)
|
ff_layout_test_devid_unavailable(struct nfs4_deviceid_node *node)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue