storage: Implement GetDiskID request in REST server side (#9720)

GetDiskID() in storage rest client does not really issue a REST request
to the remote disk, but returns an in-memory value instead.

However, GetDiskID() should return an error when format.json is not
found or for other similar issues (unmounted disks, etc..)

GetDiskID() is only called when formatting disks and getting storage
informatio, hence this commit should not have a performance degradation.
master
Anis Elleuch 5 years ago committed by GitHub
parent 661068d1a2
commit 375b79f11b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      cmd/storage-interface.go
  2. 12
      cmd/storage-rest-client.go
  3. 1
      cmd/storage-rest-common.go
  4. 17
      cmd/storage-rest-server.go

@ -31,7 +31,7 @@ type StorageAPI interface {
IsLocal() bool
Hostname() string // Returns host name if remote host.
Close() error
GetDiskID() (string, error)
GetDiskID() (string, error) // Could be expensive
SetDiskID(id string)
DiskInfo() (info DiskInfo, err error)

@ -177,8 +177,20 @@ func (client *storageRESTClient) CrawlAndGetDataUsage(ctx context.Context, cache
}
func (client *storageRESTClient) GetDiskID() (string, error) {
respBody, err := client.call(storageRESTMethodGetDiskID, nil, nil, -1)
if err != nil {
// Ignore when other nodes does not support GetDiskID call, this check
// can be removed when the storage API version is bumped.
if strings.Contains(err.Error(), "404 page not found") {
return client.diskID, nil
}
return "", err
}
defer http.DrainBody(respBody)
var s string
err = gob.NewDecoder(respBody).Decode(&s)
return s, err
}
func (client *storageRESTClient) SetDiskID(id string) {
client.diskID = id

@ -24,6 +24,7 @@ const (
const (
storageRESTMethodDiskInfo = "/diskinfo"
storageRESTMethodGetDiskID = "/getdiskid"
storageRESTMethodCrawlAndGetDataUsage = "/crawlandgetdatausage"
storageRESTMethodMakeVol = "/makevol"
storageRESTMethodMakeVolBulk = "/makevolbulk"

@ -132,6 +132,22 @@ func (s *storageRESTServer) DiskInfoHandler(w http.ResponseWriter, r *http.Reque
gob.NewEncoder(w).Encode(info)
}
// GetDiskIDHandler - returns disk id.
func (s *storageRESTServer) GetDiskIDHandler(w http.ResponseWriter, r *http.Request) {
if err := storageServerRequestValidate(r); err != nil {
s.writeErrorResponse(w, err)
return
}
info, err := s.storage.GetDiskID()
if err != nil {
s.writeErrorResponse(w, err)
return
}
defer w.(http.Flusher).Flush()
gob.NewEncoder(w).Encode(info)
}
func (s *storageRESTServer) CrawlAndGetDataUsageHandler(w http.ResponseWriter, r *http.Request) {
if !s.IsValid(w, r) {
return
@ -784,6 +800,7 @@ func registerStorageRESTHandlers(router *mux.Router, endpointZones EndpointZones
subrouter := router.PathPrefix(path.Join(storageRESTPrefix, endpoint.Path)).Subrouter()
subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodDiskInfo).HandlerFunc(httpTraceHdrs(server.DiskInfoHandler))
subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodGetDiskID).HandlerFunc(httpTraceHdrs(server.GetDiskIDHandler))
subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodCrawlAndGetDataUsage).HandlerFunc(httpTraceHdrs(server.CrawlAndGetDataUsageHandler))
subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodMakeVol).HandlerFunc(httpTraceHdrs(server.MakeVolHandler)).Queries(restQueries(storageRESTVolume)...)
subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodMakeVolBulk).HandlerFunc(httpTraceHdrs(server.MakeVolBulkHandler)).Queries(restQueries(storageRESTVolumes)...)

Loading…
Cancel
Save