]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: minor tweaks for app-engine use
authorRobert Griesemer <gri@golang.org>
Fri, 2 Sep 2011 17:07:29 +0000 (10:07 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 2 Sep 2011 17:07:29 +0000 (10:07 -0700)
- read search index files in groutine to avoid
  start-up failure on app engine because reading
  the files takes too long
- permit usage of search index files and indexer
- minor cosmetic cleanups

R=dsymonds
CC=golang-dev
https://golang.org/cl/4952050

src/cmd/godoc/appconfig.go
src/cmd/godoc/appinit.go
src/cmd/godoc/godoc.go
src/cmd/godoc/main.go

index 1f420fc6cffff0f5237d4f1df38fa8cf9dab9891..052a9ebc8aba8280884bed022d13ea47ff68e0db 100644 (file)
@@ -17,9 +17,11 @@ const (
        // in the .zip file.
        zipGoroot = "/home/user/go"
 
-       // indexFilenames is a glob pattern specifying
-       // files containing the search index served by
-       // godoc. The files are concatenated in sorted
+       // If indexFilenames != "", the search index is
+       // initialized with the index stored in these
+       // files (otherwise it will be built at run-time,
+       // eventually). indexFilenames is a glob pattern;
+       // the specified files are concatenated in sorted
        // order (by filename).
        // app-engine limit: file sizes must be <= 10MB;
        // use "split -b8m indexfile index.split." to get
index 96f8d5e2acb0612a68b49a342a1bafcf88792721..baba53fa6f15b1dd8d267da9d6b19afe782303e6 100644 (file)
@@ -88,9 +88,7 @@ func init() {
 
        // initialize search index
        if *indexEnabled {
-               if err := initIndex(); err != nil {
-                       log.Fatalf("error initializing index: %s", err)
-               }
+               go indexer()
        }
 
        log.Println("godoc initialization complete")
index a4e26b87262c202d50e99ad3d4df32d573bf3cdb..6b646a1a66fef5c3375eb4a8c16c4262304ebb30 100644 (file)
@@ -1065,11 +1065,7 @@ func lookup(query string) (result SearchResult) {
        if *indexEnabled {
                if _, ts := fsModified.get(); timestamp < ts {
                        // The index is older than the latest file system change under godoc's observation.
-                       if *indexFiles != "" {
-                               result.Alert = "Index not automatically updated: result may be inaccurate"
-                       } else {
-                               result.Alert = "Indexing in progress: result may be inaccurate"
-                       }
+                       result.Alert = "Indexing in progress: result may be inaccurate"
                }
        } else {
                result.Alert = "Search index disabled: no results available"
@@ -1145,6 +1141,29 @@ func fsDirnames() <-chan string {
        return c
 }
 
+func readIndex(filenames string) os.Error {
+       matches, err := filepath.Glob(filenames)
+       if err != nil {
+               return err
+       }
+       sort.Strings(matches) // make sure files are in the right order
+       files := make([]io.Reader, 0, len(matches))
+       for _, filename := range matches {
+               f, err := os.Open(filename)
+               if err != nil {
+                       return err
+               }
+               defer f.Close()
+               files = append(files, f)
+       }
+       x := new(Index)
+       if err := x.Read(io.MultiReader(files...)); err != nil {
+               return err
+       }
+       searchIndex.set(x)
+       return nil
+}
+
 func updateIndex() {
        if *verbose {
                log.Printf("updating index...")
@@ -1165,6 +1184,14 @@ func updateIndex() {
 }
 
 func indexer() {
+       // initialize the index from disk if possible
+       if *indexFiles != "" {
+               if err := readIndex(*indexFiles); err != nil {
+                       log.Printf("error reading index: %s", err)
+               }
+       }
+
+       // repeatedly update the index when it goes out of date
        for {
                if !indexUpToDate() {
                        // index possibly out of date - make a new one
@@ -1178,33 +1205,3 @@ func indexer() {
                time.Sleep(delay)
        }
 }
-
-func initIndex() os.Error {
-       if *indexFiles == "" {
-               // run periodic indexer
-               go indexer()
-               return nil
-       }
-
-       // get search index from files
-       matches, err := filepath.Glob(*indexFiles)
-       if err != nil {
-               return err
-       }
-       sort.Strings(matches) // make sure files are in the right order
-       files := make([]io.Reader, 0, len(matches))
-       for _, filename := range matches {
-               f, err := os.Open(filename)
-               if err != nil {
-                       return err
-               }
-               defer f.Close()
-               files = append(files, f)
-       }
-       x := new(Index)
-       if err := x.Read(io.MultiReader(files...)); err != nil {
-               return err
-       }
-       searchIndex.set(x)
-       return nil
-}
index 20eff6dd3a37d74191230a8132e6eb7ca3ab8c30..74d3111ffd2ae7a915ee9dc8a20b29142bace53f 100644 (file)
@@ -248,6 +248,7 @@ func main() {
                if err != nil {
                        log.Fatalf("%s: %s\n", *zipfile, err)
                }
+               defer rc.Close()                  // be nice (e.g., -writeIndex mode)
                *goroot = path.Join("/", *goroot) // fsHttp paths are relative to '/'
                fs = NewZipFS(rc)
                fsHttp = NewHttpZipFS(rc, *goroot)
@@ -262,8 +263,9 @@ func main() {
        }
 
        if *writeIndex {
+               // Write search index and exit.
                if *indexFiles == "" {
-                       log.Fatal("no index files specified")
+                       log.Fatal("no index file specified")
                }
 
                log.Println("initialize file systems")
@@ -342,9 +344,7 @@ func main() {
 
                // Initialize search index.
                if *indexEnabled {
-                       if err := initIndex(); err != nil {
-                               log.Fatalf("error initializing index: %s", err)
-                       }
+                       go indexer()
                }
 
                // Start http server.