Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 May 2021 21:04:57 +0200
From:      =?UTF-8?Q?Ulrich_Sp=C3=B6rlein?= <uqs@freebsd.org>
To:        Mark Johnston <markj@freebsd.org>
Cc:        freebsd-git@freebsd.org
Subject:   Re: vendor/illumos merges
Message-ID:  <CAJ9axoTDeK37%2B8Jjjih%2BVHqq4k%2B%2BKqC7cqw5sR=EyBKDUrzyPQ@mail.gmail.com>
In-Reply-To: <YKP9hxYDz2D3/dZX@nuc>
References:  <YIM7iaptOgsWyxse@nuc> <YIP2mE%2B0lKB8pLTK@acme.spoerlein.net> <YIQ0ilbqOM4/cTE4@nuc> <YIV2bqPnzX0faSMo@acme.spoerlein.net> <YKP9hxYDz2D3/dZX@nuc>

next in thread | previous in thread | raw e-mail | index | archive | help
--00000000000054214305c2b38120
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Tue, May 18, 2021 at 7:49 PM Mark Johnston <markj@freebsd.org> wrote:

> On Sun, Apr 25, 2021 at 04:02:22PM +0200, Ulrich Sp=C3=B6rlein wrote:
> > On Sat, 2021-04-24 at 11:08:58 -0400, Mark Johnston wrote:
> > >On Sat, Apr 24, 2021 at 12:44:40PM +0200, Ulrich Sp=C3=B6rlein wrote:
> > >> On Fri, 2021-04-23 at 17:26:33 -0400, Mark Johnston wrote:
> > >> >Hi,
> > >> >
> > >> >Now that FreeBSD uses OpenZFS as the upstream for ZFS,
> vendor/illumos is
> > >> >mostly unused.  However, we still use illumos as an upstream for CT=
F
> > >> >tools and DTrace, though there haven't been any imports in a while.
> > >> >
> > >> >illumos has put a lot of work into their CTF toolchain, and I'd lik=
e
> to
> > >> >import that.  There are a couple of snags that I'd appreciate some
> > >> >guidance on.
> > >> >
> > >> >First, I believe I should delete now-unused ZFS code from the vendo=
r
> > >> >branch and merge the result to main.  I did this locally and got an
> > >> >empty merge, which is what I'd expect.  Is there any problem with
> this?
> > >>
> > >> Why would you record this empty merge? If you clean up vendor/foo,
> just
> > >> do that but don't merge a no-op back into main (nothing changed, aft=
er
> > >> all).
> > >
> > >Ok, I guess there is no reason to merge that change separately.  It
> > >will end up being merged with subsequent imports though.
> > >
> > >> >Second, with Subversion we had both vendor/illumos and
> > >> >vendor-sys/illumos, and now we just have the former, seemingly with
> > >> >sys/* bits imported from vendor-sys.  Some of the upstream commits
> touch
> > >> >both userspace and kernel bits, but the merge targets for these in
> > >> >FreeBSD are different: cddl/contrib/opensolaris vs.
> > >> >sys/cddl/contrib/opensolaris.  How should I merge into main in this
> > >> >case?  I don't really see any options other than to split each
> offending
> > >> >upstream commit into two parts, one for userspace and one for the
> > >> >kernel, and merge them separately.
> > >> >
> > >> >If it helps to look at the branch where I staged the upstream
> commits,
> > >> >I've pushed it to vendor/illumos2 in
> https://github.com/markjdb/freebsd
> > >> >.
> > >>
> > >> Can you clarify why the merging of the two might be an issue? Note
> that
> > >> unlike subversion, in git there's no "merge a certain subtree"
> handling,
> > >> all that is recorded is a tree of some form and then a set of parent=
s
> or
> > >> ancestor commits. (git is a content tracker, not really a VCS :)
> > >>
> > >> I was under the impression that userland and kernel imports/merges
> need
> > >> to happen at the same time anyway, so I assume you would import all
> the
> > >> bits under vendor/foo in 1 commit and then merge them in 1 commit in=
to
> > >> main. Is that not how it goes?
> > >
> > >How can I do that with git subtree merge?  Suppose an illumos commit
> > >modifies cmd/dtrace/foo.c (userspace) and uts/common/dtrace/foo.c
> > >(kernel).  That maps to cddl/contrib/opensolaris/cmd/dtrace/foo.c and
> > >sys/cddl/contrib/opensolaris/uts/common/dtrace/foo.c in FreeBSD,
> > >respectively.  So to do a subtree merge, I need to use distinct prefix=
es
> > >depending on whether I'm importing userspace or kernel changes.  When
> > >they are mixed together, it's not clear to me how I can merge at all.
> > >
> > >I see that for OpenZFS we keep all code, including userspace code, und=
er
> > >sys/contrib/openzfs, so it doesn't have this problem.
> >
> > I don't think you want a subtree merge, especially as things are
> > scattered all over the place. Also note that none of this subtree magic
> > is in any way recorded in the git data, all it does is help you with th=
e
> > 3-way merges (or whatever).
> >
> > So I would do:
> > - import whatever you need into contrib/foo, commit normally.
> > - munge /usr/src to have every kernel and userland stuff (not sure what
> > other merge tools exist, just make sure to copy over file deletions as
> > well :). You could rsync --del two times with the right source/dest
> > pairs, or export a diff/patch from step 1 and apply it under the right
> > prefixes. test, test, test.
> > - write out this tree to git using: git write-tree
> > - then commit this using: git commit-tree -m "my message" -p HEAD -p
> > origin/vendor/illumos <tree hash from previous command>
> > - bump main to point to that hash using git update-ref
> > - git log --graph and inspect the hell out of this
> > - git push, then curse that we disallow merge commits and you need to
> > `git pull --rebase` to advance to the latest published head and that
> > might mess up your merge commit pretty bad :(
> >
> >
> > Maybe 2x git subtree merge + then rewriting and squashing them into 1
> > would work. But I fear it will record 3 parents, not 2 parents.
> >
> > Whatever you do, maybe please push to your private Github clone or our
> > dev repo first and tell us where to look, so we can inspect whether it
> > looks ok.
>
> I followed your suggestions and have what looks like a clean result.
> Basically I did two subtree merges and committed the result.
>
> I pushed it here:
> https://github.com/markjdb/freebsd/tree/ff/illumos-merge
> The merge is the second-last commit on that branch.
>
> Rebasing the merge is painful, partly because there are some old ZFS
> commits in the illumos vendor branch which git tries to merge.  Rename
> detection leads to some really weird conflicts as well.  I'm not sure
> how to handle this: there's a lot of room to make mistakes when
> rebasing, so I would want to be careful and do extra testing before
> pushing the final merge, but during that window it's likely that I will
> end up having to rebase again.
>
> I should perhaps remove all ZFS bits from the vendor branch, and merge
> it into main first before importing other stuff.
>

I see only 1 merge commit in there, is that the expected outcome?

The output of
git show -p --first-parent 23a19903267ee799cbddc35eb3e6f978ac1b4f38
looks mostly sane though, does it look like the changes that you'd like to
bring into main?

Warner, could you please also have a look?

Cheers
Uli

--00000000000054214305c2b38120
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><br></div><br><div class=3D"gmail_quote">=
<div dir=3D"ltr" class=3D"gmail_attr">On Tue, May 18, 2021 at 7:49 PM Mark =
Johnston &lt;<a href=3D"mailto:markj@freebsd.org">markj@freebsd.org</a>&gt;=
 wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sun, =
Apr 25, 2021 at 04:02:22PM +0200, Ulrich Sp=C3=B6rlein wrote:<br>
&gt; On Sat, 2021-04-24 at 11:08:58 -0400, Mark Johnston wrote:<br>
&gt; &gt;On Sat, Apr 24, 2021 at 12:44:40PM +0200, Ulrich Sp=C3=B6rlein wro=
te:<br>
&gt; &gt;&gt; On Fri, 2021-04-23 at 17:26:33 -0400, Mark Johnston wrote:<br=
>
&gt; &gt;&gt; &gt;Hi,<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt;Now that FreeBSD uses OpenZFS as the upstream for ZFS, ve=
ndor/illumos is<br>
&gt; &gt;&gt; &gt;mostly unused.=C2=A0 However, we still use illumos as an =
upstream for CTF<br>
&gt; &gt;&gt; &gt;tools and DTrace, though there haven&#39;t been any impor=
ts in a while.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt;illumos has put a lot of work into their CTF toolchain, a=
nd I&#39;d like to<br>
&gt; &gt;&gt; &gt;import that.=C2=A0 There are a couple of snags that I&#39=
;d appreciate some<br>
&gt; &gt;&gt; &gt;guidance on.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt;First, I believe I should delete now-unused ZFS code from=
 the vendor<br>
&gt; &gt;&gt; &gt;branch and merge the result to main.=C2=A0 I did this loc=
ally and got an<br>
&gt; &gt;&gt; &gt;empty merge, which is what I&#39;d expect.=C2=A0 Is there=
 any problem with this?<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Why would you record this empty merge? If you clean up vendor=
/foo, just<br>
&gt; &gt;&gt; do that but don&#39;t merge a no-op back into main (nothing c=
hanged, after<br>
&gt; &gt;&gt; all).<br>
&gt; &gt;<br>
&gt; &gt;Ok, I guess there is no reason to merge that change separately.=C2=
=A0 It<br>
&gt; &gt;will end up being merged with subsequent imports though.<br>
&gt; &gt;<br>
&gt; &gt;&gt; &gt;Second, with Subversion we had both vendor/illumos and<br=
>
&gt; &gt;&gt; &gt;vendor-sys/illumos, and now we just have the former, seem=
ingly with<br>
&gt; &gt;&gt; &gt;sys/* bits imported from vendor-sys.=C2=A0 Some of the up=
stream commits touch<br>
&gt; &gt;&gt; &gt;both userspace and kernel bits, but the merge targets for=
 these in<br>
&gt; &gt;&gt; &gt;FreeBSD are different: cddl/contrib/opensolaris vs.<br>
&gt; &gt;&gt; &gt;sys/cddl/contrib/opensolaris.=C2=A0 How should I merge in=
to main in this<br>
&gt; &gt;&gt; &gt;case?=C2=A0 I don&#39;t really see any options other than=
 to split each offending<br>
&gt; &gt;&gt; &gt;upstream commit into two parts, one for userspace and one=
 for the<br>
&gt; &gt;&gt; &gt;kernel, and merge them separately.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt;If it helps to look at the branch where I staged the upst=
ream commits,<br>
&gt; &gt;&gt; &gt;I&#39;ve pushed it to vendor/illumos2 in <a href=3D"https=
://github.com/markjdb/freebsd" rel=3D"noreferrer" target=3D"_blank">https:/=
/github.com/markjdb/freebsd</a><br>
&gt; &gt;&gt; &gt;.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Can you clarify why the merging of the two might be an issue?=
 Note that<br>
&gt; &gt;&gt; unlike subversion, in git there&#39;s no &quot;merge a certai=
n subtree&quot; handling,<br>
&gt; &gt;&gt; all that is recorded is a tree of some form and then a set of=
 parents or<br>
&gt; &gt;&gt; ancestor commits. (git is a content tracker, not really a VCS=
 :)<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; I was under the impression that userland and kernel imports/m=
erges need<br>
&gt; &gt;&gt; to happen at the same time anyway, so I assume you would impo=
rt all the<br>
&gt; &gt;&gt; bits under vendor/foo in 1 commit and then merge them in 1 co=
mmit into<br>
&gt; &gt;&gt; main. Is that not how it goes?<br>
&gt; &gt;<br>
&gt; &gt;How can I do that with git subtree merge?=C2=A0 Suppose an illumos=
 commit<br>
&gt; &gt;modifies cmd/dtrace/foo.c (userspace) and uts/common/dtrace/foo.c<=
br>
&gt; &gt;(kernel).=C2=A0 That maps to cddl/contrib/opensolaris/cmd/dtrace/f=
oo.c and<br>
&gt; &gt;sys/cddl/contrib/opensolaris/uts/common/dtrace/foo.c in FreeBSD,<b=
r>
&gt; &gt;respectively.=C2=A0 So to do a subtree merge, I need to use distin=
ct prefixes<br>
&gt; &gt;depending on whether I&#39;m importing userspace or kernel changes=
.=C2=A0 When<br>
&gt; &gt;they are mixed together, it&#39;s not clear to me how I can merge =
at all.<br>
&gt; &gt;<br>
&gt; &gt;I see that for OpenZFS we keep all code, including userspace code,=
 under<br>
&gt; &gt;sys/contrib/openzfs, so it doesn&#39;t have this problem.<br>
&gt; <br>
&gt; I don&#39;t think you want a subtree merge, especially as things are <=
br>
&gt; scattered all over the place. Also note that none of this subtree magi=
c <br>
&gt; is in any way recorded in the git data, all it does is help you with t=
he <br>
&gt; 3-way merges (or whatever).<br>
&gt; <br>
&gt; So I would do:<br>
&gt; - import whatever you need into contrib/foo, commit normally.<br>
&gt; - munge /usr/src to have every kernel and userland stuff (not sure wha=
t <br>
&gt; other merge tools exist, just make sure to copy over file deletions as=
 <br>
&gt; well :). You could rsync --del two times with the right source/dest <b=
r>
&gt; pairs, or export a diff/patch from step 1 and apply it under the right=
 <br>
&gt; prefixes. test, test, test.<br>
&gt; - write out this tree to git using: git write-tree<br>
&gt; - then commit this using: git commit-tree -m &quot;my message&quot; -p=
 HEAD -p <br>
&gt; origin/vendor/illumos &lt;tree hash from previous command&gt;<br>
&gt; - bump main to point to that hash using git update-ref<br>
&gt; - git log --graph and inspect the hell out of this<br>
&gt; - git push, then curse that we disallow merge commits and you need to =
<br>
&gt; `git pull --rebase` to advance to the latest published head and that <=
br>
&gt; might mess up your merge commit pretty bad :(<br>
&gt; <br>
&gt; <br>
&gt; Maybe 2x git subtree merge + then rewriting and squashing them into 1 =
<br>
&gt; would work. But I fear it will record 3 parents, not 2 parents.<br>
&gt; <br>
&gt; Whatever you do, maybe please push to your private Github clone or our=
 <br>
&gt; dev repo first and tell us where to look, so we can inspect whether it=
 <br>
&gt; looks ok.<br>
<br>
I followed your suggestions and have what looks like a clean result.<br>
Basically I did two subtree merges and committed the result.<br>
<br>
I pushed it here:<br>
<a href=3D"https://github.com/markjdb/freebsd/tree/ff/illumos-merge" rel=3D=
"noreferrer" target=3D"_blank">https://github.com/markjdb/freebsd/tree/ff/i=
llumos-merge</a><br>
The merge is the second-last commit on that branch.<br>
<br>
Rebasing the merge is painful, partly because there are some old ZFS<br>
commits in the illumos vendor branch which git tries to merge.=C2=A0 Rename=
<br>
detection leads to some really weird conflicts as well.=C2=A0 I&#39;m not s=
ure<br>
how to handle this: there&#39;s a lot of room to make mistakes when<br>
rebasing, so I would want to be careful and do extra testing before<br>
pushing the final merge, but during that window it&#39;s likely that I will=
<br>
end up having to rebase again.<br>
<br>
I should perhaps remove all ZFS bits from the vendor branch, and merge<br>
it into main first before importing other stuff.<br></blockquote><div><br><=
/div><div>I see only 1 merge commit in there, is that the expected outcome?=
</div><div><br></div><div>The output of</div><div>git show -p --first-paren=
t 23a19903267ee799cbddc35eb3e6f978ac1b4f38<br></div><div>looks mostly sane =
though, does it look like the changes that you&#39;d like to bring into mai=
n?</div><div><br></div><div>Warner, could you please also have a look?</div=
><div><br></div><div>Cheers</div><div>Uli</div></div></div>

--00000000000054214305c2b38120--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ9axoTDeK37%2B8Jjjih%2BVHqq4k%2B%2BKqC7cqw5sR=EyBKDUrzyPQ>