On 1/30/19 8:58 AM, Vladimir Sementsov-Ogievskiy wrote:
> Hi!
> 
> I have a question about job_pause_point. Now a good job of moving generic 
> things about
> block-jobs to job.c is done..
> 
> job_pause_point do visible job-state change, as changing job->status and 
> job->paused.
> 
> Is it assumed, that job don't do anything after that state change? Iotests 
> are written
> exactly with this assumption. On the other hand, code don't guarantee, that 
> all in-flight
> requests are finished to this point.
> 

Oh, right. The job being paused only certifies that the coroutine
driving the job isn't running. It has no real idea about mirror's
asynchronous children.

> Moreover, only the job itself knows about it's in-flight requests, therefore 
> we can't
> handle it in generic job_pause_point(). So, should not job do something like
> 
> if (job_should_pause()) {
>     don't create more requests
>     wait all in-flight requests to complete
> }
> job_pause_point()
> 
> Or didn't I miss these things already discussed?
> 

Well, mirror's pause callback does this:

static void coroutine_fn mirror_pause(Job *job)
{
    MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);

    mirror_wait_for_all_io(s);
}

That's invoked BEFORE we change our status. That ought to be sufficient,
is it not?

--js

Reply via email to