[dm-devel] curious why waitevent sets event_nr field of event _thread struct every time
Christophe Varoqui
christophe.varoqui at free.fr
Wed Apr 6 09:58:04 UTC 2005
I applied something like that to pre9
Thanks.
On Tue, Apr 05, 2005 at 12:56:07PM -0400, goggin, edward wrote:
> 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