diff --git a/cmd/erasure.go b/cmd/erasure.go index 297b7ea38..e5815b9b7 100644 --- a/cmd/erasure.go +++ b/cmd/erasure.go @@ -197,6 +197,7 @@ func getDisksInfo(disks []StorageAPI, endpoints []string) (disksInfo []madmin.Di RootDisk: info.RootDisk, Healing: info.Healing, State: diskErrToDriveState(err), + FreeInodes: info.FreeInodes, } di.PoolIndex, di.SetIndex, di.DiskIndex = disks[index].GetDiskLoc() if info.Healing { diff --git a/cmd/metrics-v2.go b/cmd/metrics-v2.go index d211629c3..2183b4f88 100644 --- a/cmd/metrics-v2.go +++ b/cmd/metrics-v2.go @@ -93,6 +93,7 @@ const ( timestampTotal MetricName = "timestamp_total" writeTotal MetricName = "write_total" total MetricName = "total" + freeInodes MetricName = "free_inodes" failedCount MetricName = "failed_count" failedBytes MetricName = "failed_bytes" @@ -352,6 +353,16 @@ func getClusterDisksTotalMD() MetricDescription { } } +func getClusterDisksFreeInodes() MetricDescription { + return MetricDescription{ + Namespace: clusterMetricNamespace, + Subsystem: diskSubsystem, + Name: freeInodes, + Help: "Total free inodes.", + Type: gaugeMetric, + } +} + func getNodeDiskTotalBytesMD() MetricDescription { return MetricDescription{ Namespace: nodeMetricNamespace, @@ -1386,6 +1397,12 @@ func getLocalStorageMetrics() MetricsGroup { Value: float64(disk.TotalSpace), VariableLabels: map[string]string{"disk": disk.DrivePath}, }) + + metrics = append(metrics, Metric{ + Description: getClusterDisksFreeInodes(), + Value: float64(disk.FreeInodes), + VariableLabels: map[string]string{"disk": disk.DrivePath}, + }) } return }, diff --git a/cmd/storage-datatypes.go b/cmd/storage-datatypes.go index 239bc9830..73daad7aa 100644 --- a/cmd/storage-datatypes.go +++ b/cmd/storage-datatypes.go @@ -32,6 +32,7 @@ type DiskInfo struct { Free uint64 Used uint64 UsedInodes uint64 + FreeInodes uint64 FSType string RootDisk bool Healing bool diff --git a/cmd/storage-datatypes_gen.go b/cmd/storage-datatypes_gen.go index cb833c600..073255188 100644 --- a/cmd/storage-datatypes_gen.go +++ b/cmd/storage-datatypes_gen.go @@ -14,8 +14,8 @@ func (z *DiskInfo) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err) return } - if zb0001 != 12 { - err = msgp.ArrayError{Wanted: 12, Got: zb0001} + if zb0001 != 13 { + err = msgp.ArrayError{Wanted: 13, Got: zb0001} return } z.Total, err = dc.ReadUint64() @@ -38,6 +38,11 @@ func (z *DiskInfo) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "UsedInodes") return } + z.FreeInodes, err = dc.ReadUint64() + if err != nil { + err = msgp.WrapError(err, "FreeInodes") + return + } z.FSType, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "FSType") @@ -83,8 +88,8 @@ func (z *DiskInfo) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *DiskInfo) EncodeMsg(en *msgp.Writer) (err error) { - // array header, size 12 - err = en.Append(0x9c) + // array header, size 13 + err = en.Append(0x9d) if err != nil { return } @@ -108,6 +113,11 @@ func (z *DiskInfo) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "UsedInodes") return } + err = en.WriteUint64(z.FreeInodes) + if err != nil { + err = msgp.WrapError(err, "FreeInodes") + return + } err = en.WriteString(z.FSType) if err != nil { err = msgp.WrapError(err, "FSType") @@ -154,12 +164,13 @@ func (z *DiskInfo) EncodeMsg(en *msgp.Writer) (err error) { // MarshalMsg implements msgp.Marshaler func (z *DiskInfo) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // array header, size 12 - o = append(o, 0x9c) + // array header, size 13 + o = append(o, 0x9d) o = msgp.AppendUint64(o, z.Total) o = msgp.AppendUint64(o, z.Free) o = msgp.AppendUint64(o, z.Used) o = msgp.AppendUint64(o, z.UsedInodes) + o = msgp.AppendUint64(o, z.FreeInodes) o = msgp.AppendString(o, z.FSType) o = msgp.AppendBool(o, z.RootDisk) o = msgp.AppendBool(o, z.Healing) @@ -183,8 +194,8 @@ func (z *DiskInfo) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err) return } - if zb0001 != 12 { - err = msgp.ArrayError{Wanted: 12, Got: zb0001} + if zb0001 != 13 { + err = msgp.ArrayError{Wanted: 13, Got: zb0001} return } z.Total, bts, err = msgp.ReadUint64Bytes(bts) @@ -207,6 +218,11 @@ func (z *DiskInfo) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "UsedInodes") return } + z.FreeInodes, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "FreeInodes") + return + } z.FSType, bts, err = msgp.ReadStringBytes(bts) if err != nil { err = msgp.WrapError(err, "FSType") @@ -253,7 +269,7 @@ func (z *DiskInfo) UnmarshalMsg(bts []byte) (o []byte, err error) { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *DiskInfo) Msgsize() (s int) { - s = 1 + msgp.Uint64Size + msgp.Uint64Size + msgp.Uint64Size + msgp.Uint64Size + msgp.StringPrefixSize + len(z.FSType) + msgp.BoolSize + msgp.BoolSize + msgp.StringPrefixSize + len(z.Endpoint) + msgp.StringPrefixSize + len(z.MountPath) + msgp.StringPrefixSize + len(z.ID) + z.Metrics.Msgsize() + msgp.StringPrefixSize + len(z.Error) + s = 1 + msgp.Uint64Size + msgp.Uint64Size + msgp.Uint64Size + msgp.Uint64Size + msgp.Uint64Size + msgp.StringPrefixSize + len(z.FSType) + msgp.BoolSize + msgp.BoolSize + msgp.StringPrefixSize + len(z.Endpoint) + msgp.StringPrefixSize + len(z.MountPath) + msgp.StringPrefixSize + len(z.ID) + z.Metrics.Msgsize() + msgp.StringPrefixSize + len(z.Error) return } diff --git a/cmd/storage-rest-common.go b/cmd/storage-rest-common.go index 67d790ba4..6b9bb181e 100644 --- a/cmd/storage-rest-common.go +++ b/cmd/storage-rest-common.go @@ -18,7 +18,7 @@ package cmd const ( - storageRESTVersion = "v32" // Added transition related information to FileInfo + storageRESTVersion = "v33" // Added transition related information to FileInfo storageRESTVersionPrefix = SlashSeparator + storageRESTVersion storageRESTPrefix = minioReservedBucketPath + "/storage" ) diff --git a/cmd/xl-storage.go b/cmd/xl-storage.go index cd9160cfc..3ad7580cd 100644 --- a/cmd/xl-storage.go +++ b/cmd/xl-storage.go @@ -471,6 +471,7 @@ func (s *xlStorage) DiskInfo(context.Context) (info DiskInfo, err error) { dcinfo.Free = di.Free dcinfo.Used = di.Used dcinfo.UsedInodes = di.Files - di.Ffree + dcinfo.FreeInodes = di.Ffree dcinfo.FSType = di.FSType diskID, err := s.GetDiskID()