allow all options of HTTPPool to be specified by users
diff --git a/http.go b/http.go
index ac23865..5d43937 100644
--- a/http.go
+++ b/http.go
@@ -29,10 +29,8 @@
pb "github.com/golang/groupcache/groupcachepb"
)
-// TODO: make this configurable?
const defaultBasePath = "/_groupcache/"
-// TODO: make this configurable as well.
const defaultReplicas = 50
// HTTPPool implements PeerPicker for a pool of HTTP peers.
@@ -57,21 +55,59 @@
peers *consistenthash.Map
}
-var httpPoolMade bool
+// HTTPPoolOptions are the configurations of a HTTPPool.
+type HTTPPoolOptions struct {
+ // BasePath specifies the HTTP path that will serve groupcache requests.
+ // If blank, it defaults to "/_groupcache/".
+ BasePath string
-// NewHTTPPool initializes an HTTP pool of peers.
-// It registers itself as a PeerPicker and as an HTTP handler with the
-// http.DefaultServeMux.
+ // Replicas specifies the number of key replicas on the consistent hash.
+ // If blank, it defaults to 50.
+ Replicas int
+
+ // HashFn specifies the hash function of the consistent hash.
+ // If blank, it defaults to crc32.ChecksumIEEE.
+ HashFn consistenthash.Hash
+}
+
+// NewHTTPPool initializes an HTTP pool of peers, and registers itself as a PeerPicker.
+// For convenience, it also registers itself as an http.Handler with http.DefaultServeMux.
// The self argument be a valid base URL that points to the current server,
// for example "http://example.net:8000".
func NewHTTPPool(self string) *HTTPPool {
+ p := NewHTTPPoolOpts(self, nil)
+ http.Handle(p.basePath, p)
+ return p
+}
+
+var httpPoolMade bool
+
+// NewHTTPPoolOpts initializes an HTTP pool of peers with the given options.
+// Unlike NewHTTPPool, this function does not register the created pool as an HTTP handler.
+// The returned *HTTPPool implements http.Handler and must be registered using http.Handle.
+func NewHTTPPoolOpts(self string, o *HTTPPoolOptions) *HTTPPool {
if httpPoolMade {
panic("groupcache: NewHTTPPool must be called only once")
}
httpPoolMade = true
- p := &HTTPPool{basePath: defaultBasePath, self: self, peers: consistenthash.New(defaultReplicas, nil)}
+
+ opts := HTTPPoolOptions{}
+ if o != nil {
+ opts = *o
+ }
+ if opts.BasePath == "" {
+ opts.BasePath = defaultBasePath
+ }
+ if opts.Replicas == 0 {
+ opts.Replicas = defaultReplicas
+ }
+
+ p := &HTTPPool{
+ basePath: opts.BasePath,
+ self: self,
+ peers: consistenthash.New(opts.Replicas, opts.HashFn),
+ }
RegisterPeerPicker(func() PeerPicker { return p })
- http.Handle(defaultBasePath, p)
return p
}