--Apple-Mail=_4D0244E4-4D4A-48DB-B16B-BE856667DA7B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=utf-8
On 4 Apr 2017, at 12:21, Roy Golan <rgolan(a)redhat.com> wrote:
=20
=20
=20
On Tue, Apr 4, 2017 at 1:16 PM Michal Skrivanek =
<michal.skrivanek(a)redhat.com
<mailto:michal.skrivanek@redhat.com>> =
wrote:
> On 4 Apr 2017, at 12:10, Roy Golan <rgolan(a)redhat.com =
<mailto:rgolan@redhat.com>> wrote:
>=20
>=20
>=20
> On Tue, Apr 4, 2017 at 12:49 PM Yaniv Kaul <ykaul(a)redhat.com =
<mailto:ykaul@redhat.com>> wrote:
> On Tue, Apr 4, 2017 at 12:29 PM, Roy Golan <rgolan(a)redhat.com
=
<mailto:rgolan@redhat.com>> wrote:
> I'm working on a POC lately on a change to stats collection
and =
retrieval by VDSM. The moto is to cut all we can from host/vm stats =
(possibly caps) and report only core-business stuff to the engine. =
Engine will retrieve the rest through a 3rd party provider
> (nevermind what is it atm)
=20
I hope it=E2=80=99s the same one as for VM stats, collectd:)
=20
Intended for this as well.=20
great!
=20
>=20
> Being backward compatible by design, I have to support 2 API versions =
for
Host.getStats , '4.1' and '4.2'.
> Except from supplying less parameters, I want VDSM to do less
stuff. =
It doesn't need to sample what it doesn't report. In other words I
want =
'4.1-sampling' and '4.2-sampling'
>=20
> # Introducing 'configuration' Verb:
>=20
> As engine knows always(Hosted Engine as well) what cluster version =
this host
belongs to, it can configure VDSM to operate in cluster =
version mode.
=20
why not running it in parallel for one version?
=20
What is the benefit? =20
just so you do not need any configuration verb nor persistence, not much =
else.
>=20
> Host.configure(config=3D{version: 4.2}
>=20
> Consider this verb, pre-activating using 'Host.getCaps' to set the =
context.
> It will set the righjt sampling method, and other stuff if needed
=
then API endpoints will have the right permutation of the api to answer =
it.
>=20
> 4.2 host can operate in 4.1 mode:
> Host.configure(config=3D{version: 4.1}
>=20
> Issue: moving a 4.2 host from 4.2 cluster to 4.1 is a problem since =
engine
needs to know this is a new vdsm that has the verb available. One =
way to overcome that is to fire the verb for every host regardless of =
the version and disregard an error that implies the verb doesn't exist.
>=20
> Isn't it solved by host re-installation?
>=20
> We allow maintenance + change host cluster so not always. Was this =
changed?=20
>=20
>=20
> # Engine:
> Engine will have a handling of the verb per version.
> Host/Vms monitoring should be changed - I suggest to move out of the =
monitoring code the whole stats collection as it is a different task =
which is orthogonal to 'monitoring' and in 4.2 more than before.
>=20
>=20
> I know configuration for VDSM has been discussed before and there are =
probably tons of ways to do it. When you share your thoughts please =
remember that configuration is a by-product of the effort.
>=20
> How do we persist this level on VDSM? Or we don't, and if VDSM is =
restarted it is again back to 4.1 mode until Engine tells it otherwise?
> Y.
>=20
> Must persist it somehow otherwise there is a race when the engine =
will send
send a stats request and will get the wrong answer. I'm =
wondering if using differnt endpoints is the right solution here to =
prevent that from happening.=20
> method: Host.getStats version: 4.1=20
=20
would it be a problem? assuming that the code is easily =
started/stopped within
vdsm, we can just change the behavior based on =
receiving one or the other verb for the first time after vdsm starts
=20
But we should prefer a deliberate action. Doing that as a side effect =
is
surprising for an API verb. What would happen in case you invoke =
'vdsm-client=E2=80=99 ?
I do not mean to switch for any client, more like a single =E2=80=9Cupgrad=
e=E2=80=9D of communication once the new verb is called. So once the =
engine calls the new verb the legacy stats thread is stopped and =
vdsClient <oldVerb> stops returning meaningful data.
Actually, moving host back to older cluster doesn=E2=80=99t really need =
switching back either - you still have the new engine capable of =
handling the new verb despite older cluster.
=20
=20
Thanks,
michal
=20
> =20
>=20
> =20
> Nevertheless it can be potentially beneficial to more functions in =
vdsm.
>=20
> Thanks,
> Roy
>=20
>=20
> _______________________________________________
> Devel mailing list
> Devel(a)ovirt.org <mailto:Devel@ovirt.org>
>
http://lists.ovirt.org/mailman/listinfo/devel =
<
http://lists.ovirt.org/mailman/listinfo/devel>
>=20
> _______________________________________________
> Devel mailing list
> Devel(a)ovirt.org <mailto:Devel@ovirt.org>
>
http://lists.ovirt.org/mailman/listinfo/devel =
<
http://lists.ovirt.org/mailman/listinfo/devel>
--Apple-Mail=_4D0244E4-4D4A-48DB-B16B-BE856667DA7B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=utf-8
<html><head><meta http-equiv=3D"Content-Type"
content=3D"text/html =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" =
class=3D""><br class=3D""><div><blockquote
type=3D"cite" class=3D""><div =
class=3D"">On 4 Apr 2017, at 12:21, Roy Golan <<a =
href=3D"mailto:rgolan@redhat.com"
class=3D"">rgolan(a)redhat.com</a>&gt; =
wrote:</div><br class=3D"Apple-interchange-newline"><div
class=3D""><div =
dir=3D"ltr" class=3D""><br class=3D""><br
class=3D""><div =
class=3D"gmail_quote"><div dir=3D"ltr"
class=3D"">On Tue, Apr 4, 2017 at =
1:16 PM Michal Skrivanek <<a =
href=3D"mailto:michal.skrivanek@redhat.com" =
class=3D"">michal.skrivanek(a)redhat.com</a>&gt; wrote:<br =
class=3D""></div><blockquote class=3D"gmail_quote"
style=3D"margin:0 0 0 =
.8ex;border-left:1px #ccc solid;padding-left:1ex"><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg"><blockquote type=3D"cite"
class=3D"gmail_msg"><div =
class=3D"gmail_msg">On 4 Apr 2017, at 12:10, Roy Golan <<a =
href=3D"mailto:rgolan@redhat.com" class=3D"gmail_msg" =
target=3D"_blank">rgolan(a)redhat.com</a>&gt;
wrote:</div><br =
class=3D"m_-4059592897398397391Apple-interchange-newline gmail_msg"><div
=
class=3D"gmail_msg"><div dir=3D"ltr"
class=3D"gmail_msg"><br =
class=3D"gmail_msg"><br class=3D"gmail_msg"><div
class=3D"gmail_quote =
gmail_msg"><div dir=3D"ltr" class=3D"gmail_msg">On Tue,
Apr 4, 2017 at =
12:49 PM Yaniv Kaul <<a href=3D"mailto:ykaul@redhat.com" =
class=3D"gmail_msg"
target=3D"_blank">ykaul(a)redhat.com</a>&gt; wrote:<br =
class=3D"gmail_msg"></div><blockquote class=3D"gmail_quote
gmail_msg" =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote
gmail_msg">On =
Tue, Apr 4, 2017 at 12:29 PM, Roy Golan <span dir=3D"ltr" =
class=3D"gmail_msg"><<a href=3D"mailto:rgolan@redhat.com"
=
class=3D"gmail_msg"
target=3D"_blank">rgolan(a)redhat.com</a>&gt;</span> =
wrote:<br class=3D"gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_msg">I'm working on a POC lately on a change to stats =
collection and retrieval by VDSM. The moto is to cut all we can from =
host/vm stats (possibly caps) and report only core-business stuff to the =
engine. Engine will retrieve the rest through a 3rd party =
provider</div></div></blockquote></div></div></div></blockquote></div></di=
v></div></blockquote><blockquote type=3D"cite"
class=3D"gmail_msg"><div =
class=3D"gmail_msg"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><blockquote class=3D"gmail_quote gmail_msg"
style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_msg">(nevermind what
is it =
atm)<br =
class=3D"gmail_msg"></div></div></blockquote></div></div></div></blockquot=
e></div></div></div></blockquote><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></div><div
style=3D"word-wrap:break-word" =
class=3D"gmail_msg"><div class=3D"gmail_msg">I hope
it=E2=80=99s the =
same one as for VM stats, collectd:)</div></div></blockquote><div =
class=3D""><br class=3D"">Intended for this as well. <br
=
class=3D""></div></div></div></div></blockquote><div><br
=
class=3D""></div>great!</div><div><br
class=3D""><blockquote type=3D"cite"=
class=3D""><div class=3D""><div dir=3D"ltr"
class=3D""><div =
class=3D"gmail_quote"><blockquote class=3D"gmail_quote"
style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg"></div></div><div
style=3D"word-wrap:break-word" =
class=3D"gmail_msg"><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"><blockquote type=3D"cite"
class=3D"gmail_msg"><div =
class=3D"gmail_msg"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><blockquote class=3D"gmail_quote gmail_msg"
style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div
class=3D"gmail_msg">Being backward =
compatible by design, I have to support 2 API versions for Host.getStats =
, '4.1' and '4.2'.<br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Except from supplying less parameters, I want VDSM =
to do less stuff. It doesn't need to sample what it doesn't report. In =
other words I want '4.1-sampling' and '4.2-sampling'<br =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg"># Introducing 'configuration' Verb:<br =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">As engine knows always(Hosted Engine as well) what =
cluster version this host belongs to, it can configure VDSM to operate =
in cluster version mode.<br =
class=3D"gmail_msg"></div></div></blockquote></div></div></div></blockquot=
e></div></div></div></blockquote><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></div><div
style=3D"word-wrap:break-word" =
class=3D"gmail_msg"><div class=3D"gmail_msg">why not running
it in =
parallel for one version?</div><div
class=3D"gmail_msg"></div></div><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div></div></blockquote><div =
class=3D"">What is the benefit? <br =
class=3D""></div></div></div></div></blockquote><div><br
=
class=3D""></div>just so you do not need any configuration verb nor =
persistence, not much else.</div><div><br
class=3D""><blockquote =
type=3D"cite" class=3D""><div class=3D""><div
dir=3D"ltr" class=3D""><div =
class=3D"gmail_quote"><blockquote class=3D"gmail_quote"
style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg"><blockquote type=3D"cite"
class=3D"gmail_msg"><div =
class=3D"gmail_msg"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><blockquote class=3D"gmail_quote gmail_msg"
style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"> Host.configure(config=3D{version: 4.2}<br
=
class=3D"gmail_msg"></div><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div
class=3D"gmail_msg">Consider this verb, =
pre-activating using 'Host.getCaps' to set the context.<br =
class=3D"gmail_msg">It will set the righjt sampling method, and other =
stuff if needed then API endpoints will have the right permutation of =
the api to answer it.<br class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div class=3D"gmail_msg">4.2
host can operate =
in 4.1 mode:<br class=3D"gmail_msg"> =
Host.configure(config=3D{version: 4.1}<br class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div
class=3D"gmail_msg">Issue: moving a 4.2 =
host from 4.2 cluster to 4.1 is a problem since engine needs to know =
this is a new vdsm that has the verb available. One way to overcome that =
is to fire the verb for every host regardless of the version and =
disregard an error that implies the verb doesn't exist.<br =
class=3D"gmail_msg"></div></div></blockquote><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></div></div><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_extra
gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><div
class=3D"gmail_msg">Isn't it solved =
by host
re-installation?</div></div></div></div></blockquote><div
=
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">We allow maintenance + change host cluster so =
not always. Was this changed? <br
class=3D"gmail_msg"></div><blockquote =
class=3D"gmail_quote gmail_msg" style=3D"margin:0 0 0 =
.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_extra
gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><blockquote class=3D"gmail_quote
gmail_msg" =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg"># Engine:<br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Engine will have a handling of the verb per =
version.<br class=3D"gmail_msg"></div><div
class=3D"gmail_msg">Host/Vms =
monitoring should be changed - I suggest to move out of the monitoring =
code the whole stats collection as it is a different task which is =
orthogonal to 'monitoring' and in 4.2 more than before.<br =
class=3D"gmail_msg"><br class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div class=3D"gmail_msg">I
know configuration =
for VDSM has been discussed before and there are probably tons of ways =
to do it. When you share your thoughts please remember that =
configuration is a by-product of the effort.<br =
class=3D"gmail_msg"></div></div></blockquote><div
class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div></div></div></div><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_extra
gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><div class=3D"gmail_msg">How
do we =
persist this level on VDSM? Or we don't, and if VDSM is restarted it is =
again back to 4.1 mode until Engine tells it =
otherwise?</div></div></div></div></blockquote></div></div></div></blockqu=
ote><blockquote type=3D"cite" class=3D"gmail_msg"><div =
class=3D"gmail_msg"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><div =
class=3D"gmail_msg">Y.</div></div></div></div></blockquote><div
=
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Must persist it somehow otherwise there is a race =
when the engine will send send a stats request and will get the wrong =
answer. I'm wondering if using differnt endpoints is the right =
solution here to prevent that from happening. <br =
class=3D"gmail_msg"></div><div
class=3D"gmail_msg"> method: =
Host.getStats version: 4.1 <br =
class=3D"gmail_msg"></div></div></div></div></blockquote><div
=
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div></div></div><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg">would it be a problem? assuming that the code is =
easily started/stopped within vdsm, we can just change the behavior =
based on receiving one or the other verb for the first time after vdsm =
starts</div></div></blockquote><div class=3D""><br
class=3D""></div><div =
class=3D"">But we should prefer a deliberate action. Doing that as a =
side effect is surprising for an API verb. What would happen in case you =
invoke 'vdsm-client=E2=80=99 ?<br =
class=3D""></div></div></div></div></blockquote><div><br
=
class=3D""></div>I do not mean to switch for any client, more like a =
single =E2=80=9Cupgrade=E2=80=9D of communication once the new verb is =
called. So once the engine calls the new verb the legacy stats thread is =
stopped and vdsClient <oldVerb> stops returning meaningful =
data.</div><div>Actually, moving host back to older cluster doesn=E2=80=99=
t really need switching back either - you still have the new engine =
capable of handling the new verb despite older cluster.</div><div><br =
class=3D""></div><div><br
class=3D""><blockquote type=3D"cite" =
class=3D""><div class=3D""><div dir=3D"ltr"
class=3D""><div =
class=3D"gmail_quote"><div class=3D""> <br =
class=3D""></div><blockquote class=3D"gmail_quote"
style=3D"margin:0 0 0 =
.8ex;border-left:1px #ccc solid;padding-left:1ex"><div =
style=3D"word-wrap:break-word" class=3D"gmail_msg"><div =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Thanks,</div><div =
class=3D"gmail_msg">michal</div></div><div
style=3D"word-wrap:break-word" =
class=3D"gmail_msg"><div class=3D"gmail_msg"><br =
class=3D"gmail_msg"></div><div
class=3D"gmail_msg"><blockquote =
type=3D"cite" class=3D"gmail_msg"><div
class=3D"gmail_msg"><div =
dir=3D"ltr" class=3D"gmail_msg"><div class=3D"gmail_quote
=
gmail_msg"><div
class=3D"gmail_msg"> <br =
class=3D"gmail_msg"></div><blockquote class=3D"gmail_quote
gmail_msg" =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_extra gmail_msg"><div class=3D"gmail_quote =
gmail_msg"><div class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg"> </div><blockquote
class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"></blockquote></div></div></div><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_extra
gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"
class=3D"gmail_msg"><div =
class=3D"gmail_msg">Nevertheless it can be potentially beneficial to =
more functions in vdsm.<br class=3D"gmail_msg"></div><div =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Thanks,<br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg">Roy<br
class=3D"gmail_msg"></div><div =
class=3D"gmail_msg"><br
class=3D"gmail_msg"></div></div>
<br
class=3D"gmail_msg"></blockquote></div></div></div><div
dir=3D"ltr" =
class=3D"gmail_msg"><div class=3D"gmail_extra
gmail_msg"><div =
class=3D"gmail_quote gmail_msg"><blockquote class=3D"gmail_quote =
gmail_msg" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex">_______________________________________________<br=
class=3D"gmail_msg">
Devel mailing list<br class=3D"gmail_msg">
<a href=3D"mailto:Devel@ovirt.org" class=3D"gmail_msg" =
target=3D"_blank">Devel(a)ovirt.org</a><br
class=3D"gmail_msg">
<a
href=3D"http://lists.ovirt.org/mailman/listinfo/devel" =
rel=3D"noreferrer" class=3D"gmail_msg" =
target=3D"_blank">http://lists.ovirt.org/mailman/listinfo/de...
=
class=3D"gmail_msg"></blockquote></div><br =
class=3D"gmail_msg"></div></div>
</blockquote></div></div>
_______________________________________________<br =
class=3D"gmail_msg">Devel mailing list<br
class=3D"gmail_msg"><a =
href=3D"mailto:Devel@ovirt.org" class=3D"gmail_msg" =
target=3D"_blank">Devel(a)ovirt.org</a><br
class=3D"gmail_msg"><a =
href=3D"http://lists.ovirt.org/mailman/listinfo/devel"
class=3D"gmail_msg"=
=
target=3D"_blank">http://lists.ovirt.org/mailman/listinfo/de...
/blockquote></div><br
class=3D"gmail_msg"></div></blockquote></div></div>
</div></blockquote></div><br
class=3D""></body></html>=
--Apple-Mail=_4D0244E4-4D4A-48DB-B16B-BE856667DA7B--