|
|
Descriptionnet: make resolveInternetAddr return a list of addresses
This CL makes resolveInternetAddr return a list of addresses that
contain a pair of different address family IP addresses if possible,
but doesn't contain any API behavioral changes yet. A simple IP
address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API
still prefers IPv4.
This is in preparation for TCP connection setup with fast failover on
dual IP stack node as described in RFC 6555.
Update issue 3610
Update issue 5267
Patch Set 1 : diff -r 6939fe74ea98 https://code.google.com/p/go #
Total comments: 16
Patch Set 2 : diff -r dd674dca7393 https://code.google.com/p/go #
Total comments: 2
Patch Set 3 : diff -r c4b7e2aa2084 https://code.google.com/p/go #Patch Set 4 : diff -r 7dad29f3dd7d https://code.google.com/p/go #
MessagesTotal messages: 21
Hello golang-dev@googlegroups.com (cc: golang-dev@googlegroups.com), I'd like you to review this change to https://code.google.com/p/go
Sign in to reply to this message.
Before I even look at this, I note that the subject line doesn't contain a verb. The subject line should say what this changes, succinctly. It's hard to do that with only a subject. On Thu, Aug 29, 2013 at 6:08 PM, <mikioh.mikioh@gmail.com> wrote: > Reviewers: golang-dev1, > > Message: > Hello golang-dev@googlegroups.com (cc: golang-dev@googlegroups.com), > > I'd like you to review this change to > https://code.google.com/p/go > > > Description: > net: a short list of different address family IP addresses for a DNS > registered name > > This CL makes resolveInternetAddr return a list of addresses that > contain a pair of different address family IP addresses if possible, > but doesn't contain any API behavioral changes yet. A simple IP > address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API > still prefers IPv4. > > This is in preparation for TCP connection setup with fast failover on > dual IP stack node as described in RFC 6555. > > Update issue 3610 > Update issue 5267 > > Please review this at https://codereview.appspot.**com/13374043/<https://codereview.appspot.com/133... > > Affected files: > M src/pkg/net/dialgoogle_test.go > M src/pkg/net/ipraw_test.go > M src/pkg/net/ipsock.go > M src/pkg/net/lookup.go > M src/pkg/net/tcp_test.go > M src/pkg/net/udp_test.go > > > -- > > ---You received this message because you are subscribed to the Google > Groups "golang-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-dev+unsubscribe@**googlegroups.com<golang-dev%2Bunsubscribe@googlegrou... > . > For more options, visit https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/o... > . >
Sign in to reply to this message.
changed to "net: make resolveInternetAddr return a short list of IPv4/v6 addresses" On Fri, Aug 30, 2013 at 11:57 AM, Brad Fitzpatrick <bradfitz@golang.org> wrote: > Before I even look at this, I note that the subject line doesn't contain a > verb. > > The subject line should say what this changes, succinctly. It's hard to do > that with only a subject. > > > > On Thu, Aug 29, 2013 at 6:08 PM, <mikioh.mikioh@gmail.com> wrote: >> >> Reviewers: golang-dev1, >> >> Message: >> Hello golang-dev@googlegroups.com (cc: golang-dev@googlegroups.com), >> >> I'd like you to review this change to >> https://code.google.com/p/go >> >> >> Description: >> net: a short list of different address family IP addresses for a DNS >> registered name >> >> This CL makes resolveInternetAddr return a list of addresses that >> contain a pair of different address family IP addresses if possible, >> but doesn't contain any API behavioral changes yet. A simple IP >> address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API >> still prefers IPv4. >> >> This is in preparation for TCP connection setup with fast failover on >> dual IP stack node as described in RFC 6555. >> >> Update issue 3610 >> Update issue 5267 >> >> Please review this at https://codereview.appspot.com/13374043/ >> >> Affected files: >> M src/pkg/net/dialgoogle_test.go >> M src/pkg/net/ipraw_test.go >> M src/pkg/net/ipsock.go >> M src/pkg/net/lookup.go >> M src/pkg/net/tcp_test.go >> M src/pkg/net/udp_test.go >> >> >> >> -- >> >> ---You received this message because you are subscribed to the Google >> Groups "golang-dev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-dev+unsubscribe@googlegroups.com. >> For more options, visit https://groups.google.com/groups/opt_out. > >
Sign in to reply to this message.
why short? I see nothing describing why it's not a long list of addresses. drop the word? Also, does IPv4/v6 matter? Would "net: make resolveInternetAddr return a list of addresses" be accurate? On Thu, Aug 29, 2013 at 8:03 PM, Mikio Hara <mikioh.mikioh@gmail.com> wrote: > changed to "net: make resolveInternetAddr return a short list of > IPv4/v6 addresses" > > On Fri, Aug 30, 2013 at 11:57 AM, Brad Fitzpatrick <bradfitz@golang.org> > wrote: > > Before I even look at this, I note that the subject line doesn't contain > a > > verb. > > > > The subject line should say what this changes, succinctly. It's hard to > do > > that with only a subject. > > > > > > > > On Thu, Aug 29, 2013 at 6:08 PM, <mikioh.mikioh@gmail.com> wrote: > >> > >> Reviewers: golang-dev1, > >> > >> Message: > >> Hello golang-dev@googlegroups.com (cc: golang-dev@googlegroups.com), > >> > >> I'd like you to review this change to > >> https://code.google.com/p/go > >> > >> > >> Description: > >> net: a short list of different address family IP addresses for a DNS > >> registered name > >> > >> This CL makes resolveInternetAddr return a list of addresses that > >> contain a pair of different address family IP addresses if possible, > >> but doesn't contain any API behavioral changes yet. A simple IP > >> address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API > >> still prefers IPv4. > >> > >> This is in preparation for TCP connection setup with fast failover on > >> dual IP stack node as described in RFC 6555. > >> > >> Update issue 3610 > >> Update issue 5267 > >> > >> Please review this at https://codereview.appspot.com/13374043/ > >> > >> Affected files: > >> M src/pkg/net/dialgoogle_test.go > >> M src/pkg/net/ipraw_test.go > >> M src/pkg/net/ipsock.go > >> M src/pkg/net/lookup.go > >> M src/pkg/net/tcp_test.go > >> M src/pkg/net/udp_test.go > >> > >> > >> > >> -- > >> > >> ---You received this message because you are subscribed to the Google > >> Groups "golang-dev" group. > >> To unsubscribe from this group and stop receiving emails from it, send > an > >> email to golang-dev+unsubscribe@googlegroups.com. > >> For more options, visit https://groups.google.com/groups/opt_out. > > > > >
Sign in to reply to this message.
https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go File src/pkg/net/ipsock.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:63: // firstFavoriteAddr returns an address or a list of addresses that add a comment that this either returns a non-nil addr or an error. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:64: // implemets netaddr interface. typo: implements but I'd probably say "that implement the netaddr interface". https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:232: // address family addresses when addr is a DNS registered name and the I think "DNS name" is sufficient. I don't know what a "DNS unregistered name" would be. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go File src/pkg/net/lookup.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:24: // LookupHost looks up the given host using the local resolver. move this back to where it was for now https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:51: // LookupIP looks up host using the local resolver. don't move things around. Move this back where it was, down below.
Sign in to reply to this message.
On Fri, Aug 30, 2013 at 12:10 PM, Brad Fitzpatrick <bradfitz@golang.org> wrote: > why short? > > I see nothing describing why it's not a long list of addresses. > > drop the word? > > Also, does IPv4/v6 matter? > > Would "net: make resolveInternetAddr return a list of addresses" be > accurate? yup, it was still vague. I tried to embed something like "it's kinda qualified list, it would be not so long even if the target has tons of records, so don't worry about it". but yeah, not accurate. thanks, will change it.
Sign in to reply to this message.
ptal
Sign in to reply to this message.
Please see all the comments.
Sign in to reply to this message.
https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go File src/pkg/net/ipsock.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:65: func firstFavoriteAddr(filter func(IP) IP, ips []IP, inetaddr func(IP) netaddr) (netaddr, error) { the filter parameter is never documented. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:91: if swap { I'm not convinced this logic is correct. What if the order is: IPv6, IPv6, IPv4. Now you're swapping two IPv6 addresses in positions 0 and 1, and IPv4 still is at the end. You should probably write tests for this.
Sign in to reply to this message.
On Fri, Aug 30, 2013 at 12:27 PM, <bradfitz@golang.org> wrote: > What if the order is: IPv6, IPv6, IPv4. Each boolean sentinel ipv4, ipv6 will take care. Will add test and document... doc... do... thanks.
Sign in to reply to this message.
Let me know when it's ready and you've seen the comments from lookup.go. I'll be back in a few hours. On Thu, Aug 29, 2013 at 8:32 PM, Mikio Hara <mikioh.mikioh@gmail.com> wrote: > On Fri, Aug 30, 2013 at 12:27 PM, <bradfitz@golang.org> wrote: > > > What if the order is: IPv6, IPv6, IPv4. > > Each boolean sentinel ipv4, ipv6 will take care. > Will add test and document... doc... do... thanks. >
Sign in to reply to this message.
Hello golang-dev@googlegroups.com, bradfitz@golang.org (cc: golang-dev@googlegroups.com), Please take another look.
Sign in to reply to this message.
No pls hold On Fri, Aug 30, 2013 at 2:30 PM, <mikioh.mikioh@gmail.com> wrote: > Hello golang-dev@googlegroups.com, bradfitz@golang.org (cc: > golang-dev@googlegroups.com), > > Please take another look. > > > https://codereview.appspot.com/13374043/
Sign in to reply to this message.
PTAL https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go File src/pkg/net/ipsock.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:63: // firstFavoriteAddr returns an address or a list of addresses that On 2013/08/30 03:11:45, bradfitz wrote: > add a comment that this either returns a non-nil addr or an error. Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:64: // implemets netaddr interface. On 2013/08/30 03:11:45, bradfitz wrote: > typo: implements > > but I'd probably say "that implement the netaddr interface". Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:65: func firstFavoriteAddr(filter func(IP) IP, ips []IP, inetaddr func(IP) netaddr) (netaddr, error) { On 2013/08/30 03:27:18, bradfitz wrote: > the filter parameter is never documented. Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:91: if swap { On 2013/08/30 03:27:18, bradfitz wrote: > I'm not convinced this logic is correct. > > What if the order is: IPv6, IPv6, IPv4. > > Now you're swapping two IPv6 addresses in positions 0 and 1, and IPv4 still is > at the end. > > You should probably write tests for this. > Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:232: // address family addresses when addr is a DNS registered name and the On 2013/08/30 03:11:45, bradfitz wrote: > I think "DNS name" is sufficient. I don't know what a "DNS unregistered name" > would be. Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go File src/pkg/net/lookup.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:24: // LookupHost looks up the given host using the local resolver. On 2013/08/30 03:11:45, bradfitz wrote: > move this back to where it was for now Well, where is the upright position? Had a look at "changeset: 14268:028fd5ec99ba", and I"m confused. Are you saying the following is the upright pos? lookupIPMerge LookupHost lookupIPDeadline LookupIP
Sign in to reply to this message.
https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go File src/pkg/net/lookup.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:24: // LookupHost looks up the given host using the local resolver. On 2013/08/30 05:54:54, mikio wrote: > On 2013/08/30 03:11:45, bradfitz wrote: > > move this back to where it was for now > > Well, where is the upright position? > > Had a look at "changeset: 14268:028fd5ec99ba", and I"m confused. > Are you saying the following is the upright pos? > > lookupIPMerge > LookupHost > lookupIPDeadline > LookupIP Just minimize the diff size. Your patches are always very big... you can make them easier to review if you don't move things around. Just look at https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go ... see how LookupHost and LookupIP moved? If you want to rearrange things, it should be done in a separate CL. https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go File src/pkg/net/ipsock.go (right): https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:64: // implemet the netaddr interface. Known filters are nil, ipv4only and typo is still here: implement
Sign in to reply to this message.
PTAL okay, fighting against diff doesn't make sense. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go File src/pkg/net/lookup.go (right): https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:24: // LookupHost looks up the given host using the local resolver. On 2013/08/30 16:19:59, bradfitz wrote: > On 2013/08/30 05:54:54, mikio wrote: > > On 2013/08/30 03:11:45, bradfitz wrote: > > > move this back to where it was for now > > > > Well, where is the upright position? > > > > Had a look at "changeset: 14268:028fd5ec99ba", and I"m confused. > > Are you saying the following is the upright pos? > > > > lookupIPMerge > > LookupHost > > lookupIPDeadline > > LookupIP > > Just minimize the diff size. Your patches are always very big... you can make > them easier to review if you don't move things around. > > Just look at > https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go ... see > how LookupHost and LookupIP moved? > > If you want to rearrange things, it should be done in a separate CL. > Done. https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newc... src/pkg/net/lookup.go:51: // LookupIP looks up host using the local resolver. On 2013/08/30 03:11:45, bradfitz wrote: > don't move things around. Move this back where it was, down below. > Done. https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go File src/pkg/net/ipsock.go (right): https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go#newc... src/pkg/net/ipsock.go:64: // implemet the netaddr interface. Known filters are nil, ipv4only and On 2013/08/30 16:19:59, bradfitz wrote: > typo is still here: implement Done.
Sign in to reply to this message.
PTAL okay, fighting against diff doesn't make sense.
Sign in to reply to this message.
LGTM On Fri, Aug 30, 2013 at 4:47 PM, <mikioh.mikioh@gmail.com> wrote: > PTAL > > okay, fighting against diff doesn't make sense. > > > > https://codereview.appspot.**com/13374043/diff/17001/src/** > pkg/net/lookup.go<https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go> > File src/pkg/net/lookup.go (right): > > https://codereview.appspot.**com/13374043/diff/17001/src/** > pkg/net/lookup.go#newcode24<https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newcode24> > src/pkg/net/lookup.go:24: // LookupHost looks up the given host using > the local resolver. > On 2013/08/30 16:19:59, bradfitz wrote: > >> On 2013/08/30 05:54:54, mikio wrote: >> > On 2013/08/30 03:11:45, bradfitz wrote: >> > > move this back to where it was for now >> > >> > Well, where is the upright position? >> > >> > Had a look at "changeset: 14268:028fd5ec99ba", and I"m confused. >> > Are you saying the following is the upright pos? >> > >> > lookupIPMerge >> > LookupHost >> > lookupIPDeadline >> > LookupIP >> > > Just minimize the diff size. Your patches are always very big... you >> > can make > >> them easier to review if you don't move things around. >> > > Just look at >> > > https://codereview.appspot.**com/13374043/diff/17001/src/** > pkg/net/lookup.go<https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go> > ... see > >> how LookupHost and LookupIP moved? >> > > If you want to rearrange things, it should be done in a separate CL. >> > > > Done. > > https://codereview.appspot.**com/13374043/diff/17001/src/** > pkg/net/lookup.go#newcode51<https://codereview.appspot.com/13374043/diff/17001/src/pkg/net/lookup.go#newcode51> > src/pkg/net/lookup.go:51: // LookupIP looks up host using the local > resolver. > > On 2013/08/30 03:11:45, bradfitz wrote: > >> don't move things around. Move this back where it was, down below. >> > > > Done. > > > https://codereview.appspot.**com/13374043/diff/31001/src/** > pkg/net/ipsock.go<https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go> > File src/pkg/net/ipsock.go (right): > > https://codereview.appspot.**com/13374043/diff/31001/src/** > pkg/net/ipsock.go#newcode64<https://codereview.appspot.com/13374043/diff/31001/src/pkg/net/ipsock.go#newcode64> > src/pkg/net/ipsock.go:64: // implemet the netaddr interface. Known > filters are nil, ipv4only and > On 2013/08/30 16:19:59, bradfitz wrote: > >> typo is still here: implement >> > > Done. > > https://codereview.appspot.**com/13374043/<https://codereview.appspot.com/133... >
Sign in to reply to this message.
*** Submitted as https://code.google.com/p/go/source/detail?r=ad8278144324 *** net: make resolveInternetAddr return a list of addresses This CL makes resolveInternetAddr return a list of addresses that contain a pair of different address family IP addresses if possible, but doesn't contain any API behavioral changes yet. A simple IP address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API still prefers IPv4. This is in preparation for TCP connection setup with fast failover on dual IP stack node as described in RFC 6555. Update issue 3610 Update issue 5267 R=golang-dev, bradfitz CC=golang-dev https://codereview.appspot.com/13374043
Sign in to reply to this message.
Message was sent while issue was closed.
On 2013/08/31 01:29:21, mikio wrote: > *** Submitted as https://code.google.com/p/go/source/detail?r=ad8278144324 *** > > net: make resolveInternetAddr return a list of addresses > > This CL makes resolveInternetAddr return a list of addresses that > contain a pair of different address family IP addresses if possible, > but doesn't contain any API behavioral changes yet. A simple IP > address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API > still prefers IPv4. > > This is in preparation for TCP connection setup with fast failover on > dual IP stack node as described in RFC 6555. > > Update issue 3610 > Update issue 5267 > > R=golang-dev, bradfitz > CC=golang-dev > https://codereview.appspot.com/13374043 This broke the build for kernels without IPv6 support: http://build.golang.org/log/fbed7e3a3a0651f7141b3420116d97cd5092adc0 --- FAIL: TestFirstFavoriteAddr (0.00 seconds) ipsock_test.go:186: #0: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:186: #1: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:183: #3: got no suitable address found; expected <nil> ipsock_test.go:186: #3: got <nil>; expected [::1]:5682 ipsock_test.go:186: #4: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:186: #5: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:186: #6: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:186: #7: got 127.0.0.1:5682; expected [127.0.0.1:5682 [::1]:5682] ipsock_test.go:183: #10: got no suitable address found; expected <nil> ipsock_test.go:186: #10: got <nil>; expected [::1]:5682 ipsock_test.go:183: #11: got no suitable address found; expected <nil> ipsock_test.go:186: #11: got <nil>; expected [::1]:5682 FAIL FAIL net 4.618s
Sign in to reply to this message.
fixed. https://code.google.com/p/go/source/detail?r=99056a2a8a9d04a860ab4c40ca1470c6... On Mon, Sep 2, 2013 at 4:33 PM, <capnm9@gmail.com> wrote: > On 2013/08/31 01:29:21, mikio wrote: >> >> *** Submitted as > > https://code.google.com/p/go/source/detail?r=ad8278144324 *** > >> net: make resolveInternetAddr return a list of addresses > > >> This CL makes resolveInternetAddr return a list of addresses that >> contain a pair of different address family IP addresses if possible, >> but doesn't contain any API behavioral changes yet. A simple IP >> address selection mechanism for Resolve{TCP,UDP,IP}Addr and Dial API >> still prefers IPv4. > > >> This is in preparation for TCP connection setup with fast failover on >> dual IP stack node as described in RFC 6555. > > >> Update issue 3610 >> Update issue 5267 > > >> R=golang-dev, bradfitz >> CC=golang-dev >> https://codereview.appspot.com/13374043 > > > This broke the build for kernels without IPv6 support: > http://build.golang.org/log/fbed7e3a3a0651f7141b3420116d97cd5092adc0 > > --- FAIL: TestFirstFavoriteAddr (0.00 seconds) > ipsock_test.go:186: #0: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:186: #1: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:183: #3: got no suitable address found; expected > <nil> > ipsock_test.go:186: #3: got <nil>; expected [::1]:5682 > ipsock_test.go:186: #4: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:186: #5: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:186: #6: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:186: #7: got 127.0.0.1:5682; expected [127.0.0.1:5682 > [::1]:5682] > ipsock_test.go:183: #10: got no suitable address found; expected > <nil> > ipsock_test.go:186: #10: got <nil>; expected [::1]:5682 > ipsock_test.go:183: #11: got no suitable address found; expected > <nil> > ipsock_test.go:186: #11: got <nil>; expected [::1]:5682 > FAIL > FAIL net 4.618s > > > https://codereview.appspot.com/13374043/
Sign in to reply to this message.
|