From eca73f0096d59fe3f3aeaaeb10035305933e46b9 Mon Sep 17 00:00:00 2001 From: Naitik Shah Date: Wed, 2 Apr 2014 14:59:35 -0700 Subject: [PATCH] internal sync, license update, 1.2 on travis etc --- .travis.yml | 7 +++++- gracedemo/demo.go | 2 +- gracehttp/http_test.go | 6 +++++ gracehttp/testserver/testserver.go | 24 ++++++++++++++++--- license | 37 ++++++++++++++++++++++-------- patents | 23 +++++++++++++++++++ 6 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 patents diff --git a/.travis.yml b/.travis.yml index bff8b43..16d8cc5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,6 @@ -script: curl https://raw.github.com/daaku/go.travis/master/install | sh +language: go +go: + - 1.1 + - 1.2 +script: + - curl https://raw.github.com/daaku/go.travis/master/install | sh diff --git a/gracedemo/demo.go b/gracedemo/demo.go index 3e39261..842d880 100644 --- a/gracedemo/demo.go +++ b/gracedemo/demo.go @@ -1,5 +1,5 @@ // Command gracedemo implements a demo server showing how to gracefully -// terminate an HTTP server using go.grace. +// terminate an HTTP server using grace. package main import ( diff --git a/gracehttp/http_test.go b/gracehttp/http_test.go index e703d69..a5b2a63 100644 --- a/gracehttp/http_test.go +++ b/gracehttp/http_test.go @@ -196,6 +196,12 @@ func (h *harness) SendOne(dialgroup *sync.WaitGroup, url string, pid int) { h.T.Fatalf("Failed to ready decode json response body pid=%d: %s", pid, err) } if pid != res.Pid { + for _, old := range h.Process[0 : len(h.Process)-1] { + if res.Pid == old.Pid { + h.T.Logf("Found old pid %d, ignoring the discrepancy", res.Pid) + return + } + } h.T.Fatalf("Didn't get expected pid %d instead got %d", pid, res.Pid) } debug("Done %02d pid=%d url=%s", count, pid, url) diff --git a/gracehttp/testserver/testserver.go b/gracehttp/testserver/testserver.go index 9292658..3cf4d98 100644 --- a/gracehttp/testserver/testserver.go +++ b/gracehttp/testserver/testserver.go @@ -22,7 +22,20 @@ type response struct { Error string `json:",omitempty"` } +// Wait for 10 consecutive responses from our own pid. +// +// This prevents flaky tests that arise from the fact that we have the +// perfectly acceptable (read: not a bug) condition where both the new and the +// old servers are accepting requests. In fact the amount of time both are +// accepting at the same time and the number of requests that flip flop between +// them is unbounded and in the hands of the various kernels our code tends to +// run on. +// +// In order to combat this, we wait for 10 successful responses from our own +// pid. This is a somewhat reliable way to ensure the old server isn't +// serving anymore. func wait(wg *sync.WaitGroup, url string) { + var success int defer wg.Done() for { res, err := http.Get(url) @@ -34,9 +47,14 @@ func wait(wg *sync.WaitGroup, url string) { log.Fatalf("Error decoding json: %s", err) } if r.Pid == os.Getpid() { - return + success++ + if success == 10 { + return + } + continue } } else { + success = 0 // we expect connection refused if !strings.HasSuffix(err.Error(), "connection refused") { e2 := json.NewEncoder(os.Stderr).Encode(&response{ @@ -90,8 +108,8 @@ func main() { go func() { var wg sync.WaitGroup wg.Add(2) - go wait(&wg, fmt.Sprintf("http://%s/sleep/?duration=0", httpAddr)) - go wait(&wg, fmt.Sprintf("https://%s/sleep/?duration=0", httpsAddr)) + go wait(&wg, fmt.Sprintf("http://%s/sleep/?duration=1ms", httpAddr)) + go wait(&wg, fmt.Sprintf("https://%s/sleep/?duration=1ms", httpsAddr)) wg.Wait() err = json.NewEncoder(os.Stderr).Encode(&response{Pid: os.Getpid()}) diff --git a/license b/license index 3b5bc40..500d2f7 100644 --- a/license +++ b/license @@ -1,13 +1,30 @@ -Copyright 2013 Facebook, Inc +BSD License -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +For grace software - http://www.apache.org/licenses/LICENSE-2.0 +Copyright (c) 2014, Facebook, Inc. All rights reserved. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/patents b/patents new file mode 100644 index 0000000..0c8da53 --- /dev/null +++ b/patents @@ -0,0 +1,23 @@ +Additional Grant of Patent Rights + +"Software" means the grace software distributed by Facebook, Inc. + +Facebook hereby grants you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable (subject to the termination provision below) license under any +rights in any patent claims owned by Facebook, to make, have made, use, sell, +offer to sell, import, and otherwise transfer the Software. For avoidance of +doubt, no license is granted under Facebook’s rights in any patent claims that +are infringed by (i) modifications to the Software made by you or a third party, +or (ii) the Software in combination with any software or other technology +provided by you or a third party. + +The license granted hereunder will terminate, automatically and without notice, +for anyone that makes any claim (including by filing any lawsuit, assertion or +other action) alleging (a) direct, indirect, or contributory infringement or +inducement to infringe any patent: (i) by Facebook or any of its subsidiaries or +affiliates, whether or not such claim is related to the Software, (ii) by any +party if such claim arises in whole or in part from any software, product or +service of Facebook or any of its subsidiaries or affiliates, whether or not +such claim is related to the Software, or (iii) by any party relating to the +Software; or (b) that any right in any patent claim of Facebook is invalid or +unenforceable.