From: yury Date: Wed, 21 Jun 2006 12:49:02 +0000 (+0000) Subject: - fixed possible deadlock in server side seq-mgr, however seq-mgr still has few issue... X-Git-Tag: v1_8_0_110~486^2~1582 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=d94ac7a86d5120e81f340c362ef2a36e5ced0016;p=fs%2Flustre-release.git - fixed possible deadlock in server side seq-mgr, however seq-mgr still has few issues which are not yet solved. --- diff --git a/lustre/fid/fid_handler.c b/lustre/fid/fid_handler.c index f9410a2..a6f7099 100644 --- a/lustre/fid/fid_handler.c +++ b/lustre/fid/fid_handler.c @@ -92,8 +92,9 @@ seq_server_read_state(struct lu_server_seq *seq, /* on controller node, allocate new super sequence for regular sequnece * server. */ static int -seq_server_alloc_super(struct lu_server_seq *seq, - struct lu_range *range) +__seq_server_alloc_super(struct lu_server_seq *seq, + struct lu_range *range, + const struct lu_context *ctx) { struct lu_range *space = &seq->seq_space; int rc; @@ -116,6 +117,12 @@ seq_server_alloc_super(struct lu_server_seq *seq, rc = 0; } + rc = seq_server_write_state(seq, ctx); + if (rc) { + CERROR("can't save state, rc = %d\n", + rc); + } + if (rc == 0) { CDEBUG(D_INFO|D_WARNING, "SEQ-MGR(srv): allocated super-sequence " "["LPX64"-"LPX64"]\n", range->lr_start, range->lr_end); @@ -125,8 +132,24 @@ seq_server_alloc_super(struct lu_server_seq *seq, } static int -seq_server_alloc_meta(struct lu_server_seq *seq, - struct lu_range *range) +seq_server_alloc_super(struct lu_server_seq *seq, + struct lu_range *range, + const struct lu_context *ctx) +{ + int rc; + ENTRY; + + down(&seq->seq_sem); + rc = __seq_server_alloc_super(seq, range, ctx); + up(&seq->seq_sem); + + RETURN(rc); +} + +static int +__seq_server_alloc_meta(struct lu_server_seq *seq, + struct lu_range *range, + const struct lu_context *ctx) { struct lu_range *super = &seq->seq_super; int rc = 0; @@ -141,9 +164,11 @@ seq_server_alloc_meta(struct lu_server_seq *seq, CERROR("no seq-controller client is setup\n"); RETURN(-EOPNOTSUPP); } - - /* request controller to allocate new super-sequence for us.*/ + + /* allocate new super-sequence. */ + up(&seq->seq_sem); rc = seq_client_alloc_super(seq->seq_cli); + down(&seq->seq_sem); if (rc) { CERROR("can't allocate new super-sequence, " "rc %d\n", rc); @@ -156,6 +181,12 @@ seq_server_alloc_meta(struct lu_server_seq *seq, } range_alloc(range, super, LUSTRE_SEQ_META_WIDTH); + rc = seq_server_write_state(seq, ctx); + if (rc) { + CERROR("can't save state, rc = %d\n", + rc); + } + if (rc == 0) { CDEBUG(D_INFO|D_WARNING, "SEQ-MGR(srv): allocated meta-sequence " "["LPX64"-"LPX64"]\n", range->lr_start, range->lr_end); @@ -165,6 +196,21 @@ seq_server_alloc_meta(struct lu_server_seq *seq, } static int +seq_server_alloc_meta(struct lu_server_seq *seq, + struct lu_range *range, + const struct lu_context *ctx) +{ + int rc; + ENTRY; + + down(&seq->seq_sem); + rc = __seq_server_alloc_meta(seq, range, ctx); + up(&seq->seq_sem); + + RETURN(rc); +} + +static int seq_server_handle(struct lu_server_seq *seq, const struct lu_context *ctx, struct lu_range *range, @@ -173,33 +219,19 @@ seq_server_handle(struct lu_server_seq *seq, int rc; ENTRY; - down(&seq->seq_sem); - switch (opc) { case SEQ_ALLOC_SUPER: - rc = seq_server_alloc_super(seq, range); + rc = seq_server_alloc_super(seq, range, ctx); break; case SEQ_ALLOC_META: - rc = seq_server_alloc_meta(seq, range); + rc = seq_server_alloc_meta(seq, range, ctx); break; default: rc = -EINVAL; break; } - if (rc) - GOTO(out, rc); - - rc = seq_server_write_state(seq, ctx); - if (rc) { - CERROR("can't save state, rc = %d\n", - rc); - } - - EXIT; -out: - up(&seq->seq_sem); - return rc; + RETURN(rc); } static int diff --git a/lustre/fid/fid_request.c b/lustre/fid/fid_request.c index 226b734..f6934bd 100644 --- a/lustre/fid/fid_request.c +++ b/lustre/fid/fid_request.c @@ -86,6 +86,10 @@ seq_client_rpc(struct lu_client_seq *seq, GOTO(out_req, rc = -EPROTO); } *range = *ran; + + LASSERT(range_is_sane(range)); + LASSERT(!range_is_exhausted(range)); + EXIT; out_req: ptlrpc_req_finished(req);