[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[dm-devel] Some questions in dm-riad1.c

Dear all :

I have some(or lots, more precisely) questions when tracing the mirror code!

file : dm-raid.c
function : mirror_map


Dose there any better solution to test the performance of the device-mapper core
and all target type module ?


2. ===================================

First is the kcopyd necessary in dm-mirror (in previous mail)?
Because dm-mirror will submit each writing bio to all mirror block devices.
It seems kcopyd does not have any works to do in mirror_map().

More precisely :

In log ctr, all region will be logged as non-sync(core-log) or
previous setting(disk-log).
When starting mirror, mirror daemon will recovery these non-sync
region by invoking kcopyd daemon
accroding to the dirty log object. But after these regions are all in
synchronous.... kcopyd has nothing to do... Is that right ?

Here are some problems that confuses me for a log time...

1. The only work of kcopyd is only available in configure time  (after
log->ctr, since all in-sync bits are set to 0, whatever core-log or
disk-log) ?
   On the other hand, Does kcopyd work nothing after the mirror
configure time ?
1-1. We have to re-sync all regions after re-booting if we use core-log ?
1-2. Even for disk-log...... kcopyd wroks only in configure time
(first time to construct a disk log) ?

2. There seems a lack for dm-mirror interface (dm-raid1.c)
   to set/clear the sync state for a region.

Under what other conditions the kcopyd will work ?

Whould we implement as following :
s1. write bio to default mirror device.
s2. set the corresponding region to non-sync state
s3. invoke kcopyd to recovery this region to all mirror devices (set
the region in recovering.)
s4. kcopyd callback function set the region in-sync.

Is this better ? Any issue (like read/write race in default mirror device) ?
In my option, it would make the use of kcopyd more, and determine the
region state
(in-sync, non-sync) more precisely...
But any racing condition occurs (read/write race...etc)?


In mirror_map function

3. =====================
       r = ms->rh.log->type->in_sync(ms->rh.log,
                                     bio_to_region(&ms->rh, bio), 0);

         *   *********** HERE ***********
         *   When does the in_sync() return  < 1  ?
         *   It is strange here since in_sync(core_in_sync) return
         *   either 0(non-sync) or 1(in-sync).
       if (r < 0 && r != -EWOULDBLOCK)
               return r;

       /* Simply return -EIO ? */
       if (r == -EWOULDBLOCK)  /* FIXME: ugly */
               r = DM_MAPIO_SUBMITTED;

        * We don't want to fast track a recovery just for a read
        * ahead.  So we just let it silently fail.
        * FIXME: get rid of this.
       if (!r && rw == READA)
               return -EIO;

4.  =============================================

         *    *********** HERE ***********
         *    What followed seems duplicate in do_read().
         *    Why not implemented as follows as simple:
         *    queue_bio(ms, bio, rw);
          *    return DM_MAPIO_SUBMITTED;
         *    and let daemon to process reading ? Any performance issue ?
       if (!r) {
               /* Pass this io over to the daemon */
               queue_bio(ms, bio, rw);
               return DM_MAPIO_SUBMITTED;

       m = choose_mirror(ms, bio->bi_sector);
       if (!m)
               return -EIO;

       map_bio(ms, m, bio);
       return DM_MAPIO_REMAPPED;



By Penguin, Kaohsiung, Taiwan.

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]