Merge pull request #87 from tonistiigi/snapshot-metadata

cache: add more metadata to snapshots
docker-18.09
Akihiro Suda 2017-07-27 09:36:10 +09:00 committed by GitHub
commit 39b9dec52f
14 changed files with 690 additions and 134 deletions

View File

@ -29,8 +29,8 @@ import math "math"
import _ "github.com/gogo/protobuf/gogoproto"
import _ "github.com/golang/protobuf/ptypes/timestamp"
import github_com_opencontainers_go_digest "github.com/opencontainers/go-digest"
import time "time"
import github_com_opencontainers_go_digest "github.com/opencontainers/go-digest"
import (
context "golang.org/x/net/context"
@ -54,6 +54,7 @@ var _ = time.Kitchen
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type DiskUsageRequest struct {
Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"`
}
func (m *DiskUsageRequest) Reset() { *m = DiskUsageRequest{} }
@ -61,6 +62,13 @@ func (m *DiskUsageRequest) String() string { return proto.CompactText
func (*DiskUsageRequest) ProtoMessage() {}
func (*DiskUsageRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{0} }
func (m *DiskUsageRequest) GetFilter() string {
if m != nil {
return m.Filter
}
return ""
}
type DiskUsageResponse struct {
Record []*UsageRecord `protobuf:"bytes,1,rep,name=record" json:"record,omitempty"`
}
@ -78,10 +86,15 @@ func (m *DiskUsageResponse) GetRecord() []*UsageRecord {
}
type UsageRecord struct {
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
Mutable bool `protobuf:"varint,2,opt,name=Mutable,proto3" json:"Mutable,omitempty"`
InUse bool `protobuf:"varint,3,opt,name=InUse,proto3" json:"InUse,omitempty"`
Size_ int64 `protobuf:"varint,4,opt,name=Size,proto3" json:"Size,omitempty"`
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
Mutable bool `protobuf:"varint,2,opt,name=Mutable,proto3" json:"Mutable,omitempty"`
InUse bool `protobuf:"varint,3,opt,name=InUse,proto3" json:"InUse,omitempty"`
Size_ int64 `protobuf:"varint,4,opt,name=Size,proto3" json:"Size,omitempty"`
Parent string `protobuf:"bytes,5,opt,name=Parent,proto3" json:"Parent,omitempty"`
CreatedAt time.Time `protobuf:"bytes,6,opt,name=CreatedAt,stdtime" json:"CreatedAt"`
LastUsedAt *time.Time `protobuf:"bytes,7,opt,name=LastUsedAt,stdtime" json:"LastUsedAt,omitempty"`
UsageCount int64 `protobuf:"varint,8,opt,name=UsageCount,proto3" json:"UsageCount,omitempty"`
Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"`
}
func (m *UsageRecord) Reset() { *m = UsageRecord{} }
@ -117,6 +130,41 @@ func (m *UsageRecord) GetSize_() int64 {
return 0
}
func (m *UsageRecord) GetParent() string {
if m != nil {
return m.Parent
}
return ""
}
func (m *UsageRecord) GetCreatedAt() time.Time {
if m != nil {
return m.CreatedAt
}
return time.Time{}
}
func (m *UsageRecord) GetLastUsedAt() *time.Time {
if m != nil {
return m.LastUsedAt
}
return nil
}
func (m *UsageRecord) GetUsageCount() int64 {
if m != nil {
return m.UsageCount
}
return 0
}
func (m *UsageRecord) GetDescription() string {
if m != nil {
return m.Description
}
return ""
}
type SolveRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
Definition [][]byte `protobuf:"bytes,2,rep,name=Definition" json:"Definition,omitempty"`
@ -655,6 +703,12 @@ func (m *DiskUsageRequest) MarshalTo(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Filter) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintControl(dAtA, i, uint64(len(m.Filter)))
i += copy(dAtA[i:], m.Filter)
}
return i, nil
}
@ -734,6 +788,41 @@ func (m *UsageRecord) MarshalTo(dAtA []byte) (int, error) {
i++
i = encodeVarintControl(dAtA, i, uint64(m.Size_))
}
if len(m.Parent) > 0 {
dAtA[i] = 0x2a
i++
i = encodeVarintControl(dAtA, i, uint64(len(m.Parent)))
i += copy(dAtA[i:], m.Parent)
}
dAtA[i] = 0x32
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt)))
n1, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i:])
if err != nil {
return 0, err
}
i += n1
if m.LastUsedAt != nil {
dAtA[i] = 0x3a
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastUsedAt)))
n2, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastUsedAt, dAtA[i:])
if err != nil {
return 0, err
}
i += n2
}
if m.UsageCount != 0 {
dAtA[i] = 0x40
i++
i = encodeVarintControl(dAtA, i, uint64(m.UsageCount))
}
if len(m.Description) > 0 {
dAtA[i] = 0x4a
i++
i = encodeVarintControl(dAtA, i, uint64(len(m.Description)))
i += copy(dAtA[i:], m.Description)
}
return i, nil
}
@ -962,21 +1051,21 @@ func (m *Vertex) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started)))
n1, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i:])
n3, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i:])
if err != nil {
return 0, err
}
i += n1
i += n3
}
if m.Completed != nil {
dAtA[i] = 0x32
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed)))
n2, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i:])
n4, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i:])
if err != nil {
return 0, err
}
i += n2
i += n4
}
if len(m.Error) > 0 {
dAtA[i] = 0x3a
@ -1039,30 +1128,30 @@ func (m *VertexStatus) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x32
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp)))
n3, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i:])
n5, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i:])
if err != nil {
return 0, err
}
i += n3
i += n5
if m.Started != nil {
dAtA[i] = 0x3a
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started)))
n4, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i:])
n6, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i:])
if err != nil {
return 0, err
}
i += n4
i += n6
}
if m.Completed != nil {
dAtA[i] = 0x42
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.Completed)))
n5, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i:])
n7, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Completed, dAtA[i:])
if err != nil {
return 0, err
}
i += n5
i += n7
}
return i, nil
}
@ -1091,11 +1180,11 @@ func (m *VertexLog) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintControl(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp)))
n6, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i:])
n8, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i:])
if err != nil {
return 0, err
}
i += n6
i += n8
if m.Stream != 0 {
dAtA[i] = 0x18
i++
@ -1164,6 +1253,10 @@ func encodeVarintControl(dAtA []byte, offset int, v uint64) int {
func (m *DiskUsageRequest) Size() (n int) {
var l int
_ = l
l = len(m.Filter)
if l > 0 {
n += 1 + l + sovControl(uint64(l))
}
return n
}
@ -1195,6 +1288,23 @@ func (m *UsageRecord) Size() (n int) {
if m.Size_ != 0 {
n += 1 + sovControl(uint64(m.Size_))
}
l = len(m.Parent)
if l > 0 {
n += 1 + l + sovControl(uint64(l))
}
l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt)
n += 1 + l + sovControl(uint64(l))
if m.LastUsedAt != nil {
l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastUsedAt)
n += 1 + l + sovControl(uint64(l))
}
if m.UsageCount != 0 {
n += 1 + sovControl(uint64(m.UsageCount))
}
l = len(m.Description)
if l > 0 {
n += 1 + l + sovControl(uint64(l))
}
return n
}
@ -1420,6 +1530,35 @@ func (m *DiskUsageRequest) Unmarshal(dAtA []byte) error {
return fmt.Errorf("proto: DiskUsageRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Filter", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Filter = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipControl(dAtA[iNdEx:])
@ -1639,6 +1778,146 @@ func (m *UsageRecord) Unmarshal(dAtA []byte) error {
break
}
}
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Parent", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Parent = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CreatedAt", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CreatedAt, dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field LastUsedAt", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.LastUsedAt == nil {
m.LastUsedAt = new(time.Time)
}
if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.LastUsedAt, dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 8:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field UsageCount", wireType)
}
m.UsageCount = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.UsageCount |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Description = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipControl(dAtA[iNdEx:])
@ -3145,58 +3424,64 @@ var (
func init() { proto.RegisterFile("control.proto", fileDescriptorControl) }
var fileDescriptorControl = []byte{
// 844 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x55, 0xdd, 0x8e, 0xdb, 0x44,
0x14, 0x66, 0xec, 0xac, 0x93, 0x9c, 0xcd, 0x56, 0xcb, 0x08, 0x55, 0x96, 0x11, 0x49, 0x30, 0x37,
0x51, 0xa5, 0x7a, 0xdb, 0x00, 0x12, 0x5a, 0x24, 0x04, 0x21, 0x95, 0xd8, 0x15, 0x7b, 0x33, 0xdb,
0xc2, 0xb5, 0x93, 0x9c, 0x75, 0xad, 0x75, 0x3c, 0x61, 0x66, 0x1c, 0x6d, 0x78, 0x0a, 0x78, 0x0d,
0x6e, 0x79, 0x06, 0x44, 0x2f, 0xb9, 0xe6, 0xa2, 0xa0, 0x7d, 0x00, 0x9e, 0x01, 0xcd, 0x8c, 0x9d,
0x7a, 0x9b, 0x4d, 0x7f, 0xd2, 0x2b, 0xcf, 0x19, 0x7f, 0xe7, 0xef, 0x3b, 0x3f, 0x03, 0x07, 0x53,
0x9e, 0x2b, 0xc1, 0xb3, 0x68, 0x21, 0xb8, 0xe2, 0xf4, 0x70, 0xce, 0x27, 0xab, 0x68, 0x52, 0xa4,
0xd9, 0xec, 0x32, 0x55, 0xd1, 0xf2, 0x61, 0x70, 0x3f, 0x49, 0xd5, 0xd3, 0x62, 0x12, 0x4d, 0xf9,
0xfc, 0x28, 0xe1, 0x09, 0x3f, 0x32, 0xc0, 0x49, 0x71, 0x61, 0x24, 0x23, 0x98, 0x93, 0x35, 0x10,
0xf4, 0x12, 0xce, 0x93, 0x0c, 0x5f, 0xa0, 0x54, 0x3a, 0x47, 0xa9, 0xe2, 0xf9, 0xc2, 0x02, 0x42,
0x0a, 0x87, 0xe3, 0x54, 0x5e, 0x3e, 0x91, 0x71, 0x82, 0x0c, 0x7f, 0x2a, 0x50, 0xaa, 0xf0, 0x14,
0xde, 0xaf, 0xdd, 0xc9, 0x05, 0xcf, 0x25, 0xd2, 0xcf, 0xc1, 0x13, 0x38, 0xe5, 0x62, 0xe6, 0x93,
0xbe, 0x3b, 0xd8, 0x1f, 0x7e, 0x14, 0xbd, 0x1c, 0x5b, 0x54, 0x2a, 0x68, 0x10, 0x2b, 0xc1, 0x61,
0x0c, 0xfb, 0xb5, 0x6b, 0x7a, 0x07, 0x9c, 0x93, 0xb1, 0x4f, 0xfa, 0x64, 0xd0, 0x66, 0xce, 0xc9,
0x98, 0xfa, 0xd0, 0x3c, 0x2b, 0x54, 0x3c, 0xc9, 0xd0, 0x77, 0xfa, 0x64, 0xd0, 0x62, 0x95, 0x48,
0x3f, 0x80, 0xbd, 0x93, 0xfc, 0x89, 0x44, 0xdf, 0x35, 0xf7, 0x56, 0xa0, 0x14, 0x1a, 0xe7, 0xe9,
0xcf, 0xe8, 0x37, 0xfa, 0x64, 0xe0, 0x32, 0x73, 0x0e, 0x7f, 0x75, 0xa0, 0x73, 0xce, 0xb3, 0x65,
0x15, 0x3f, 0x3d, 0x04, 0x97, 0xe1, 0x45, 0xe9, 0x45, 0x1f, 0x69, 0x17, 0x60, 0x8c, 0x17, 0x69,
0x9e, 0xaa, 0x94, 0xe7, 0xbe, 0xd3, 0x77, 0x07, 0x1d, 0x56, 0xbb, 0xa1, 0x01, 0xb4, 0x1e, 0x5d,
0x2d, 0xb8, 0x50, 0x28, 0x8c, 0xbf, 0x36, 0x5b, 0xcb, 0xf4, 0x47, 0x38, 0xa8, 0xce, 0xdf, 0x28,
0x25, 0xa4, 0xdf, 0x30, 0xf9, 0x3f, 0xdc, 0xcc, 0xbf, 0x1e, 0x44, 0x74, 0x43, 0xe7, 0x51, 0xae,
0xc4, 0x8a, 0xdd, 0xb4, 0xa3, 0x73, 0x3f, 0x47, 0x29, 0x75, 0x44, 0x7b, 0xc6, 0x67, 0x25, 0x06,
0x5f, 0x03, 0xdd, 0x54, 0xd7, 0x69, 0x5d, 0xe2, 0xaa, 0x4a, 0xeb, 0x12, 0x57, 0x9a, 0xa3, 0x65,
0x9c, 0x15, 0x96, 0xbb, 0x36, 0xb3, 0xc2, 0xb1, 0xf3, 0x05, 0x09, 0xbf, 0x84, 0x83, 0x32, 0x9a,
0xb2, 0x7c, 0xf7, 0xc0, 0x5d, 0xaa, 0xab, 0xb2, 0x76, 0xfe, 0x66, 0xec, 0x3f, 0xa0, 0x50, 0x78,
0xc5, 0x34, 0x28, 0xfc, 0x18, 0x0e, 0xce, 0x55, 0xac, 0x0a, 0xb9, 0x95, 0xd0, 0xf0, 0x77, 0x02,
0x77, 0x2a, 0x4c, 0xe9, 0xe1, 0x33, 0x68, 0x2d, 0x8d, 0x11, 0x94, 0xaf, 0x75, 0xb3, 0x46, 0xd2,
0x63, 0x68, 0x49, 0x63, 0x07, 0xa5, 0xa9, 0xcb, 0xfe, 0xb0, 0xbb, 0x4d, 0xab, 0xf4, 0xb7, 0xc6,
0xd3, 0x23, 0x68, 0x64, 0x3c, 0x91, 0xbe, 0x6b, 0xf4, 0x3e, 0xdc, 0xa6, 0xf7, 0x3d, 0x4f, 0x98,
0x01, 0x86, 0xbf, 0xb9, 0xe0, 0xd9, 0x3b, 0x7a, 0x0a, 0xde, 0x2c, 0x4d, 0x50, 0x2a, 0x9b, 0xd5,
0x68, 0xf8, 0xec, 0x79, 0xef, 0xbd, 0xbf, 0x9f, 0xf7, 0xee, 0xd5, 0xe6, 0x8b, 0x2f, 0x30, 0xd7,
0xf3, 0x18, 0xa7, 0x39, 0x0a, 0x79, 0x94, 0xf0, 0xfb, 0x56, 0x25, 0x1a, 0x9b, 0x0f, 0x2b, 0x2d,
0x68, 0x5b, 0x69, 0xbe, 0x28, 0x94, 0xcd, 0x60, 0x47, 0x5b, 0xd6, 0x82, 0x6e, 0xf0, 0x3c, 0x9e,
0x63, 0xd9, 0x85, 0xe6, 0x4c, 0xef, 0x82, 0x37, 0x8d, 0xa7, 0x4f, 0x71, 0x66, 0xda, 0xbe, 0xc5,
0x4a, 0x89, 0x1e, 0x43, 0x53, 0xaa, 0x58, 0x28, 0x9c, 0x99, 0x06, 0xda, 0x1f, 0x06, 0x91, 0x1d,
0xf7, 0xa8, 0x1a, 0xf7, 0xe8, 0x71, 0x35, 0xee, 0xa3, 0xc6, 0x2f, 0xff, 0xf4, 0x08, 0xab, 0x14,
0xe8, 0x57, 0xd0, 0x9e, 0xf2, 0xf9, 0x22, 0x43, 0xad, 0xed, 0xbd, 0xa1, 0xf6, 0x0b, 0x15, 0xdd,
0x7a, 0x28, 0x04, 0x17, 0x7e, 0xd3, 0xb6, 0x9e, 0x11, 0x34, 0x13, 0x8b, 0x58, 0x60, 0xae, 0xfc,
0xd6, 0xee, 0xac, 0x5a, 0x0b, 0xe1, 0x7f, 0x0e, 0x74, 0xea, 0x85, 0xdf, 0xd8, 0x1d, 0xa7, 0xe0,
0xd9, 0x36, 0xb2, 0xed, 0xbf, 0x9b, 0x33, 0x6b, 0xe1, 0x56, 0xda, 0x7d, 0x68, 0x4e, 0x0b, 0x61,
0xb2, 0xb1, 0xeb, 0xa6, 0x12, 0x75, 0xf2, 0x8a, 0xab, 0x38, 0x33, 0xb4, 0xbb, 0xcc, 0x0a, 0x74,
0x04, 0xed, 0xf5, 0x76, 0x7d, 0x03, 0x4a, 0x5b, 0x3a, 0x5c, 0x4b, 0xeb, 0x5a, 0xad, 0x5e, 0xd2,
0xe6, 0x3b, 0x95, 0xb4, 0xf5, 0xd6, 0x25, 0x0d, 0xff, 0x20, 0xd0, 0x5e, 0x4f, 0x4c, 0x8d, 0x5d,
0xf2, 0xce, 0xec, 0xde, 0x60, 0xc6, 0xd9, 0x8d, 0x99, 0xbb, 0xe0, 0x49, 0x25, 0x30, 0x9e, 0x9b,
0x1a, 0xb9, 0xac, 0x94, 0xf4, 0x6e, 0x9a, 0xcb, 0xc4, 0x54, 0xa8, 0xc3, 0xf4, 0x31, 0x0c, 0xa1,
0x33, 0x5a, 0x29, 0x94, 0x67, 0x28, 0xf5, 0xcb, 0xa3, 0x6b, 0x3b, 0x8b, 0x55, 0x6c, 0xf2, 0xe8,
0x30, 0x73, 0x1e, 0xfe, 0xe9, 0x40, 0xf3, 0x5b, 0xfb, 0xd4, 0xd2, 0xc7, 0xd0, 0x5e, 0x3f, 0x77,
0x34, 0xdc, 0xdc, 0x22, 0x2f, 0xbf, 0x8f, 0xc1, 0x27, 0xaf, 0xc4, 0x94, 0xeb, 0xf0, 0x3b, 0xd8,
0x33, 0x1b, 0x98, 0x76, 0x5f, 0xfd, 0x50, 0x04, 0xbd, 0xad, 0xff, 0x4b, 0x4b, 0x67, 0xe0, 0x95,
0x13, 0x70, 0x1b, 0xb4, 0xbe, 0xa8, 0x83, 0xfe, 0x76, 0x80, 0x35, 0xf6, 0x80, 0xd0, 0xb3, 0xf5,
0xb3, 0x73, 0x5b, 0x68, 0x75, 0xe6, 0x82, 0xd7, 0xfc, 0x1f, 0x90, 0x07, 0x64, 0xd4, 0x79, 0x76,
0xdd, 0x25, 0x7f, 0x5d, 0x77, 0xc9, 0xbf, 0xd7, 0x5d, 0x32, 0xf1, 0x4c, 0x39, 0x3f, 0xfd, 0x3f,
0x00, 0x00, 0xff, 0xff, 0x03, 0x3d, 0x42, 0x9c, 0xc8, 0x08, 0x00, 0x00,
// 929 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x56, 0xc1, 0x6e, 0xdb, 0x46,
0x10, 0x2d, 0x49, 0x99, 0x92, 0x46, 0x72, 0xe0, 0x2e, 0x8a, 0x80, 0x50, 0x51, 0x49, 0x65, 0x2f,
0x82, 0x81, 0xd0, 0x89, 0xda, 0x02, 0x85, 0x0b, 0x14, 0x89, 0xac, 0x00, 0xb5, 0x11, 0x03, 0xc5,
0x3a, 0x6e, 0xcf, 0x94, 0x34, 0x66, 0x08, 0x53, 0x5c, 0x75, 0x77, 0x29, 0x58, 0xfd, 0x8a, 0xf6,
0x37, 0x7a, 0xed, 0x17, 0xf4, 0x50, 0x34, 0xc7, 0x9e, 0x7b, 0x48, 0x0b, 0x7f, 0x40, 0xbf, 0xa1,
0xd8, 0x5d, 0x92, 0xa6, 0x23, 0x2b, 0x4e, 0x9c, 0x93, 0x76, 0x56, 0x33, 0x6f, 0x77, 0xde, 0x9b,
0x99, 0x25, 0x6c, 0x4f, 0x59, 0x2a, 0x39, 0x4b, 0x82, 0x05, 0x67, 0x92, 0x91, 0x9d, 0x39, 0x9b,
0xac, 0x82, 0x49, 0x16, 0x27, 0xb3, 0xf3, 0x58, 0x06, 0xcb, 0x47, 0x9d, 0x07, 0x51, 0x2c, 0x5f,
0x64, 0x93, 0x60, 0xca, 0xe6, 0x7b, 0x11, 0x8b, 0xd8, 0x9e, 0x76, 0x9c, 0x64, 0x67, 0xda, 0xd2,
0x86, 0x5e, 0x19, 0x80, 0x4e, 0x2f, 0x62, 0x2c, 0x4a, 0xf0, 0xca, 0x4b, 0xc6, 0x73, 0x14, 0x32,
0x9c, 0x2f, 0x8c, 0x83, 0xbf, 0x0b, 0x3b, 0xe3, 0x58, 0x9c, 0x9f, 0x8a, 0x30, 0x42, 0x8a, 0x3f,
0x66, 0x28, 0x24, 0xb9, 0x0f, 0xee, 0x59, 0x9c, 0x48, 0xe4, 0x9e, 0xd5, 0xb7, 0x06, 0x4d, 0x9a,
0x5b, 0xfe, 0x11, 0x7c, 0x58, 0xf1, 0x15, 0x0b, 0x96, 0x0a, 0x24, 0x5f, 0x82, 0xcb, 0x71, 0xca,
0xf8, 0xcc, 0xb3, 0xfa, 0xce, 0xa0, 0x35, 0xfc, 0x24, 0x78, 0xfd, 0xce, 0x41, 0x1e, 0xa0, 0x9c,
0x68, 0xee, 0xec, 0xff, 0x6e, 0x43, 0xab, 0xb2, 0x4f, 0xee, 0x81, 0x7d, 0x38, 0xce, 0xcf, 0xb3,
0x0f, 0xc7, 0xc4, 0x83, 0xfa, 0x71, 0x26, 0xc3, 0x49, 0x82, 0x9e, 0xdd, 0xb7, 0x06, 0x0d, 0x5a,
0x98, 0xe4, 0x23, 0xd8, 0x3a, 0x4c, 0x4f, 0x05, 0x7a, 0x8e, 0xde, 0x37, 0x06, 0x21, 0x50, 0x3b,
0x89, 0x7f, 0x42, 0xaf, 0xd6, 0xb7, 0x06, 0x0e, 0xd5, 0x6b, 0x95, 0xc7, 0x77, 0x21, 0xc7, 0x54,
0x7a, 0x5b, 0x26, 0x0f, 0x63, 0x91, 0x11, 0x34, 0x0f, 0x38, 0x86, 0x12, 0x67, 0x4f, 0xa4, 0xe7,
0xf6, 0xad, 0x41, 0x6b, 0xd8, 0x09, 0x0c, 0x51, 0x41, 0x41, 0x54, 0xf0, 0xbc, 0x20, 0x6a, 0xd4,
0x78, 0xf9, 0xaa, 0xf7, 0xc1, 0xcf, 0xff, 0xf4, 0x2c, 0x7a, 0x15, 0x46, 0x1e, 0x03, 0x3c, 0x0b,
0x85, 0x3c, 0x15, 0x1a, 0xa4, 0x7e, 0x2b, 0x48, 0x4d, 0x03, 0x54, 0x62, 0x48, 0x17, 0x40, 0x13,
0x70, 0xc0, 0xb2, 0x54, 0x7a, 0x0d, 0x7d, 0xef, 0xca, 0x0e, 0xe9, 0x43, 0x6b, 0x8c, 0x62, 0xca,
0xe3, 0x85, 0x8c, 0x59, 0xea, 0x35, 0x75, 0x0a, 0xd5, 0x2d, 0xff, 0x17, 0x1b, 0xda, 0x27, 0x2c,
0x59, 0x96, 0xc2, 0xed, 0x80, 0x43, 0xf1, 0x2c, 0x67, 0x51, 0x2d, 0xd5, 0x21, 0x63, 0x3c, 0x8b,
0xd3, 0x58, 0x63, 0xd8, 0x7d, 0x67, 0xd0, 0xa6, 0x95, 0x1d, 0xd2, 0x81, 0xc6, 0xd3, 0x8b, 0x05,
0xe3, 0x4a, 0x6c, 0x47, 0x87, 0x95, 0x36, 0xf9, 0x01, 0xb6, 0x8b, 0xf5, 0x13, 0x29, 0xb9, 0xf0,
0x6a, 0x5a, 0xe0, 0x47, 0xeb, 0x02, 0x57, 0x2f, 0x11, 0x5c, 0x8b, 0x79, 0x9a, 0x4a, 0xbe, 0xa2,
0xd7, 0x71, 0x94, 0xb6, 0x27, 0x28, 0x84, 0xba, 0x91, 0x11, 0xa6, 0x30, 0x3b, 0x8f, 0x81, 0xac,
0x87, 0xab, 0xb4, 0xce, 0x71, 0x55, 0xa4, 0x75, 0x8e, 0x2b, 0x55, 0x03, 0xcb, 0x30, 0xc9, 0x4c,
0x6d, 0x34, 0xa9, 0x31, 0xf6, 0xed, 0xaf, 0x2c, 0xff, 0x6b, 0xd8, 0xce, 0x6f, 0x93, 0xd7, 0xe7,
0x2e, 0x38, 0x4b, 0x79, 0x91, 0x17, 0xa7, 0xb7, 0x7e, 0xf7, 0xef, 0x91, 0x4b, 0xbc, 0xa0, 0xca,
0xc9, 0xff, 0x14, 0xb6, 0x4f, 0x64, 0x28, 0x33, 0xb1, 0x91, 0x50, 0xff, 0x37, 0x0b, 0xee, 0x15,
0x3e, 0xf9, 0x09, 0x5f, 0x40, 0x63, 0xa9, 0x41, 0x50, 0xdc, 0x7a, 0x4c, 0xe9, 0x49, 0xf6, 0xa1,
0x21, 0x34, 0x0e, 0x0a, 0xad, 0x4b, 0x6b, 0xd8, 0xdd, 0x14, 0x95, 0x9f, 0x57, 0xfa, 0x93, 0x3d,
0xa8, 0x25, 0x2c, 0x12, 0x9e, 0xa3, 0xe3, 0x3e, 0xde, 0x14, 0xf7, 0x8c, 0x45, 0x54, 0x3b, 0xfa,
0xbf, 0x3a, 0xe0, 0x9a, 0x3d, 0x72, 0x04, 0xee, 0x2c, 0x8e, 0x50, 0x48, 0x93, 0xd5, 0x68, 0xa8,
0xaa, 0xfb, 0xef, 0x57, 0xbd, 0xdd, 0xca, 0x60, 0x61, 0x0b, 0x4c, 0xd5, 0x20, 0x0a, 0xe3, 0x14,
0xb9, 0xd8, 0x8b, 0xd8, 0x03, 0x13, 0x12, 0x8c, 0xf5, 0x0f, 0xcd, 0x11, 0x14, 0x56, 0x9c, 0x2e,
0x32, 0x69, 0x32, 0xb8, 0x23, 0x96, 0x41, 0x50, 0x0d, 0x9c, 0x86, 0x73, 0xcc, 0xab, 0x50, 0xaf,
0x55, 0x03, 0x4f, 0xc3, 0xe9, 0x0b, 0x9c, 0xe9, 0xb6, 0x6e, 0xd0, 0xdc, 0x22, 0xfb, 0x50, 0x17,
0x32, 0xe4, 0x12, 0x67, 0xba, 0x80, 0xde, 0xa6, 0xf3, 0x8a, 0x00, 0xf2, 0x0d, 0x34, 0xa7, 0x6c,
0xbe, 0x48, 0x50, 0x45, 0xbb, 0x6f, 0x19, 0x7d, 0x15, 0xa2, 0x4a, 0x0f, 0x39, 0x67, 0x5c, 0xf7,
0x7c, 0x93, 0x1a, 0x43, 0x31, 0xb1, 0x30, 0xa3, 0xa6, 0x71, 0x77, 0x56, 0x0d, 0x82, 0xff, 0x9f,
0x0d, 0xed, 0xaa, 0xf0, 0x6b, 0xb3, 0xf1, 0x08, 0x5c, 0x53, 0x46, 0xa6, 0xfc, 0xef, 0x76, 0x98,
0x41, 0xb8, 0x91, 0x76, 0x0f, 0xea, 0xd3, 0x8c, 0xeb, 0x6c, 0xcc, 0x38, 0x2d, 0x4c, 0x95, 0xbc,
0x64, 0x32, 0x4c, 0x34, 0xed, 0x0e, 0x35, 0x86, 0x9a, 0xa7, 0xe5, 0xb3, 0xf2, 0x6e, 0xf3, 0xb4,
0x0c, 0xab, 0x4a, 0x5a, 0x7f, 0x2f, 0x49, 0x1b, 0xef, 0x2c, 0xa9, 0xff, 0x87, 0x05, 0xcd, 0xb2,
0x63, 0x2a, 0xec, 0x5a, 0xef, 0xcd, 0xee, 0x35, 0x66, 0xec, 0xbb, 0x31, 0x73, 0x1f, 0x5c, 0x21,
0x39, 0x86, 0x73, 0xad, 0x91, 0x43, 0x73, 0x4b, 0xcd, 0xa6, 0xb9, 0x88, 0xb4, 0x42, 0x6d, 0xaa,
0x96, 0xbe, 0x0f, 0xed, 0xd1, 0x4a, 0xa2, 0x38, 0x46, 0xa1, 0x9e, 0x11, 0xa5, 0xed, 0x2c, 0x94,
0xa1, 0xce, 0xa3, 0x4d, 0xf5, 0x7a, 0xf8, 0xa7, 0x0d, 0xf5, 0x03, 0xf3, 0x8d, 0x41, 0x9e, 0x43,
0xb3, 0x7c, 0xcf, 0x89, 0xbf, 0x3e, 0x45, 0x5e, 0xff, 0x30, 0xe8, 0x7c, 0xf6, 0x46, 0x9f, 0x7c,
0x1c, 0x7e, 0x0b, 0x5b, 0x7a, 0x02, 0x93, 0xee, 0x9b, 0x1f, 0x8a, 0x4e, 0x6f, 0xe3, 0xff, 0x39,
0xd2, 0x31, 0xb8, 0x79, 0x07, 0xdc, 0xe4, 0x5a, 0x1d, 0xd4, 0x9d, 0xfe, 0x66, 0x07, 0x03, 0xf6,
0xd0, 0x22, 0xc7, 0xe5, 0xb3, 0x73, 0xd3, 0xd5, 0xaa, 0xcc, 0x75, 0x6e, 0xf9, 0x7f, 0x60, 0x3d,
0xb4, 0x46, 0xed, 0x97, 0x97, 0x5d, 0xeb, 0xaf, 0xcb, 0xae, 0xf5, 0xef, 0x65, 0xd7, 0x9a, 0xb8,
0x5a, 0xce, 0xcf, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xae, 0x93, 0xb8, 0x49, 0xc1, 0x09, 0x00,
0x00,
}

View File

@ -17,6 +17,7 @@ service Control {
}
message DiskUsageRequest {
string filter = 1;
}
message DiskUsageResponse {
@ -28,6 +29,11 @@ message UsageRecord {
bool Mutable = 2;
bool InUse = 3;
int64 Size = 4;
string Parent = 5;
google.protobuf.Timestamp CreatedAt = 6 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
google.protobuf.Timestamp LastUsedAt = 7 [(gogoproto.stdtime) = true];
int64 UsageCount = 8;
string Description = 9;
}
message SolveRequest {

111
cache/manager.go vendored
View File

@ -2,7 +2,9 @@ package cache
import (
"context"
"strings"
"sync"
"time"
cdsnapshot "github.com/containerd/containerd/snapshot"
"github.com/moby/buildkit/cache/metadata"
@ -27,13 +29,13 @@ type ManagerOpt struct {
}
type Accessor interface {
Get(ctx context.Context, id string) (ImmutableRef, error)
New(ctx context.Context, s ImmutableRef, opt ...RefOption) (MutableRef, error)
Get(ctx context.Context, id string, opts ...RefOption) (ImmutableRef, error)
New(ctx context.Context, s ImmutableRef, opts ...RefOption) (MutableRef, error)
GetMutable(ctx context.Context, id string) (MutableRef, error) // Rebase?
}
type Controller interface {
DiskUsage(ctx context.Context) ([]*client.UsageInfo, error)
DiskUsage(ctx context.Context, info client.DiskUsageInfo) ([]*client.UsageInfo, error)
Prune(ctx context.Context) (map[string]int64, error)
GC(ctx context.Context) error
}
@ -87,14 +89,14 @@ func (cm *cacheManager) Close() error {
return cm.md.Close()
}
func (cm *cacheManager) Get(ctx context.Context, id string) (ImmutableRef, error) {
func (cm *cacheManager) Get(ctx context.Context, id string, opts ...RefOption) (ImmutableRef, error) {
cm.mu.Lock()
defer cm.mu.Unlock()
return cm.get(ctx, id)
return cm.get(ctx, id, opts...)
}
func (cm *cacheManager) get(ctx context.Context, id string) (ImmutableRef, error) {
rec, err := cm.load(ctx, id)
func (cm *cacheManager) get(ctx context.Context, id string, opts ...RefOption) (ImmutableRef, error) {
rec, err := cm.load(ctx, id, opts...)
if err != nil {
return nil, err
}
@ -114,7 +116,7 @@ func (cm *cacheManager) get(ctx context.Context, id string) (ImmutableRef, error
return rec.ref(), nil
}
func (cm *cacheManager) load(ctx context.Context, id string) (*cacheRecord, error) {
func (cm *cacheManager) load(ctx context.Context, id string, opts ...RefOption) (*cacheRecord, error) {
if rec, ok := cm.records[id]; ok {
return rec, nil
}
@ -144,7 +146,7 @@ func (cm *cacheManager) load(ctx context.Context, id string) (*cacheRecord, erro
var parent ImmutableRef
if info.Parent != "" {
parent, err = cm.get(ctx, info.Parent)
parent, err = cm.get(ctx, info.Parent, opts...)
if err != nil {
return nil, err
}
@ -157,6 +159,14 @@ func (cm *cacheManager) load(ctx context.Context, id string) (*cacheRecord, erro
parent: parent,
md: &md,
}
if err := initializeMetadata(rec, opts...); err != nil {
if parent != nil {
parent.Release(ctx)
}
return nil, err
}
cm.records[id] = rec
return rec, nil
}
@ -195,13 +205,11 @@ func (cm *cacheManager) New(ctx context.Context, s ImmutableRef, opts ...RefOpti
md: &md,
}
for _, opt := range opts {
if err := opt(rec); err != nil {
if parent != nil {
parent.Release(ctx)
}
return nil, err
if err := initializeMetadata(rec, opts...); err != nil {
if parent != nil {
parent.Release(ctx)
}
return nil, err
}
cm.mu.Lock()
@ -244,14 +252,18 @@ func (cm *cacheManager) GetMutable(ctx context.Context, id string) (MutableRef,
return rec.mref(), nil
}
func (cm *cacheManager) DiskUsage(ctx context.Context) ([]*client.UsageInfo, error) {
func (cm *cacheManager) DiskUsage(ctx context.Context, opt client.DiskUsageInfo) ([]*client.UsageInfo, error) {
cm.mu.Lock()
type cacheUsageInfo struct {
refs int
parent string
size int64
mutable bool
refs int
parent string
size int64
mutable bool
createdAt time.Time
usageCount int
lastUsedAt *time.Time
description string
}
m := make(map[string]*cacheUsageInfo, len(cm.records))
@ -264,10 +276,16 @@ func (cm *cacheManager) DiskUsage(ctx context.Context) ([]*client.UsageInfo, err
cr.mu.Unlock()
continue
}
usageCount, lastUsedAt := getLastUsed(cr.md)
c := &cacheUsageInfo{
refs: len(cr.refs),
mutable: cr.mutable,
size: getSize(cr.md),
refs: len(cr.refs),
mutable: cr.mutable,
size: getSize(cr.md),
createdAt: getCreatedAt(cr.md),
usageCount: usageCount,
lastUsedAt: lastUsedAt,
description: getDescription(cr.md),
}
if cr.parent != nil {
c.parent = cr.parent.ID()
@ -297,11 +315,20 @@ func (cm *cacheManager) DiskUsage(ctx context.Context) ([]*client.UsageInfo, err
var du []*client.UsageInfo
for id, cr := range m {
if opt.Filter != "" && !strings.HasPrefix(id, opt.Filter) {
continue
}
c := &client.UsageInfo{
ID: id,
Mutable: cr.mutable,
InUse: cr.refs > 0,
Size: cr.size,
ID: id,
Mutable: cr.mutable,
InUse: cr.refs > 0,
Size: cr.size,
Parent: cr.parent,
CreatedAt: cr.createdAt,
Description: cr.description,
LastUsedAt: cr.lastUsedAt,
UsageCount: cr.usageCount,
}
du = append(du, c)
}
@ -353,5 +380,33 @@ type withMetadata interface {
}
func CachePolicyRetain(m withMetadata) error {
return setCachePolicy(m.Metadata(), cachePolicyRetain)
return queueCachePolicy(m.Metadata(), cachePolicyRetain)
}
func WithDescription(descr string) RefOption {
return func(m withMetadata) error {
return queueDescription(m.Metadata(), descr)
}
}
func initializeMetadata(m withMetadata, opts ...RefOption) error {
md := m.Metadata()
if tm := getCreatedAt(md); !tm.IsZero() {
return nil
}
for _, opt := range opts {
if err := opt(m); err != nil {
return err
}
}
if err := queueCreatedAt(md); err != nil {
return err
}
if err := md.Commit(); err != nil {
return err
}
return nil
}

View File

@ -11,6 +11,7 @@ import (
"github.com/containerd/containerd/namespaces"
"github.com/containerd/containerd/snapshot/naive"
"github.com/moby/buildkit/cache/metadata"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/snapshot"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
@ -265,7 +266,7 @@ func getCacheManager(t *testing.T, tmpdir string) Manager {
}
func checkDiskUsage(t *testing.T, ctx context.Context, cm Manager, inuse, unused int) {
du, err := cm.DiskUsage(ctx)
du, err := cm.DiskUsage(ctx, client.DiskUsageInfo{})
require.NoError(t, err)
var inuseActual, unusedActual int
for _, r := range du {

100
cache/metadata.go vendored
View File

@ -1,6 +1,8 @@
package cache
import (
"time"
"github.com/boltdb/bolt"
"github.com/moby/buildkit/cache/metadata"
"github.com/pkg/errors"
@ -18,6 +20,10 @@ const keySize = "snapshot.size"
const keyEqualMutable = "cache.equalMutable"
const keyEqualImmutable = "cache.equalImmutable"
const keyCachePolicy = "cache.cachePolicy"
const keyDescription = "cache.description"
const keyCreatedAt = "cache.createdAt"
const keyLastUsedAt = "cache.lastUsedAt"
const keyUsageCount = "cache.usageCount"
func setSize(si *metadata.StorageItem, s int64) error {
v, err := metadata.NewValue(s)
@ -72,14 +78,15 @@ func clearEqualMutable(si *metadata.StorageItem) error {
return nil
}
func setCachePolicy(si *metadata.StorageItem, p cachePolicy) error {
func queueCachePolicy(si *metadata.StorageItem, p cachePolicy) error {
v, err := metadata.NewValue(p)
if err != nil {
return errors.Wrap(err, "failed to create size value")
return errors.Wrap(err, "failed to create cachePolicy value")
}
return si.Update(func(b *bolt.Bucket) error {
si.Queue(func(b *bolt.Bucket) error {
return si.SetValue(b, keyCachePolicy, v)
})
return nil
}
func getCachePolicy(si *metadata.StorageItem) cachePolicy {
@ -93,3 +100,90 @@ func getCachePolicy(si *metadata.StorageItem) cachePolicy {
}
return p
}
func queueDescription(si *metadata.StorageItem, descr string) error {
v, err := metadata.NewValue(descr)
if err != nil {
return errors.Wrap(err, "failed to create description value")
}
si.Queue(func(b *bolt.Bucket) error {
return si.SetValue(b, keyDescription, v)
})
return nil
}
func getDescription(si *metadata.StorageItem) string {
v := si.Get(keyDescription)
if v == nil {
return ""
}
var str string
if err := v.Unmarshal(&str); err != nil {
return ""
}
return str
}
func queueCreatedAt(si *metadata.StorageItem) error {
v, err := metadata.NewValue(time.Now().UnixNano())
if err != nil {
return errors.Wrap(err, "failed to create createdAt value")
}
si.Queue(func(b *bolt.Bucket) error {
return si.SetValue(b, keyCreatedAt, v)
})
return nil
}
func getCreatedAt(si *metadata.StorageItem) time.Time {
v := si.Get(keyCreatedAt)
if v == nil {
return time.Time{}
}
var tm int64
if err := v.Unmarshal(&tm); err != nil {
return time.Time{}
}
return time.Unix(tm/1e9, tm%1e9)
}
func getLastUsed(si *metadata.StorageItem) (int, *time.Time) {
v := si.Get(keyUsageCount)
if v == nil {
return 0, nil
}
var usageCount int
if err := v.Unmarshal(&usageCount); err != nil {
return 0, nil
}
v = si.Get(keyLastUsedAt)
if v == nil {
return usageCount, nil
}
var lastUsedTs int64
if err := v.Unmarshal(&lastUsedTs); err != nil || lastUsedTs == 0 {
return usageCount, nil
}
tm := time.Unix(lastUsedTs/1e9, lastUsedTs%1e9)
return usageCount, &tm
}
func updateLastUsed(si *metadata.StorageItem) error {
count, _ := getLastUsed(si)
count++
v, err := metadata.NewValue(count)
if err != nil {
return errors.Wrap(err, "failed to create usageCount value")
}
v2, err := metadata.NewValue(time.Now().UnixNano())
if err != nil {
return errors.Wrap(err, "failed to create lastUsedAt value")
}
return si.Update(func(b *bolt.Bucket) error {
if err := si.SetValue(b, keyUsageCount, v); err != nil {
return err
}
return si.SetValue(b, keyLastUsedAt, v2)
})
}

13
cache/refs.go vendored
View File

@ -184,6 +184,8 @@ func (sr *immutableRef) release(ctx context.Context) error {
sr.viewMount = nil
}
updateLastUsed(sr.md)
delete(sr.refs, sr)
if len(sr.refs) == 0 {
@ -240,6 +242,16 @@ func (sr *mutableRef) commit(ctx context.Context) (ImmutableRef, error) {
md: &md,
}
if descr := getDescription(sr.md); descr != "" {
if err := queueDescription(&md, descr); err != nil {
return nil, err
}
}
if err := initializeMetadata(rec); err != nil {
return nil, err
}
sr.cm.records[id] = rec
if err := sr.md.Commit(); err != nil {
@ -279,6 +291,7 @@ func (sr *mutableRef) Release(ctx context.Context) error {
func (sr *mutableRef) release(ctx context.Context) error {
delete(sr.refs, sr)
updateLastUsed(sr.md)
if getCachePolicy(sr.md) != cachePolicyRetain {
if sr.equalImmutable != nil {
if getCachePolicy(sr.equalImmutable.md) == cachePolicyRetain {

View File

@ -3,6 +3,7 @@ package client
import (
"context"
"sort"
"time"
controlapi "github.com/moby/buildkit/api/services/control"
"github.com/pkg/errors"
@ -13,12 +14,22 @@ type UsageInfo struct {
Mutable bool
InUse bool
Size int64
// Meta string
// LastUsed time.Time
CreatedAt time.Time
LastUsedAt *time.Time
UsageCount int
Parent string
Description string
}
func (c *Client) DiskUsage(ctx context.Context) ([]*UsageInfo, error) {
resp, err := c.controlClient().DiskUsage(ctx, &controlapi.DiskUsageRequest{})
func (c *Client) DiskUsage(ctx context.Context, opts ...DiskUsageOption) ([]*UsageInfo, error) {
info := &DiskUsageInfo{}
for _, o := range opts {
o(info)
}
req := &controlapi.DiskUsageRequest{Filter: info.Filter}
resp, err := c.controlClient().DiskUsage(ctx, req)
if err != nil {
return nil, errors.Wrap(err, "failed to get diskusage")
}
@ -27,16 +38,36 @@ func (c *Client) DiskUsage(ctx context.Context) ([]*UsageInfo, error) {
for _, d := range resp.Record {
du = append(du, &UsageInfo{
ID: d.ID,
Mutable: d.Mutable,
InUse: d.InUse,
Size: d.Size_,
ID: d.ID,
Mutable: d.Mutable,
InUse: d.InUse,
Size: d.Size_,
Parent: d.Parent,
CreatedAt: d.CreatedAt,
Description: d.Description,
UsageCount: int(d.UsageCount),
LastUsedAt: d.LastUsedAt,
})
}
sort.Slice(du, func(i, j int) bool {
if du[i].Size == du[j].Size {
return du[i].ID > du[j].ID
}
return du[i].Size > du[j].Size
})
return du, nil
}
type DiskUsageOption func(*DiskUsageInfo)
type DiskUsageInfo struct {
Filter string
}
func WithFilter(f string) DiskUsageOption {
return func(di *DiskUsageInfo) {
di.Filter = f
}
}

View File

@ -1,12 +1,14 @@
package main
import (
"context"
"fmt"
"io"
"os"
"text/tabwriter"
units "github.com/docker/go-units"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/util/appcontext"
"github.com/urfave/cli"
)
@ -14,25 +16,74 @@ var diskUsageCommand = cli.Command{
Name: "du",
Usage: "disk usage",
Action: diskUsage,
Flags: []cli.Flag{
cli.StringFlag{
Name: "filter, f",
Usage: "Filter snapshot ID",
},
cli.BoolFlag{
Name: "verbose, v",
Usage: "Verbose output",
},
},
}
func diskUsage(clicontext *cli.Context) error {
client, err := resolveClient(clicontext)
c, err := resolveClient(clicontext)
if err != nil {
return err
}
du, err := client.DiskUsage(context.TODO())
du, err := c.DiskUsage(appcontext.Context(), client.WithFilter(clicontext.String("filter")))
if err != nil {
return err
}
tw := tabwriter.NewWriter(os.Stdout, 1, 8, 1, '\t', 0)
fmt.Fprintln(tw, "ID\tRECLAIMABLE\tSIZE\tLAST ACCESSED")
if clicontext.Bool("verbose") {
printVerbose(tw, du)
} else {
printTable(tw, du)
}
total := int64(0)
reclaimable := int64(0)
if clicontext.String("filter") == "" {
printSummary(tw, du)
}
return nil
}
func printKV(w io.Writer, k string, v interface{}) {
fmt.Fprintf(w, "%s:\t%v\n", k, v)
}
func printVerbose(tw *tabwriter.Writer, du []*client.UsageInfo) {
for _, di := range du {
printKV(tw, "ID", di.ID)
if di.Parent != "" {
printKV(tw, "Parent", di.Parent)
}
printKV(tw, "Created at", di.CreatedAt)
printKV(tw, "Mutable", di.Mutable)
printKV(tw, "Reclaimable", !di.InUse)
printKV(tw, "Size", units.HumanSize(float64(di.Size)))
if di.Description != "" {
printKV(tw, "Description", di.Description)
}
printKV(tw, "Usage count", di.UsageCount)
if di.LastUsedAt != nil {
printKV(tw, "Last used", di.LastUsedAt)
}
fmt.Fprintf(tw, "\n")
}
tw.Flush()
}
func printTable(tw *tabwriter.Writer, du []*client.UsageInfo) {
fmt.Fprintln(tw, "ID\tRECLAIMABLE\tSIZE\tLAST ACCESSED")
for _, di := range du {
id := di.ID
@ -40,6 +91,17 @@ func diskUsage(clicontext *cli.Context) error {
id += "*"
}
fmt.Fprintf(tw, "%s\t%v\t%s\t\n", id, !di.InUse, units.HumanSize(float64(di.Size)))
}
tw.Flush()
}
func printSummary(tw *tabwriter.Writer, du []*client.UsageInfo) {
total := int64(0)
reclaimable := int64(0)
for _, di := range du {
if di.Size > 0 {
total += di.Size
if !di.InUse {
@ -48,12 +110,8 @@ func diskUsage(clicontext *cli.Context) error {
}
}
tw.Flush()
tw = tabwriter.NewWriter(os.Stdout, 1, 8, 1, '\t', 0)
fmt.Fprintf(tw, "Reclaimable:\t%s\n", units.HumanSize(float64(reclaimable)))
fmt.Fprintf(tw, "Total:\t%s\n", units.HumanSize(float64(total)))
tw.Flush()
return nil
}

View File

@ -51,8 +51,10 @@ func (c *Controller) Register(server *grpc.Server) error {
return nil
}
func (c *Controller) DiskUsage(ctx context.Context, _ *controlapi.DiskUsageRequest) (*controlapi.DiskUsageResponse, error) {
du, err := c.opt.CacheManager.DiskUsage(ctx)
func (c *Controller) DiskUsage(ctx context.Context, r *controlapi.DiskUsageRequest) (*controlapi.DiskUsageResponse, error) {
du, err := c.opt.CacheManager.DiskUsage(ctx, client.DiskUsageInfo{
Filter: r.Filter,
})
if err != nil {
return nil, err
}
@ -60,10 +62,15 @@ func (c *Controller) DiskUsage(ctx context.Context, _ *controlapi.DiskUsageReque
resp := &controlapi.DiskUsageResponse{}
for _, r := range du {
resp.Record = append(resp.Record, &controlapi.UsageRecord{
ID: r.ID,
Mutable: r.Mutable,
InUse: r.InUse,
Size_: r.Size,
ID: r.ID,
Mutable: r.Mutable,
InUse: r.InUse,
Size_: r.Size,
Parent: r.Parent,
UsageCount: int64(r.UsageCount),
Description: r.Description,
CreatedAt: r.CreatedAt,
LastUsedAt: r.LastUsedAt,
})
}
return resp, nil

View File

@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/namespaces"
"github.com/moby/buildkit/cache"
"github.com/moby/buildkit/cache/metadata"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/snapshot/blobmapping"
"github.com/moby/buildkit/source"
@ -93,7 +94,7 @@ func TestControl(t *testing.T) {
lm.Unmount()
assert.NoError(t, err)
du, err := cm.DiskUsage(ctx)
du, err := cm.DiskUsage(ctx, client.DiskUsageInfo{})
assert.NoError(t, err)
// for _, d := range du {
@ -148,7 +149,7 @@ func TestControl(t *testing.T) {
err = snap.Release(ctx)
assert.NoError(t, err)
du2, err := cm.DiskUsage(ctx)
du2, err := cm.DiskUsage(ctx, client.DiskUsageInfo{})
assert.NoError(t, err)
assert.Equal(t, 1, len(du2)-len(du))

View File

@ -2,7 +2,9 @@ package solver
import (
"encoding/json"
"fmt"
"sort"
"strings"
"github.com/moby/buildkit/cache"
"github.com/moby/buildkit/solver/pb"
@ -80,7 +82,7 @@ func (e *execOp) Run(ctx context.Context, inputs []Reference) ([]Reference, erro
if m.Readonly && ref != nil {
outputs = append(outputs, newSharedRef(ref).Clone())
} else {
active, err := e.cm.New(ctx, ref) // TODO: should be method
active, err := e.cm.New(ctx, ref, cache.WithDescription(fmt.Sprintf("mount %s from exec %s", m.Dest, strings.Join(e.op.Meta.Args, " ")))) // TODO: should be method
if err != nil {
return nil, err
}

View File

@ -3,6 +3,7 @@ package containerimage
import (
gocontext "context"
"encoding/json"
"fmt"
"net/http"
"sync"
"time"
@ -149,7 +150,7 @@ func (p *puller) Snapshot(ctx context.Context) (cache.ImmutableRef, error) {
}
unpackProgressDone(nil)
return p.is.CacheAccessor.Get(ctx, chainid)
return p.is.CacheAccessor.Get(ctx, chainid, cache.WithDescription(fmt.Sprintf("pulled from %s", p.ref)))
}
func (is *imageSource) unpack(ctx context.Context, desc ocispec.Descriptor) (string, error) {

View File

@ -2,6 +2,7 @@ package git
import (
"bytes"
"fmt"
"io"
"os"
"os/exec"
@ -78,7 +79,7 @@ func (gs *gitSource) mountRemote(ctx context.Context, remote string) (target str
initializeRepo := false
if remoteRef == nil {
remoteRef, err = gs.cache.New(ctx, nil, cache.CachePolicyRetain)
remoteRef, err = gs.cache.New(ctx, nil, cache.CachePolicyRetain, cache.WithDescription(fmt.Sprintf("shared git repo for %s", remote)))
if err != nil {
return "", nil, errors.Wrapf(err, "failed to create new mutable for %s", remote)
}
@ -262,7 +263,7 @@ func (gs *gitSourceHandler) Snapshot(ctx context.Context) (out cache.ImmutableRe
}
}
checkoutRef, err := gs.cache.New(ctx, nil)
checkoutRef, err := gs.cache.New(ctx, nil, cache.WithDescription(fmt.Sprintf("git snapshot for %s#%s", gs.src.Remote, ref)))
if err != nil {
return nil, errors.Wrapf(err, "failed to create new mutable for %s", gs.src.Remote)
}

View File

@ -1,6 +1,7 @@
package local
import (
"fmt"
"time"
"github.com/boltdb/bolt"
@ -106,7 +107,7 @@ func (ls *localSourceHandler) Snapshot(ctx context.Context) (out cache.Immutable
}
if mutable == nil {
m, err := ls.cm.New(ctx, nil, cache.CachePolicyRetain)
m, err := ls.cm.New(ctx, nil, cache.CachePolicyRetain, cache.WithDescription(fmt.Sprintf("local source for %s", ls.src.Name)))
if err != nil {
return nil, err
}