@@ -211,10 +211,21 @@ func getFirestoreMetadata(meta state.Metadata) (*firestoreMetadata, error) {
211211 return & m , nil
212212}
213213
214+ func (f * Firestore ) Close () error {
215+ if f .client != nil {
216+ return f .client .Close ()
217+ }
218+
219+ return nil
220+ }
221+
214222func getGCPClient (ctx context.Context , metadata * firestoreMetadata , l logger.Logger ) (* datastore.Client , error ) {
215223 var gcpClient * datastore.Client
216224 var err error
217225
226+ // context.Background is used here, as the context used to Dial the
227+ // server in the gRPC DialPool. Callers should always call `Close` on the
228+ // component to ensure all resources are released.
218229 if metadata .PrivateKeyID != "" {
219230 var b []byte
220231 b , err = json .Marshal (metadata )
@@ -223,7 +234,7 @@ func getGCPClient(ctx context.Context, metadata *firestoreMetadata, l logger.Log
223234 }
224235
225236 opt := option .WithCredentialsJSON (b )
226- gcpClient , err = datastore .NewClient (ctx , metadata .ProjectID , opt )
237+ gcpClient , err = datastore .NewClient (context . Background () , metadata .ProjectID , opt )
227238 if err != nil {
228239 return nil , err
229240 }
@@ -238,7 +249,7 @@ func getGCPClient(ctx context.Context, metadata *firestoreMetadata, l logger.Log
238249 l .Debugf ("setting GCP Datastore Emulator environment variable to 'DATASTORE_EMULATOR_HOST=%s'" , metadata .ConnectionEndpoint )
239250 os .Setenv ("DATASTORE_EMULATOR_HOST" , metadata .ConnectionEndpoint )
240251 }
241- gcpClient , err = datastore .NewClient (ctx , metadata .ProjectID )
252+ gcpClient , err = datastore .NewClient (context . Background () , metadata .ProjectID )
242253 if err != nil {
243254 return nil , err
244255 }
0 commit comments