@@ -12,6 +12,7 @@ import (
1212 "os/signal"
1313 "path/filepath"
1414 "runtime"
15+ "sync"
1516 "syscall"
1617 "time"
1718
@@ -23,6 +24,12 @@ import (
2324 "google.golang.org/grpc/status"
2425)
2526
27+ const (
28+ writeBufferSizeBytes = 128 * 1024
29+ getContentBufferPoolSize = 128
30+ getContentBufferSize = 256 * 1024
31+ )
32+
2633type CacheServiceOpts struct {
2734 Addr string
2835}
@@ -149,6 +156,7 @@ func (cs *CacheService) StartServer(port uint) error {
149156 s := grpc .NewServer (
150157 grpc .MaxRecvMsgSize (maxMessageSize ),
151158 grpc .MaxSendMsgSize (maxMessageSize ),
159+ grpc .WriteBufferSize (writeBufferSizeBytes ),
152160 )
153161 proto .RegisterBlobCacheServer (s , cs )
154162
@@ -170,15 +178,42 @@ func (cs *CacheService) StartServer(port uint) error {
170178 return nil
171179}
172180
181+ var getContentBufferPool = sync.Pool {
182+ New : func () interface {} {
183+ b := make ([]byte , getContentBufferSize )
184+ return & b
185+ },
186+ }
187+
188+ func init () {
189+ for i := 0 ; i < getContentBufferPoolSize ; i ++ {
190+ //lint:ignore SA6002 reason: pre-allocating buffers for performance
191+ getContentBufferPool .Put (make ([]byte , getContentBufferSize ))
192+ }
193+ }
194+
173195func (cs * CacheService ) GetContent (ctx context.Context , req * proto.GetContentRequest ) (* proto.GetContentResponse , error ) {
174- content , err := cs .cas .Get (req .Hash , req .Offset , req .Length )
196+ bufPtr := getContentBufferPool .Get ().(* []byte )
197+ defer getContentBufferPool .Put (bufPtr )
198+ dst := * bufPtr
199+
200+ if cap (dst ) < int (req .Length ) {
201+ dst = make ([]byte , req .Length )
202+ * bufPtr = dst
203+ }
204+ dst = dst [:req .Length ]
205+
206+ resp := & proto.GetContentResponse {Content : dst }
207+ err := cs .cas .Get (req .Hash , req .Offset , req .Length , dst )
175208 if err != nil {
176209 Logger .Debugf ("Get - [%s] - %v" , req .Hash , err )
177210 return & proto.GetContentResponse {Content : nil , Ok : false }, nil
178211 }
179212
180213 Logger .Debugf ("Get - [%s] (offset=%d, length=%d)" , req .Hash , req .Offset , req .Length )
181- return & proto.GetContentResponse {Content : content , Ok : true }, nil
214+
215+ resp .Ok = true
216+ return resp , nil
182217}
183218
184219func (cs * CacheService ) store (ctx context.Context , buffer * bytes.Buffer , sourcePath string , sourceOffset int64 ) (string , error ) {
0 commit comments