···1140114011411141 }()
1142114211431143- // Serve mux on a unix domain socket so that webserver can call the
11441144- // endpoints via the shared filesystem.
11431143+ // Serve mux on a unix domain socket on a best-effort-basis so that
11441144+ // webserver can call the endpoints via the shared filesystem.
11451145+ //
11461146+ // 2022-12-08: Docker for Mac with VirtioFS enabled will fail to listen
11471147+ // on the socket due to permission errors. See
11481148+ // https://github.com/docker/for-mac/issues/6239
11451149 go func() {
11461146- socket := filepath.Join(s.IndexDir, "indexserver.sock")
11471147- // We cannot bind a socket to an existing pathname.
11481148- if err := os.Remove(socket); err != nil && !errors.Is(err, fs.ErrNotExist) {
11491149- log.Fatalf("error removing socket file: %s", socket)
11501150- }
11511151- // The "unix" network corresponds to stream sockets. (cf. unixgram,
11521152- // unixpacket).
11531153- l, err := net.Listen("unix", socket)
11541154- if err != nil {
11551155- log.Fatalf("failed to listen on socket: %s", err)
11561156- }
11571157- // Indexserver (root) and webserver (Sourcegraph) run with
11581158- // different users. Per default, the socket is created with
11591159- // permission 755 (root root), which doesn't let webserver write to
11601160- // it.
11611161- //
11621162- // See https://github.com/golang/go/issues/11822 for more context.
11631163- if err := os.Chmod(socket, 0777); err != nil {
11641164- log.Fatalf("failed to change permission of socket %s: %s", socket, err)
11501150+ serveHTTPOverSocket := func() error {
11511151+ socket := filepath.Join(s.IndexDir, "indexserver.sock")
11521152+ // We cannot bind a socket to an existing pathname.
11531153+ if err := os.Remove(socket); err != nil && !errors.Is(err, fs.ErrNotExist) {
11541154+ return fmt.Errorf("error removing socket file: %s", socket)
11551155+ }
11561156+ // The "unix" network corresponds to stream sockets. (cf. unixgram,
11571157+ // unixpacket).
11581158+ l, err := net.Listen("unix", socket)
11591159+ if err != nil {
11601160+ return fmt.Errorf("failed to listen on socket %s: %w", socket, err)
11611161+ }
11621162+ // Indexserver (root) and webserver (Sourcegraph) run with
11631163+ // different users. Per default, the socket is created with
11641164+ // permission 755 (root root), which doesn't let webserver write to
11651165+ // it.
11661166+ //
11671167+ // See https://github.com/golang/go/issues/11822 for more context.
11681168+ if err := os.Chmod(socket, 0777); err != nil {
11691169+ return fmt.Errorf("failed to change permission of socket %s: %w", socket, err)
11701170+ }
11711171+ debug.Printf("serving HTTP on %s", socket)
11721172+ return http.Serve(l, mux)
11651173 }
11661166- debug.Printf("serving HTTP on %s", socket)
11671167- log.Fatal(http.Serve(l, mux))
11741174+ debug.Print(serveHTTPOverSocket())
11681175 }()
11691176 }
11701177