Skip to content

Commit 4ed2660

Browse files
committed
feat: implement context timeout for Google Drive API calls
1 parent 35424a7 commit 4ed2660

1 file changed

Lines changed: 35 additions & 9 deletions

File tree

core/dbio/filesys/fs_googledrive.go

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ type GoogleDriveFileSysClient struct {
2727
fileID string // Optional: Direct file ID for single file access
2828
}
2929

30+
// googleDriveTimeout is the default timeout for Google Drive API requests
31+
const googleDriveTimeout = 90 * time.Second
32+
33+
// apiCtx returns a context with timeout for Google Drive API calls
34+
func (fs *GoogleDriveFileSysClient) apiCtx() (context.Context, context.CancelFunc) {
35+
return context.WithTimeout(fs.Context().Ctx, googleDriveTimeout)
36+
}
37+
3038
// Init initializes the fs client
3139
func (fs *GoogleDriveFileSysClient) Init(ctx context.Context) (err error) {
3240
var instance FileSysClient
@@ -159,7 +167,9 @@ func (fs *GoogleDriveFileSysClient) Connect() (err error) {
159167
// Validate rootFolderID if provided
160168
if fs.rootFolderID != "" {
161169
// Get detailed folder information
162-
folderInfo, err := fs.client.Files.Get(fs.rootFolderID).SupportsAllDrives(true).Fields("id,name,mimeType,parents,capabilities,driveId,owners,permissions").Do()
170+
ctx, cancel := fs.apiCtx()
171+
defer cancel()
172+
folderInfo, err := fs.client.Files.Get(fs.rootFolderID).Context(ctx).SupportsAllDrives(true).Fields("id,name,mimeType,parents,capabilities,driveId,owners,permissions").Do()
163173
if err != nil {
164174
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
165175
return g.Error("Root folder ID '%s' does not exist or is not accessible", fs.rootFolderID)
@@ -171,7 +181,9 @@ func (fs *GoogleDriveFileSysClient) Connect() (err error) {
171181

172182
// Validate fileID if provided
173183
if fs.fileID != "" {
174-
_, err = fs.client.Files.Get(fs.fileID).Fields("id").SupportsAllDrives(true).Do()
184+
ctx, cancel := fs.apiCtx()
185+
defer cancel()
186+
_, err = fs.client.Files.Get(fs.fileID).Context(ctx).Fields("id").SupportsAllDrives(true).Do()
175187
if err != nil {
176188
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
177189
return g.Error("File ID '%s' does not exist or is not accessible", fs.fileID)
@@ -199,7 +211,9 @@ func (fs *GoogleDriveFileSysClient) queryList(query string, fields googleapi.Fie
199211
retry:
200212
attempt++
201213

202-
result, err = fs.client.Files.List().Q(query).Fields(fields).IncludeItemsFromAllDrives(true).SupportsAllDrives(true).Do()
214+
ctx, cancel := fs.apiCtx()
215+
result, err = fs.client.Files.List().Context(ctx).Q(query).Fields(fields).IncludeItemsFromAllDrives(true).SupportsAllDrives(true).Do()
216+
cancel()
203217
if err != nil {
204218
if strings.Contains(err.Error(), "Error 500") && attempt < 5 {
205219
time.Sleep(2 * time.Second)
@@ -405,7 +419,9 @@ func (fs *GoogleDriveFileSysClient) List(uri string) (nodes FileNodes, err error
405419

406420
// Get file info to check if it's a file or folder
407421
var file *drive.File
408-
file, err = fs.client.Files.Get(fileID).Fields("id, name, size, createdTime, modifiedTime, mimeType, owners").SupportsAllDrives(true).Do()
422+
getCtx, getCancel := fs.apiCtx()
423+
defer getCancel()
424+
file, err = fs.client.Files.Get(fileID).Context(getCtx).Fields("id, name, size, createdTime, modifiedTime, mimeType, owners").SupportsAllDrives(true).Do()
409425
if err != nil {
410426
// If file doesn't exist (404), return empty list
411427
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
@@ -479,12 +495,14 @@ func (fs *GoogleDriveFileSysClient) List(uri string) (nodes FileNodes, err error
479495

480496
pageToken := ""
481497
for {
482-
call := fs.client.Files.List().Q(query).Fields(fields).PageSize(1000).IncludeItemsFromAllDrives(true).SupportsAllDrives(true)
498+
listCtx, listCancel := fs.apiCtx()
499+
call := fs.client.Files.List().Context(listCtx).Q(query).Fields(fields).PageSize(1000).IncludeItemsFromAllDrives(true).SupportsAllDrives(true)
483500
if pageToken != "" {
484501
call = call.PageToken(pageToken)
485502
}
486503

487504
result, err := call.Do()
505+
listCancel()
488506
if err != nil {
489507
return nodes, g.Error(err, "Could not list files")
490508
}
@@ -577,7 +595,9 @@ func (fs *GoogleDriveFileSysClient) ListRecursive(uri string) (nodes FileNodes,
577595

578596
// Get file info to check if it's a file or folder
579597
var file *drive.File
580-
file, err = fs.client.Files.Get(fileID).Fields("id, name, size, createdTime, modifiedTime, mimeType, owners").SupportsAllDrives(true).Do()
598+
getCtx2, getCancel2 := fs.apiCtx()
599+
defer getCancel2()
600+
file, err = fs.client.Files.Get(fileID).Context(getCtx2).Fields("id, name, size, createdTime, modifiedTime, mimeType, owners").SupportsAllDrives(true).Do()
581601
if err != nil {
582602
// If file doesn't exist (404), return empty list
583603
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
@@ -648,12 +668,14 @@ func (fs *GoogleDriveFileSysClient) ListRecursive(uri string) (nodes FileNodes,
648668

649669
pageToken := ""
650670
for processedCount < maxItems {
651-
call := fs.client.Files.List().Q(query).Fields(fields).PageSize(100).IncludeItemsFromAllDrives(true).SupportsAllDrives(true)
671+
listCtx, listCancel := fs.apiCtx()
672+
call := fs.client.Files.List().Context(listCtx).Q(query).Fields(fields).PageSize(100).IncludeItemsFromAllDrives(true).SupportsAllDrives(true)
652673
if pageToken != "" {
653674
call = call.PageToken(pageToken)
654675
}
655676

656677
result, err := call.Do()
678+
listCancel()
657679
if err != nil {
658680
return nodes, g.Error(err, "Could not list files")
659681
}
@@ -731,7 +753,9 @@ func (fs *GoogleDriveFileSysClient) delete(uri string) (err error) {
731753
return g.Error(err, "Could not get file ID for deletion")
732754
}
733755

734-
err = fs.client.Files.Delete(fileID).SupportsAllDrives(true).Do()
756+
delCtx, delCancel := fs.apiCtx()
757+
defer delCancel()
758+
err = fs.client.Files.Delete(fileID).Context(delCtx).SupportsAllDrives(true).Do()
735759
if err != nil {
736760
return g.Error(err, "Could not delete file: "+path)
737761
}
@@ -790,7 +814,9 @@ func (fs *GoogleDriveFileSysClient) getOrCreateFolder(path string) (folderID str
790814
Parents: []string{parentID},
791815
}
792816

793-
created, err := fs.client.Files.Create(folder).Fields("id").SupportsAllDrives(true).Do()
817+
createCtx, createCancel := fs.apiCtx()
818+
created, err := fs.client.Files.Create(folder).Context(createCtx).Fields("id").SupportsAllDrives(true).Do()
819+
createCancel()
794820
if err != nil {
795821
return "", g.Error(err, "Could not create folder: "+part)
796822
}

0 commit comments

Comments
 (0)