Lock fsdb_mutex until the fsdb is loaded from llogs.
It fixes race between loading data from llog into fsdb
and obtaining data form it.
Xyratex-bug-id: MRP-230
Signed-off-by: Andriy Skulysh <andriy_skulysh@xyratex.com>
Reviewed-by: Alexey Lyashkov <alexey_lyashkov@xyratex.com>
Reviewed-by: Andrew Perepechko <andrew_perepechko@xyratex.com>
Reviewed-by: Bruce Korb <Bruce_Korb@us.xyratex.com>
Change-Id: I8c29040a182f363e83e61e57d3e20756f40300ea
Reviewed-on: http://review.whamcloud.com/2251
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
rc = name_create(&logname, fsdb->fsdb_name, "-client");
if (rc)
GOTO(out_put, rc);
rc = name_create(&logname, fsdb->fsdb_name, "-client");
if (rc)
GOTO(out_put, rc);
- cfs_mutex_lock(&fsdb->fsdb_mutex);
rc = llog_open_create(env, ctxt, &loghandle, NULL, logname);
if (rc)
GOTO(out_pop, rc);
rc = llog_open_create(env, ctxt, &loghandle, NULL, logname);
if (rc)
GOTO(out_pop, rc);
out_close:
llog_close(env, loghandle);
out_pop:
out_close:
llog_close(env, loghandle);
out_pop:
- cfs_mutex_unlock(&fsdb->fsdb_mutex);
name_destroy(&logname);
out_put:
llog_ctxt_put(ctxt);
name_destroy(&logname);
out_put:
llog_ctxt_put(ctxt);
struct fs_db *fsdb;
int rc = 0;
struct fs_db *fsdb;
int rc = 0;
cfs_mutex_lock(&mgs->mgs_mutex);
fsdb = mgs_find_fsdb(mgs, name);
if (fsdb) {
cfs_mutex_unlock(&mgs->mgs_mutex);
*dbh = fsdb;
cfs_mutex_lock(&mgs->mgs_mutex);
fsdb = mgs_find_fsdb(mgs, name);
if (fsdb) {
cfs_mutex_unlock(&mgs->mgs_mutex);
*dbh = fsdb;
}
CDEBUG(D_MGS, "Creating new db\n");
fsdb = mgs_new_fsdb(env, mgs, name);
}
CDEBUG(D_MGS, "Creating new db\n");
fsdb = mgs_new_fsdb(env, mgs, name);
+ /* lock fsdb_mutex until the db is loaded from llogs */
+ if (fsdb)
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
cfs_mutex_unlock(&mgs->mgs_mutex);
if (!fsdb)
cfs_mutex_unlock(&mgs->mgs_mutex);
if (!fsdb)
if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
/* populate the db from the client llog */
rc = mgs_get_fsdb_from_llog(env, mgs, fsdb);
if (rc) {
CERROR("Can't get db from client log %d\n", rc);
if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
/* populate the db from the client llog */
rc = mgs_get_fsdb_from_llog(env, mgs, fsdb);
if (rc) {
CERROR("Can't get db from client log %d\n", rc);
- mgs_free_fsdb(mgs, fsdb);
- return rc;
rc = mgs_get_fsdb_srpc_from_llog(env, mgs, fsdb);
if (rc) {
CERROR("Can't get db from params log %d\n", rc);
rc = mgs_get_fsdb_srpc_from_llog(env, mgs, fsdb);
if (rc) {
CERROR("Can't get db from params log %d\n", rc);
- mgs_free_fsdb(mgs, fsdb);
- return rc;
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
+ RETURN(0);
+
+out_free:
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
+ mgs_free_fsdb(mgs, fsdb);
+ return rc;
+ cfs_mutex_lock(&fsdb->fsdb_mutex);
if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
imap = fsdb->fsdb_ost_index_map;
} else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
imap = fsdb->fsdb_ost_index_map;
} else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
"is %d\n", (int)MAX_MDT_COUNT);
if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
"is %d\n", (int)MAX_MDT_COUNT);
+ GOTO(out_up, rc = -ERANGE);
+ GOTO(out_up, rc = -EINVAL);
}
if (mti->mti_flags & LDD_F_NEED_INDEX) {
rc = next_index(imap, INDEX_MAP_SIZE);
if (rc == -1)
}
if (mti->mti_flags & LDD_F_NEED_INDEX) {
rc = next_index(imap, INDEX_MAP_SIZE);
if (rc == -1)
+ GOTO(out_up, rc = -ERANGE);
mti->mti_stripe_index = rc;
if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
fsdb->fsdb_mdt_count ++;
mti->mti_stripe_index = rc;
if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
fsdb->fsdb_mdt_count ++;
"but the max index is %d.\n",
mti->mti_svname, mti->mti_stripe_index,
INDEX_MAP_SIZE * 8);
"but the max index is %d.\n",
mti->mti_svname, mti->mti_stripe_index,
INDEX_MAP_SIZE * 8);
+ GOTO(out_up, rc = -ERANGE);
}
if (cfs_test_bit(mti->mti_stripe_index, imap)) {
}
if (cfs_test_bit(mti->mti_stripe_index, imap)) {
"use. Use --writeconf to force\n",
mti->mti_svname,
mti->mti_stripe_index);
"use. Use --writeconf to force\n",
mti->mti_svname,
mti->mti_stripe_index);
+ GOTO(out_up, rc = -EADDRINUSE);
} else {
CDEBUG(D_MGS, "Server %s updating index %d\n",
mti->mti_svname, mti->mti_stripe_index);
} else {
CDEBUG(D_MGS, "Server %s updating index %d\n",
mti->mti_svname, mti->mti_stripe_index);
+ GOTO(out_up, rc = EALREADY);
}
}
cfs_set_bit(mti->mti_stripe_index, imap);
cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
}
}
cfs_set_bit(mti->mti_stripe_index, imap);
cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
server_make_name(mti->mti_flags & ~(LDD_F_VIRGIN | LDD_F_WRITECONF),
mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname);
server_make_name(mti->mti_flags & ~(LDD_F_VIRGIN | LDD_F_WRITECONF),
mti->mti_stripe_index, mti->mti_fsname, mti->mti_svname);
mti->mti_stripe_index);
RETURN(0);
mti->mti_stripe_index);
RETURN(0);
+out_up:
+ cfs_mutex_unlock(&fsdb->fsdb_mutex);
+ return rc;
}
struct mgs_modify_lookup {
}
struct mgs_modify_lookup {