[Ocfs2-commits] mfasheh commits r1312 - trunk/src
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Wed Jul 28 18:09:19 CDT 2004
Author: mfasheh
Date: 2004-07-28 17:09:17 -0500 (Wed, 28 Jul 2004)
New Revision: 1312
Modified:
trunk/src/dlm.c
trunk/src/nm.c
Log:
* optionally take io_sem only when absolutely necessary in process_vote
* enable some experimental trylock code in process_vote for the actual
io sem. this is ugly.
* remove some i/o cases in process_vote which were unecessary (delete)
* acquire_lock knows how to drop the lockres and retry in case of
timeout now.
Modified: trunk/src/dlm.c
===================================================================
--- trunk/src/dlm.c 2004-07-28 21:56:13 UTC (rev 1311)
+++ trunk/src/dlm.c 2004-07-28 22:09:17 UTC (rev 1312)
@@ -994,7 +994,10 @@
*b, &disk_vote, inode);
if (status < 0) {
ocfs_release_lockres (lockres); // ocfs_acquire_lock
- if (status == -EAGAIN) {
+ if (status == -EAGAIN || status == -ETIMEDOUT) {
+ if (status == -ETIMEDOUT)
+ LOG_ERROR_ARGS("Timed out acquiring lock for inode %llu, (lockid = %llu) retrying...\n", OCFS_I(inode)->ip_blkno, lock_id);
+
ocfs_sleep (500);
if (ocfs_task_interruptible (osb)) {
LOG_TRACE_ARGS("interrupted... lockid=%llu\n",
@@ -1222,8 +1225,6 @@
{
ocfs_node_map vote_map;
ocfs_node_map open_map;
- __u64 lockseqnum = 0;
- int tmpstat;
ocfs2_dinode *fe = NULL;
__u64 lock_id;
__u32 lock_write_flags = DLOCK_FLAG_MASTER | DLOCK_FLAG_LOCK | DLOCK_FLAG_OPEN_MAP;
@@ -1295,8 +1296,6 @@
}
ocfs_node_map_clear_bit(&vote_map, osb->node_num);
- /* net voting */
-try_net_again:
// remove dead nodes
ocfs_node_map_and(&vote_map, &osb->publ_map);
@@ -1307,52 +1306,19 @@
goto vote_success;
}
- if (!*disk_vote) {
- LOG_TRACE_STR ("Network vote");
- status = ocfs_send_dlm_request_msg (osb, lock_id, lock_type,
- flags, &vote_map,
- &open_map, inode, 1,
- &vote_status);
- if (status >= 0) {
- status = vote_status;
- if (status >= 0)
- goto vote_success;
- else
- goto bail;
- } else if (status == -EAGAIN) {
- LOG_TRACE_ARGS("(b) try again on net...\n");
- goto try_net_again;
- } else if (status == -ETIMEDOUT) {
- LOG_TRACE_STR ("Network voting timed out");
- LOG_TRACE_ARGS ("(c) try again on net... Network voting timed out\n");
- goto try_net_again;
- }
- else if (status == -EINTR && ocfs_task_interruptible (osb)) {
- LOG_ERROR_ARGS("interrupted! (lock_id = %llu)\n",
- lock_id);
- goto bail;
- } else
- LOG_ERROR_STATUS (status);
+ status = ocfs_send_dlm_request_msg (osb, lock_id, lock_type,
+ flags, &vote_map,
+ &open_map, inode, 1,
+ &vote_status);
+ if (status >= 0) {
+ status = vote_status;
}
-
- LOG_ERROR_ARGS("DISKVOTE!!: req_lock=%u, flags=%08x, blkno=%llu, inode=%llu\n",
- requested_lock, flags, lock_id, inode?OCFS_I(inode)->ip_blkno:0ULL);
- LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d\n",
- osb->node_num, lockres->master_node_num, lockres->lock_type,
- lockres->readonly_node);
-
- //BUG();
-
- ocfs_show_trace(NULL);
-
- /* disk voting */
- LOG_TRACE_STR ("Disk vote");
- *disk_vote = 1;
- status = ocfs_disk_request_vote (osb, lock_id, lock_type, flags, &vote_map, &lockseqnum, 5000, inode, 1, &open_map);
if (status < 0) {
- if (status != -EAGAIN)
- LOG_ERROR_STATUS (status);
+ if (status != -EAGAIN &&
+ status != -ETIMEDOUT &&
+ status != -EINTR)
+ LOG_ERROR_STATUS(status);
goto bail;
}
@@ -1398,12 +1364,6 @@
&lockres->oin_openmap);
}
bail:
- if (*disk_vote) {
- tmpstat = ocfs_reset_voting (osb);
- if (tmpstat < 0)
- LOG_ERROR_STATUS (tmpstat);
- }
-
/* if we removed FLAG_READDIR above, set the readonly_node now */
if (is_readdir && !(flags & FLAG_READDIR)) {
lockres->readonly_node = lockres->master_node_num;
Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c 2004-07-28 21:56:13 UTC (rev 1311)
+++ trunk/src/nm.c 2004-07-28 22:09:17 UTC (rev 1312)
@@ -656,6 +656,46 @@
return;
}
+#define PROCESS_VOTE_TRYLOCK
+
+#ifdef PROCESS_VOTE_TRYLOCK
+static int ocfs_io_sem_write_trylock(struct inode *inode, u32 timeout)
+{
+ unsigned long jif;
+ int status;
+
+ OCFS_ASSERT(inode);
+
+ LOG_ENTRY_ARGS ("(%llu, %u)\n", OCFS_I(inode)->ip_blkno, timeout);
+
+ if (!timeout) {
+ down_write(&OCFS_I(inode)->ip_io_sem);
+ status = 0;
+ goto bail;
+ }
+
+ jif = jiffies + (timeout * HZ / 1000);
+
+ while(1) {
+ if (down_write_trylock(&OCFS_I(inode)->ip_io_sem)) {
+ status = 0;
+ break;
+ }
+
+ if (jif < jiffies) {
+ status = -ETIMEDOUT;
+ break;
+ }
+
+ ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
+ }
+
+bail:
+ LOG_EXIT_STATUS (status);
+ return status;
+}
+#endif
+
/*
* ocfs_process_vote()
*
@@ -765,9 +805,29 @@
* Please see the note in ocfs_delete_inode. */
osb->voting_ino = inode->i_ino;
- down_write(&OCFS_I(inode)->ip_io_sem);
- have_io_sem = 1;
+#warning "FLAG_ADD_OIN_MAP shouldn't do io anyways!"
+#ifdef PROCESS_VOTE_TRYLOCK
+ if (flags & (FLAG_FILE_RELEASE_CACHE | FLAG_CHANGE_MASTER
+ | FLAG_ADD_OIN_MAP)) {
+ if (ocfs_io_sem_write_trylock(inode,
+ (OCFS_NM_HEARTBEAT_TIME/2))) {
+ LOG_ERROR_ARGS("Could not get i/o lock on "
+ "inode %llu\n",
+ OCFS_I(inode)->ip_blkno);
+ if (flags & FLAG_ADD_OIN_MAP)
+ goto leave;
+ } else
+ have_io_sem = 1;
+ }
+#else
+ if (flags & (FLAG_FILE_RELEASE_CACHE | FLAG_CHANGE_MASTER
+ | FLAG_ADD_OIN_MAP)) {
+ down_write(&OCFS_I(inode)->ip_io_sem);
+ have_io_sem = 1;
+ }
+#endif
+
lockres = GET_INODE_LOCKRES(inode);
status = ocfs_update_lockres (osb, NULL, NULL,
(OCFS_NM_HEARTBEAT_TIME/2),
@@ -831,10 +891,6 @@
case UPDATE_OIN_INODE:
LOG_TRACE_STR("UPDATE_OIN_INODE");
atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
- tmpstat = ocfs_verify_update_inode(osb, inode, 1);
- if (tmpstat < 0)
- LOG_ERROR_STATUS (tmpstat);
-
vote_response = FLAG_VOTE_OIN_UPDATED;
break;
@@ -873,23 +929,13 @@
case DELETE_ACQUIRE:
LOG_TRACE_STR("DELETE_ACQUIRE");
- atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
- tmpstat = ocfs_verify_update_inode(osb, inode, 1);
- if (tmpstat < 0)
- LOG_ERROR_STATUS (tmpstat);
-
LOG_TRACE_ARGS("DELETE vote on inode %lu, read "
"lnk_cnt = %u\n", inode->i_ino,
inode->i_nlink);
- /* verify_update_inode does a dirty read which
- * might set i_nlink to an old value. */
- if (inode->i_nlink) {
- LOG_ERROR_ARGS("Orphaned inode %lu has link "
- "count = %d!\n", inode->i_ino,
- inode->i_nlink);
- inode->i_nlink = 0;
- }
+ /* force this as ours may be out of date. */
+ inode->i_nlink = 0;
+
down (&(OCFS_I(inode)->ip_sem));
/* vote no if the file is still open. */
if (OCFS_I(inode)->ip_open_cnt > 0) {
@@ -899,7 +945,8 @@
#endif
vote_response = FLAG_VOTE_OIN_ALREADY_INUSE;
up(&(OCFS_I(inode)->ip_sem));
- goto delete_vote_no;
+ lockres->last_upd_seq_num = seq_num;
+ break;
}
up(&(OCFS_I(inode)->ip_sem));
@@ -911,7 +958,8 @@
printk("process_vote: extends pending\n");
#endif
vote_response = FLAG_VOTE_OIN_ALREADY_INUSE;
- goto delete_vote_no;
+ lockres->last_upd_seq_num = seq_num;
+ break;
}
spin_unlock(&oin_num_ext_lock);
@@ -935,25 +983,6 @@
/* Alright, for the YES case, we're done here. */
break;
-delete_vote_no:
- lockres->last_upd_seq_num = seq_num;
- /* (6/11/2004): the next two conditional are
- * likely useless relics. If we don't hit
- * those error messages then we can delete
- * them.*/
- if (lockres->master_node_num == OCFS_INVALID_NODE_NUM
- || !master_alive) {
- lockres->master_node_num = node_num;
- LOG_ERROR_STR("Wowzers, how'd I hit this code:"
- " master node is invalid!?!");
- }
- if ((lockres->master_node_num == osb->node_num) &&
- (lockres->lock_type == OCFS_LKM_NLMODE)) {
- LOG_ERROR_STR("Wowzers, how'd I hit this "
- "code!?!");
- }
- break;
-
case READONLY:
LOG_TRACE_STR("READONLY");
OCFS_ASSERT(lockres->readonly_node==osb->node_num ||
@@ -1019,6 +1048,17 @@
break;
}
+ if (!have_io_sem) {
+#ifdef VERBOSE_PROCESS_VOTE
+ printk("process_vote: We haven't got io_sem on"
+ " Lock id (%llu)\n",
+ OCFS_I(inode)->ip_blkno << inode->i_sb->s_blocksize_bits);
+#endif
+ vote_response = FLAG_VOTE_UPDATE_RETRY;
+ status = 0;
+ break;
+ }
+
/* this is currently a readonly cache lock.
* need to communicate to all the nodes in the
* map that lock will be changing to RW before we
@@ -1285,13 +1325,24 @@
ocfs_release_lockres (lockres); // ocfs_process_vote
leave:
+ if (inode && have_io_sem)
+ up_write(&OCFS_I(inode)->ip_io_sem);
+
+ if (atomic_read(&OCFS_I(inode)->ip_needs_verification)
+ && vote_type == UPDATE_OIN_INODE) {
+ down_read(&OCFS_I(inode)->ip_io_sem);
+ tmpstat = ocfs_verify_update_inode(osb, inode, 0);
+ if (tmpstat < 0)
+ LOG_ERROR_STATUS(tmpstat);
+ up_read(&OCFS_I(inode)->ip_io_sem);
+ }
+
if (inode) {
if (inc_inode_seq)
ocfs_inc_inode_seq(osb, inode, 1);
- if (have_io_sem)
- up_write(&OCFS_I(inode)->ip_io_sem);
iput(inode);
}
+
osb->voting_ino = 0;
up(&osb->vote_sem);
More information about the Ocfs2-commits
mailing list