[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