[dm-devel] dm-flakey NOT to return -EIO on READ?

Lukas Herbolt lherbolt at redhat.com
Fri Jul 29 14:31:57 UTC 2016


 - http://people.redhat.com/~lherbolt/dm-flakey/v4.7-dm_flakey.tar.gz

Lukas

On Fri, Jul 29, 2016 at 8:32 AM, Akira Hayakawa <ruby.wktk at gmail.com> wrote:

> Hi Lukas,
>
> > I have patch ready, would you be able to test it before posting it.
> >
> > Let me know if I should build the kernel for you or just share the source
> > with you.
>
> OK.
> Please share the git tree and specify the branch to test.
>
> Akira
>
> On 2016/07/29 15:25, Lukas Herbolt wrote:
> > Hi Akira,
> > Sorry I was on holiday.
> > I have patch ready, would you be able to test it before posting it.
> >
> > Let me know if I should build the kernel for you or just share the source
> > with you.
> >
> > Lukas
> >
> > On Sun, Jul 17, 2016 at 3:36 AM, Akira Hayakawa <ruby.wktk at gmail.com>
> wrote:
> >
> >>> On 2016/07/06 18:52, Lukas Herbolt wrote:
> >>>> Hi,
> >>>> Yes this part is wrong and reads are not dropped.
> >>>> I have a patch ready, just have to send it out.
> >>
> >> btw, is this fix going to be included in the next release?
> >>
> >> On 2016/07/06 21:54, Akira Hayakawa wrote:
> >>> Thanks,
> >>>
> >>> I want the patch in the main-tree quickly.
> >>> Because without it, my tests will not be green.
> >>> This is really annoying.
> >>>
> >>> I made a quick reproducer of this problem.
> >>> If you are looking for one, this will help.
> >>> (You need to install sbt first)
> >>>
> >>> https://github.com/akiradeveloper/writeboost-test-suite
> >>>
> >>>   test("flakey (read)") {
> >>>     Memory(Sector.M(16)) { a =>
> >>>       Flakey.Table(a, 0, 1).create { b =>
> >>>         intercept[Exception] {
> >>>           Shell(s"dd status=none if=${b.bdev.path} iflag=direct
> >> of=/dev/null")
> >>>         }
> >>>       }
> >>>     }
> >>>   }
> >>>
> >>> $ sudo sbt "testOnly dmtest.FlakeyTest"
> >>> 12:44:00.643 [pool-2-thread-3-ScalaTest-running-FlakeyTest] INFO dmtest
> >> - [TEST] flakey (read)
> >>> 12:44:00.752 [pool-2-thread-3-ScalaTest-running-FlakeyTest] DEBUG
> dmtest
> >> - reload: table=0 32768 flakey /dev/loop0 0 0 1
> >>> [info] FlakeyTest:
> >>> [info] - flakey (read) *** FAILED ***
> >>> [info]   Expected exception java.lang.Exception to be thrown, but no
> >> exception was thrown. (FlakeyTest.scala:9)
> >>> [info] Run completed in 2 seconds, 781 milliseconds.
> >>> [info] Total number of tests run: 1
> >>> [info] Suites: completed 1, aborted 0
> >>> [info] Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0
> >>>
> >>> - Akira
> >>>
> >>> On 2016/07/06 18:52, Lukas Herbolt wrote:
> >>>> Hi,
> >>>> Yes this part is wrong and reads are not dropped.
> >>>> I have a patch ready, just have to send it out.
> >>>>
> >>>> Lukas
> >>>>
> >>>> On Wed, Jul 6, 2016 at 8:33 AM, Akira Hayakawa <ruby.wktk at gmail.com>
> >> wrote:
> >>>>
> >>>>> Hi,
> >>>>>
> >>>>> I am using dm-flakey to emulate a broken device that should return
> >> -EIO on
> >>>>> both read and write.
> >>>>> I use the parameter up_interval=0 and down_interval=1.
> >>>>>
> >>>>> But when I am dd-ing the flakey device, while write fails, read
> >> succeeds.
> >>>>> This isn't the behavior I expect.
> >>>>>
> >>>>> Then I looked into the code.
> >>>>>
> >>>>> 326 static int flakey_end_io(struct dm_target *ti, struct bio *bio,
> int
> >>>>> error)
> >>>>> 327 {
> >>>>> 328         struct flakey_c *fc = ti->private;
> >>>>> 329         struct per_bio_data *pb = dm_per_bio_data(bio,
> >> sizeof(struct
> >>>>> per_bio_data));
> >>>>> 330
> >>>>> 331         /*
> >>>>> 332          * Corrupt successful READs while in down state.
> >>>>> 333          * If flags were specified, only corrupt those that
> match.
> >>>>> 334          */
> >>>>> 335         if (fc->corrupt_bio_byte && !error && pb->bio_submitted
> &&
> >>>>> 336             (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw ==
> >>>>> READ) &&
> >>>>> 337             all_corrupt_bio_flags_match(bio, fc))
> >>>>> 338                 corrupt_bio_data(bio, fc);
> >>>>> 339
> >>>>> 340         return error;
> >>>>> 341 }
> >>>>>
> >>>>> When the bio direction is READ and currupt_bio_bytes isn't specified
> >>>>> the READ bio is handled normally right?
> >>>>>
> >>>>> I think READ requests should return -EIO if
> >>>>>
> >>>>> 1. corrupt_bio_bytes isn't specified
> >>>>> 2. but the requested is handled during down interval.
> >>>>>
> >>>>> as well as WRITE requests:
> >>>>>
> >>>>> 305                 /*
> >>>>> 306                  * Corrupt matching writes.
> >>>>> 307                  */
> >>>>> 308                 if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw
> ==
> >>>>> WRITE)) {
> >>>>> 309                         if (all_corrupt_bio_flags_match(bio, fc))
> >>>>> 310                                 corrupt_bio_data(bio, fc);
> >>>>> 311                         goto map_bio;
> >>>>> 312                 }
> >>>>> 313
> >>>>> 314                 /*
> >>>>> 315                  * By default, error all I/O.
> >>>>> 316                  */
> >>>>> 317                 return -EIO;
> >>>>> 318         }
> >>>>>
> >>>>> This code is similar to what we see in the end_io.
> >>>>>
> >>>>> If my understanding is correct, I would like to modify dm-flakey to
> >> return
> >>>>> -EIO in the end_io.
> >>>>>
> >>>>> I would like to request for comments.
> >>>>>
> >>>>> Thanks,
> >>>>>
> >>>>> - Akira
> >>>>>
> >>>>> --
> >>>>> dm-devel mailing list
> >>>>> dm-devel at redhat.com
> >>>>> https://www.redhat.com/mailman/listinfo/dm-devel
> >>>>>
> >>>>
> >>>>
> >>>>
> >>
> >
> >
> >
>



-- 
Lukas Herbolt
RHCE, RH436, BSc, SSc
Senior Technical Support Engineer
Global Support Services (GSS)
Email:    lherbolt at redhat.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20160729/b0345bc4/attachment.htm>


More information about the dm-devel mailing list