github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imageserver/rpcd/getImage.go (about) 1 package rpcd 2 3 import ( 4 "time" 5 6 "github.com/Cloud-Foundations/Dominator/lib/image" 7 "github.com/Cloud-Foundations/Dominator/lib/srpc" 8 "github.com/Cloud-Foundations/Dominator/proto/imageserver" 9 ) 10 11 func (t *srpcType) GetImage(conn *srpc.Conn, 12 request imageserver.GetImageRequest, 13 reply *imageserver.GetImageResponse) error { 14 var response imageserver.GetImageResponse 15 response.Image = t.getImageNow(request) 16 *reply = response 17 if response.Image != nil || request.Timeout == 0 { 18 return nil 19 } 20 // Image not found yet and willing to wait. 21 addCh := t.imageDataBase.RegisterAddNotifier() 22 defer func() { 23 t.imageDataBase.UnregisterAddNotifier(addCh) 24 select { 25 case <-addCh: 26 default: 27 } 28 }() 29 timer := time.NewTimer(request.Timeout) 30 for { 31 select { 32 case imageName := <-addCh: 33 if imageName == request.ImageName { 34 if !timer.Stop() { 35 <-timer.C 36 } 37 response.Image = t.getImageNow(request) 38 *reply = response 39 return nil 40 } 41 case <-timer.C: 42 return nil 43 } 44 } 45 } 46 47 func (t *srpcType) getImageNow( 48 request imageserver.GetImageRequest) *image.Image { 49 originalImage := t.imageDataBase.GetImage(request.ImageName) 50 if originalImage == nil { 51 return nil 52 } 53 img := *originalImage 54 if request.IgnoreFilesystem { 55 img.FileSystem = nil 56 } else if request.IgnoreFilesystemIfExpiring && 57 !originalImage.ExpiresAt.IsZero() { 58 img.FileSystem = nil 59 } 60 return &img 61 }