diff mbox

[v3,2/5] remus: resume immediately if libxl__xc_domain_save_done() completes

Message ID 1452235131-1861-3-git-send-email-wency@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wen Congyang Jan. 8, 2016, 6:38 a.m. UTC
For example: if the secondary host is down, and we fail to send the data to
the secondary host. xc_domain_save() returns 0. So in the function
libxl__xc_domain_save_done(), rc is 0(the helper program exits normally),
and retval is 0(it is xc_domain_save()'s return value). In such case, we
just need to complete the stream.

Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
 tools/libxl/libxl_stream_write.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Comments

Andrew Cooper Jan. 8, 2016, 9:52 a.m. UTC | #1
On 08/01/16 06:38, Wen Congyang wrote:
> For example: if the secondary host is down, and we fail to send the data to
> the secondary host. xc_domain_save() returns 0. So in the function
> libxl__xc_domain_save_done(), rc is 0(the helper program exits normally),
> and retval is 0(it is xc_domain_save()'s return value). In such case, we
> just need to complete the stream.
>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Ian Campbell Jan. 8, 2016, 4:27 p.m. UTC | #2
On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
> For example: if the secondary host is down, and we fail to send the data
> to
> the secondary host. xc_domain_save() returns 0.

Just to be check: On failure in this way xc_domain_save() returns 0 (i.e.
success)?

>  So in the function
> libxl__xc_domain_save_done(), rc is 0(the helper program exits normally),
> and retval is 0(it is xc_domain_save()'s return value). In such case, we
> just need to complete the stream.
> 
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
>  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/libxl/libxl_stream_write.c
> b/tools/libxl/libxl_stream_write.c
> index 80d9208..82e7719 100644
> --- a/tools/libxl/libxl_stream_write.c
> +++ b/tools/libxl/libxl_stream_write.c
> @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc *egc,
> void *dss_void,
>       * alive, and check_all_finished() may have torn it down around us.
>       * If the stream is not still alive, we must not continue any work.
>       */
> -    if (libxl__stream_write_inuse(stream))
> -        write_emulator_xenstore_record(egc, stream);
> +    if (libxl__stream_write_inuse(stream)) {
> +        if (dss->remus)
> +            /*
> +             * For remus, if libxl__xc_domain_save_done() completes,
> +             * there was an error sending data to the secondary.
> +             * Resume the primary ASAP.
> +             */
> +            stream_complete(egc, stream, 0);

Is there an indication to the caller that things have failed in this way?
Would that information be of use to the caller?

Or does the called infer this has happened because
otherwise libxl_domain_remus_start is not supposed to return?

> +        else
> +            write_emulator_xenstore_record(egc, stream);
> +    }
>  }
>  
>  static void write_emulator_xenstore_record(libxl__egc *egc,
Wen Congyang Jan. 12, 2016, 1:40 a.m. UTC | #3
On 01/09/2016 12:27 AM, Ian Campbell wrote:
> On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
>> For example: if the secondary host is down, and we fail to send the data
>> to
>> the secondary host. xc_domain_save() returns 0.
> 
> Just to be check: On failure in this way xc_domain_save() returns 0 (i.e.
> success)?

Yes, it returns 0. I am not sure the return value is right.

> 
>>  So in the function
>> libxl__xc_domain_save_done(), rc is 0(the helper program exits normally),
>> and retval is 0(it is xc_domain_save()'s return value). In such case, we
>> just need to complete the stream.
>>
>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>> ---
>>  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_stream_write.c
>> b/tools/libxl/libxl_stream_write.c
>> index 80d9208..82e7719 100644
>> --- a/tools/libxl/libxl_stream_write.c
>> +++ b/tools/libxl/libxl_stream_write.c
>> @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc *egc,
>> void *dss_void,
>>       * alive, and check_all_finished() may have torn it down around us.
>>       * If the stream is not still alive, we must not continue any work.
>>       */
>> -    if (libxl__stream_write_inuse(stream))
>> -        write_emulator_xenstore_record(egc, stream);
>> +    if (libxl__stream_write_inuse(stream)) {
>> +        if (dss->remus)
>> +            /*
>> +             * For remus, if libxl__xc_domain_save_done() completes,
>> +             * there was an error sending data to the secondary.
>> +             * Resume the primary ASAP.
>> +             */
>> +            stream_complete(egc, stream, 0);
> 
> Is there an indication to the caller that things have failed in this way?
> Would that information be of use to the caller?

For remus, when we come here, something is wrong regardless of the return value.

> 
> Or does the called infer this has happened because
> otherwise libxl_domain_remus_start is not supposed to return?

Yes, libxl_domain_remus_start() should not return unless somethins is wrong.

Thanks
Wen Congyang

> 
>> +        else
>> +            write_emulator_xenstore_record(egc, stream);
>> +    }
>>  }
>>  
>>  static void write_emulator_xenstore_record(libxl__egc *egc,
> 
> 
> .
>
Ian Campbell Jan. 14, 2016, 10:21 a.m. UTC | #4
On Tue, 2016-01-12 at 09:40 +0800, Wen Congyang wrote:
> On 01/09/2016 12:27 AM, Ian Campbell wrote:
> > On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
> > > For example: if the secondary host is down, and we fail to send the
> > > data
> > > to
> > > the secondary host. xc_domain_save() returns 0.
> > 
> > Just to be check: On failure in this way xc_domain_save() returns 0
> > (i.e.
> > success)?
> 
> Yes, it returns 0. I am not sure the return value is right.
> 
> > 
> > >  So in the function
> > > libxl__xc_domain_save_done(), rc is 0(the helper program exits
> > > normally),
> > > and retval is 0(it is xc_domain_save()'s return value). In such case,
> > > we
> > > just need to complete the stream.
> > > 
> > > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> > > ---
> > >  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
> > >  1 file changed, 11 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/tools/libxl/libxl_stream_write.c
> > > b/tools/libxl/libxl_stream_write.c
> > > index 80d9208..82e7719 100644
> > > --- a/tools/libxl/libxl_stream_write.c
> > > +++ b/tools/libxl/libxl_stream_write.c
> > > @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc *egc,
> > > void *dss_void,
> > >       * alive, and check_all_finished() may have torn it down around
> > > us.
> > >       * If the stream is not still alive, we must not continue any
> > > work.
> > >       */
> > > -    if (libxl__stream_write_inuse(stream))
> > > -        write_emulator_xenstore_record(egc, stream);
> > > +    if (libxl__stream_write_inuse(stream)) {
> > > +        if (dss->remus)
> > > +            /*
> > > +             * For remus, if libxl__xc_domain_save_done() completes,
> > > +             * there was an error sending data to the secondary.
> > > +             * Resume the primary ASAP.
> > > +             */
> > > +            stream_complete(egc, stream, 0);
> > 
> > Is there an indication to the caller that things have failed in this
> > way?
> > Would that information be of use to the caller?
> 
> For remus, when we come here, something is wrong regardless of the return
> value.

But does the caller know this? Can it tell.

> 
> > 
> > Or does the called infer this has happened because
> > otherwise libxl_domain_remus_start is not supposed to return?
> 
> Yes, libxl_domain_remus_start() should not return unless somethins is
> wrong.

This really ought to be documented somewhere.
Wen Congyang Jan. 15, 2016, 5:44 a.m. UTC | #5
On 01/14/2016 06:21 PM, Ian Campbell wrote:
> On Tue, 2016-01-12 at 09:40 +0800, Wen Congyang wrote:
>> On 01/09/2016 12:27 AM, Ian Campbell wrote:
>>> On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
>>>> For example: if the secondary host is down, and we fail to send the
>>>> data
>>>> to
>>>> the secondary host. xc_domain_save() returns 0.
>>>
>>> Just to be check: On failure in this way xc_domain_save() returns 0
>>> (i.e.
>>> success)?
>>
>> Yes, it returns 0. I am not sure the return value is right.
>>
>>>
>>>>  So in the function
>>>> libxl__xc_domain_save_done(), rc is 0(the helper program exits
>>>> normally),
>>>> and retval is 0(it is xc_domain_save()'s return value). In such case,
>>>> we
>>>> just need to complete the stream.
>>>>
>>>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>>>> ---
>>>>  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
>>>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/tools/libxl/libxl_stream_write.c
>>>> b/tools/libxl/libxl_stream_write.c
>>>> index 80d9208..82e7719 100644
>>>> --- a/tools/libxl/libxl_stream_write.c
>>>> +++ b/tools/libxl/libxl_stream_write.c
>>>> @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc *egc,
>>>> void *dss_void,
>>>>       * alive, and check_all_finished() may have torn it down around
>>>> us.
>>>>       * If the stream is not still alive, we must not continue any
>>>> work.
>>>>       */
>>>> -    if (libxl__stream_write_inuse(stream))
>>>> -        write_emulator_xenstore_record(egc, stream);
>>>> +    if (libxl__stream_write_inuse(stream)) {
>>>> +        if (dss->remus)
>>>> +            /*
>>>> +             * For remus, if libxl__xc_domain_save_done() completes,
>>>> +             * there was an error sending data to the secondary.
>>>> +             * Resume the primary ASAP.
>>>> +             */
>>>> +            stream_complete(egc, stream, 0);
>>>
>>> Is there an indication to the caller that things have failed in this
>>> way?
>>> Would that information be of use to the caller?
>>
>> For remus, when we come here, something is wrong regardless of the return
>> value.
> 
> But does the caller know this? Can it tell.
> 
>>
>>>
>>> Or does the called infer this has happened because
>>> otherwise libxl_domain_remus_start is not supposed to return?
>>
>> Yes, libxl_domain_remus_start() should not return unless somethins is
>> wrong.
> 
> This really ought to be documented somewhere.

libxl_domain_remus_start():
    /* Point of no return */
    libxl__remus_setup(egc, dss);
    return AO_INPROGRESS;

Thanks
Wen Congyang

> 
> 
> 
> 
> .
>
Ian Campbell Jan. 15, 2016, 9:48 a.m. UTC | #6
On Fri, 2016-01-15 at 13:44 +0800, Wen Congyang wrote:
> On 01/14/2016 06:21 PM, Ian Campbell wrote:
> > On Tue, 2016-01-12 at 09:40 +0800, Wen Congyang wrote:
> > > On 01/09/2016 12:27 AM, Ian Campbell wrote:
> > > > On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
> > > > > For example: if the secondary host is down, and we fail to send
> > > > > the
> > > > > data
> > > > > to
> > > > > the secondary host. xc_domain_save() returns 0.
> > > > 
> > > > Just to be check: On failure in this way xc_domain_save() returns 0
> > > > (i.e.
> > > > success)?
> > > 
> > > Yes, it returns 0. I am not sure the return value is right.
> > > 
> > > > 
> > > > >  So in the function
> > > > > libxl__xc_domain_save_done(), rc is 0(the helper program exits
> > > > > normally),
> > > > > and retval is 0(it is xc_domain_save()'s return value). In such
> > > > > case,
> > > > > we
> > > > > just need to complete the stream.
> > > > > 
> > > > > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> > > > > ---
> > > > >  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
> > > > >  1 file changed, 11 insertions(+), 2 deletions(-)
> > > > > 
> > > > > diff --git a/tools/libxl/libxl_stream_write.c
> > > > > b/tools/libxl/libxl_stream_write.c
> > > > > index 80d9208..82e7719 100644
> > > > > --- a/tools/libxl/libxl_stream_write.c
> > > > > +++ b/tools/libxl/libxl_stream_write.c
> > > > > @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc
> > > > > *egc,
> > > > > void *dss_void,
> > > > >       * alive, and check_all_finished() may have torn it down
> > > > > around
> > > > > us.
> > > > >       * If the stream is not still alive, we must not continue
> > > > > any
> > > > > work.
> > > > >       */
> > > > > -    if (libxl__stream_write_inuse(stream))
> > > > > -        write_emulator_xenstore_record(egc, stream);
> > > > > +    if (libxl__stream_write_inuse(stream)) {
> > > > > +        if (dss->remus)
> > > > > +            /*
> > > > > +             * For remus, if libxl__xc_domain_save_done()
> > > > > completes,
> > > > > +             * there was an error sending data to the secondary.
> > > > > +             * Resume the primary ASAP.
> > > > > +             */
> > > > > +            stream_complete(egc, stream, 0);
> > > > 
> > > > Is there an indication to the caller that things have failed in
> > > > this
> > > > way?
> > > > Would that information be of use to the caller?
> > > 
> > > For remus, when we come here, something is wrong regardless of the
> > > return
> > > value.
> > 
> > But does the caller know this? Can it tell.
> > 
> > > 
> > > > 
> > > > Or does the called infer this has happened because
> > > > otherwise libxl_domain_remus_start is not supposed to return?
> > > 
> > > Yes, libxl_domain_remus_start() should not return unless somethins is
> > > wrong.
> > 
> > This really ought to be documented somewhere.
> 
> libxl_domain_remus_start():
>     /* Point of no return */
>     libxl__remus_setup(egc, dss);
>     return AO_INPROGRESS;

This is (obviously) not documentation.
Wen Congyang Jan. 15, 2016, 9:54 a.m. UTC | #7
On 01/15/2016 05:48 PM, Ian Campbell wrote:
> On Fri, 2016-01-15 at 13:44 +0800, Wen Congyang wrote:
>> On 01/14/2016 06:21 PM, Ian Campbell wrote:
>>> On Tue, 2016-01-12 at 09:40 +0800, Wen Congyang wrote:
>>>> On 01/09/2016 12:27 AM, Ian Campbell wrote:
>>>>> On Fri, 2016-01-08 at 14:38 +0800, Wen Congyang wrote:
>>>>>> For example: if the secondary host is down, and we fail to send
>>>>>> the
>>>>>> data
>>>>>> to
>>>>>> the secondary host. xc_domain_save() returns 0.
>>>>>
>>>>> Just to be check: On failure in this way xc_domain_save() returns 0
>>>>> (i.e.
>>>>> success)?
>>>>
>>>> Yes, it returns 0. I am not sure the return value is right.
>>>>
>>>>>
>>>>>>  So in the function
>>>>>> libxl__xc_domain_save_done(), rc is 0(the helper program exits
>>>>>> normally),
>>>>>> and retval is 0(it is xc_domain_save()'s return value). In such
>>>>>> case,
>>>>>> we
>>>>>> just need to complete the stream.
>>>>>>
>>>>>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>>>>>> ---
>>>>>>  tools/libxl/libxl_stream_write.c | 13 +++++++++++--
>>>>>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/tools/libxl/libxl_stream_write.c
>>>>>> b/tools/libxl/libxl_stream_write.c
>>>>>> index 80d9208..82e7719 100644
>>>>>> --- a/tools/libxl/libxl_stream_write.c
>>>>>> +++ b/tools/libxl/libxl_stream_write.c
>>>>>> @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc
>>>>>> *egc,
>>>>>> void *dss_void,
>>>>>>       * alive, and check_all_finished() may have torn it down
>>>>>> around
>>>>>> us.
>>>>>>       * If the stream is not still alive, we must not continue
>>>>>> any
>>>>>> work.
>>>>>>       */
>>>>>> -    if (libxl__stream_write_inuse(stream))
>>>>>> -        write_emulator_xenstore_record(egc, stream);
>>>>>> +    if (libxl__stream_write_inuse(stream)) {
>>>>>> +        if (dss->remus)
>>>>>> +            /*
>>>>>> +             * For remus, if libxl__xc_domain_save_done()
>>>>>> completes,
>>>>>> +             * there was an error sending data to the secondary.
>>>>>> +             * Resume the primary ASAP.
>>>>>> +             */
>>>>>> +            stream_complete(egc, stream, 0);
>>>>>
>>>>> Is there an indication to the caller that things have failed in
>>>>> this
>>>>> way?
>>>>> Would that information be of use to the caller?
>>>>
>>>> For remus, when we come here, something is wrong regardless of the
>>>> return
>>>> value.
>>>
>>> But does the caller know this? Can it tell.
>>>
>>>>
>>>>>
>>>>> Or does the called infer this has happened because
>>>>> otherwise libxl_domain_remus_start is not supposed to return?
>>>>
>>>> Yes, libxl_domain_remus_start() should not return unless somethins is
>>>> wrong.
>>>
>>> This really ought to be documented somewhere.
>>
>> libxl_domain_remus_start():
>>     /* Point of no return */
>>     libxl__remus_setup(egc, dss);
>>     return AO_INPROGRESS;
> 
> This is (obviously) not documentation.

OK, I will update the comment.

Thanks
Wen Congyang

> 
> 
> 
> .
>
Yang Hongyang Jan. 26, 2016, 6:41 a.m. UTC | #8
On 01/08/2016 02:38 PM, Wen Congyang wrote:
> For example: if the secondary host is down, and we fail to send the data to
> the secondary host. xc_domain_save() returns 0. So in the function
> libxl__xc_domain_save_done(), rc is 0(the helper program exits normally),
> and retval is 0(it is xc_domain_save()'s return value). In such case, we
> just need to complete the stream.
>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
>   tools/libxl/libxl_stream_write.c | 13 +++++++++++--
>   1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/tools/libxl/libxl_stream_write.c b/tools/libxl/libxl_stream_write.c
> index 80d9208..82e7719 100644
> --- a/tools/libxl/libxl_stream_write.c
> +++ b/tools/libxl/libxl_stream_write.c
> @@ -354,8 +354,17 @@ void libxl__xc_domain_save_done(libxl__egc *egc, void *dss_void,
>        * alive, and check_all_finished() may have torn it down around us.
>        * If the stream is not still alive, we must not continue any work.
>        */
> -    if (libxl__stream_write_inuse(stream))
> -        write_emulator_xenstore_record(egc, stream);
> +    if (libxl__stream_write_inuse(stream)) {
> +        if (dss->remus)
> +            /*
> +             * For remus, if libxl__xc_domain_save_done() completes,

xc_domain_save() completes.

> +             * there was an error sending data to the secondary.
> +             * Resume the primary ASAP.
> +             */
> +            stream_complete(egc, stream, 0);
> +        else
> +            write_emulator_xenstore_record(egc, stream);
> +    }
>   }
>
>   static void write_emulator_xenstore_record(libxl__egc *egc,
>
diff mbox

Patch

diff --git a/tools/libxl/libxl_stream_write.c b/tools/libxl/libxl_stream_write.c
index 80d9208..82e7719 100644
--- a/tools/libxl/libxl_stream_write.c
+++ b/tools/libxl/libxl_stream_write.c
@@ -354,8 +354,17 @@  void libxl__xc_domain_save_done(libxl__egc *egc, void *dss_void,
      * alive, and check_all_finished() may have torn it down around us.
      * If the stream is not still alive, we must not continue any work.
      */
-    if (libxl__stream_write_inuse(stream))
-        write_emulator_xenstore_record(egc, stream);
+    if (libxl__stream_write_inuse(stream)) {
+        if (dss->remus)
+            /*
+             * For remus, if libxl__xc_domain_save_done() completes,
+             * there was an error sending data to the secondary.
+             * Resume the primary ASAP.
+             */
+            stream_complete(egc, stream, 0);
+        else
+            write_emulator_xenstore_record(egc, stream);
+    }
 }
 
 static void write_emulator_xenstore_record(libxl__egc *egc,