[dm-devel] curious why waitevent sets event_nr field of event _thread struct every time

goggin, edward egoggin at emc.com
Tue Apr 5 16:56:07 UTC 2005


On Wed, 30 Mar 2005 00:31:11 +0200
christophe varoqui <christophe.varoqui at free.fr> wrote
> Have you tried your suggested design ?
> Is there a regression at first glance ?

I've tried it.  The code only blindly sets the event_nr from
the kernel the first time through.  Otherwise, if the kernel's copy
and the pthread's copy are different the code (1) logs a msg,
(2) sets the pthread copy from the kernel copy, and (3) goes to a
new label "out2" to fail the paths and invoke multipath.

I ran three to four times and saw log messages indicating that
several events had the potential of being lost.  Overall, while
this seems to be the right thing to do -- proving that events
would actually be lost is a different thing all together.  I did
not even attempt to do that.

I've included below a patch for multipathd/main.c based on version
0.4.4-pre7 of multipath-tools.
-----------------------------------------------------------------
*** multipath-tools-0.4.4-pre7/multipathd/main.c.orig	2005-04-05
04:46:30.000000000 -0400
--- multipath-tools-0.4.4-pre7/multipathd/main.c	2005-04-05
04:51:03.000000000 -0400
***************
*** 88,93 ****
--- 88,94 ----
  	int event_nr;
  	char mapname[WWID_SIZE];
  	struct paths *allpaths;
+ 	int firstTime;
  };
  
  /*
***************
*** 245,250 ****
--- 246,252 ----
  	char buff[1];
  	char cmd[CMDSIZE];
  	struct dm_task *dmt;
+ 	int event_nr;
  
  	mlockall(MCL_CURRENT | MCL_FUTURE);
  	waiter = (struct event_thread *)et;
***************
*** 256,262 ****
  	}
  	pthread_mutex_lock (waiter->waiter_lock);
  
! 	waiter->event_nr = dm_geteventnr (waiter->mapname);
  	log_safe(LOG_DEBUG, "waiter->event_nr = %i", waiter->event_nr);
  
  	if (!(dmt = dm_task_create(DM_DEVICE_WAITEVENT)))
--- 258,274 ----
  	}
  	pthread_mutex_lock (waiter->waiter_lock);
  
! 	event_nr = dm_geteventnr (waiter->mapname);
! 	if (waiter->firstTime) {
! 		waiter->event_nr = event_nr;
! 		waiter->firstTime = 0;
! 	}
! 	else if (waiter->event_nr != event_nr) {
! 		log_safe(LOG_NOTICE, "event_nr = %i, waiter->event_nr = %i:
avoiding 0x%x lost events on map %s", event_nr, waiter->event_nr, event_nr -
waiter->event_nr, waiter->mapname);
! 		waiter->event_nr = event_nr;
! 		goto out2;
! 	}
! 	//waiter->event_nr = dm_geteventnr (waiter->mapname);
  	log_safe(LOG_DEBUG, "waiter->event_nr = %i", waiter->event_nr);
  
  	if (!(dmt = dm_task_create(DM_DEVICE_WAITEVENT)))
***************
*** 274,280 ****
  
  out:
  	dm_task_destroy(dmt);
! 
  	log_safe(LOG_DEBUG, "%s", cmd);
  	log_safe(LOG_NOTICE, "devmap event on %s", waiter->mapname);
  	mark_failed_path(waiter->allpaths, waiter->mapname);
--- 286,292 ----
  
  out:
  	dm_task_destroy(dmt);
! out2:
  	log_safe(LOG_DEBUG, "%s", cmd);
  	log_safe(LOG_NOTICE, "devmap event on %s", waiter->mapname);
  	mark_failed_path(waiter->allpaths, waiter->mapname);
***************
*** 379,384 ****
--- 391,397 ----
  					MALLOC (sizeof (pthread_mutex_t));
  				pthread_mutex_init (wp->waiter_lock, NULL);
  				wp->allpaths = allpaths;
+ 				wp->firstTime = 1;
  				vector_alloc_slot (waiters);
  				vector_set_slot (waiters, wp);
  			}




More information about the dm-devel mailing list