Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
c31a82b
test(implicit_dir): bifurcate implicit_dir tests for rapid writes fla…
vipnydav Aug 3, 2026
eb7919d
style(implicit_dir): restore GKE and GCE environment comments in runI…
vipnydav Aug 3, 2026
e99919f
fix(implicit_dir): scope test_config.yaml modifications to implicit_d…
vipnydav Aug 3, 2026
38335dc
style(implicit_dir): update comment to specify appendable object writ…
vipnydav Aug 3, 2026
2b2dd98
refactor(implicit_dir): replace t := s.T() local variable with direct…
vipnydav Aug 3, 2026
e3b0cd1
style(implicit_dir): clarify appendable vs non-appendable object visi…
vipnydav Aug 3, 2026
6a916a6
fix(implicit_dir): remove --implicit-dirs from run_on_pirlo configs i…
vipnydav Aug 4, 2026
190d742
refactor(implicit_dir): use subtests and mounting helpers in runImpli…
vipnydav Aug 4, 2026
1385bbb
fix(implicit_dir): save log file on test failure and TestMain exit
vipnydav Aug 6, 2026
0133c0d
test(read_cache): bifurcate read_cache local modification tests for r…
vipnydav Aug 3, 2026
a8f800b
style(read_cache): restore GKE and GCE environment comments in local_…
vipnydav Aug 3, 2026
da5659a
fix(read_cache): scope test_config.yaml modifications to read_cache s…
vipnydav Aug 3, 2026
1f0feca
fix(read_cache): remove --implicit-dirs from run_on_pirlo configs in …
vipnydav Aug 4, 2026
ee1b435
fix(read_cache): save log file on TestMain exit in setup_test.go
vipnydav Aug 6, 2026
d7f0ef4
test(readonly_creds): bifurcate readonly_creds integration tests for …
vipnydav Aug 3, 2026
ccc99ad
fix(readonly_creds): remove implicit-dirs flags from run_on_pirlo con…
vipnydav Aug 4, 2026
fbe124d
fix(readonly_creds): save log file on TestMain exit in readonly_creds…
vipnydav Aug 6, 2026
e51164e
Merge branches 'bifurcate-implicit-dir-rapid-writes', 'bifurcate-read…
vipnydav Aug 7, 2026
c4c23b6
fix(lint): apply De Morgan's law to finalizeOnClose check in storage_…
vipnydav Jul 28, 2026
de62f50
fix: remove implicit-dirs flags from run_on_pirlo configs across all …
vipnydav Aug 4, 2026
26cba53
fix(test_config): strip --implicit-dirs from all run_on_pirlo configs
vipnydav Aug 5, 2026
d64a3e2
test(integration): add script to run E2E tests on HNS Pirlo buckets b…
AmatyaAvadhanula Aug 4, 2026
2317563
fix(client): set finalizeOnClose to true for Pirlo buckets
vipnydav Aug 5, 2026
bb80741
Update pirlo flags in test_config.yaml for interrupt suite
vipnydav Aug 5, 2026
121be31
Remove run_on_pirlo from mount_timeout in test_config.yaml
vipnydav Aug 5, 2026
44e3aae
Fix log file path in job_chunk_test.go to use testEnv.cfg.LogFile
vipnydav Aug 5, 2026
d9a7272
Revert log file change in job_chunk_test.go
vipnydav Aug 5, 2026
9b67f8e
style(pirlo): update copyright year and add license header to pirlo s…
vipnydav Aug 7, 2026
f7261d4
refactor(operations): rename ZB wait duration constants to Rapid and …
vipnydav Aug 7, 2026
b9e538e
fix(integration): update log and skip messages for Rapid / Zonal buckets
vipnydav Aug 7, 2026
75bb176
fix(file_operations): skip per-chunk sync for Pirlo in WriteChunkOfRa…
vipnydav Aug 7, 2026
25ddff6
refactor(file_operations): remove redundant per-chunk sync block from…
vipnydav Aug 7, 2026
c70762b
refactor(write_large_files): make SyncFiles unconditional in writeToF…
vipnydav Aug 7, 2026
7cd8a3d
refactor(write_large_files): remove redundant SyncFiles call from wri…
vipnydav Aug 7, 2026
efaa262
refactor(file_operations): use CloseFileShouldNotThrowError inside Cl…
vipnydav Aug 7, 2026
0b97614
fix(integration): check IsPirloBucketRun alongside IsZonalBucketRun i…
vipnydav Aug 7, 2026
c62b2dd
fix(streaming_writes): skip TestWritesWithDifferentConfig for Pirlo b…
vipnydav Aug 7, 2026
1756489
fix(client): pass appendable and non-finalizing options in CreateUnfi…
vipnydav Aug 7, 2026
d7df4f4
fix(test_config): add missing flags header in operations section
vipnydav Aug 8, 2026
857e507
fix(storage): clear StorageClass when Pirlo rapid writes are disabled
vipnydav Aug 8, 2026
e7adcd1
fix(pirlo): update pirlo_run_e2e_tests.sh script for pirlo test execu…
vipnydav Aug 8, 2026
9e7f1fc
fix(pirlo): remove custom-endpoint flag from pirlo_run_e2e_tests.sh
vipnydav Aug 8, 2026
0385bc6
feat(requester_pays): enable Pirlo for requester_pays_bucket integrat…
vipnydav Aug 8, 2026
e993ca2
test(requester_pays): update Pirlo flags in test_config.yaml
vipnydav Aug 8, 2026
6402a29
refactor(client): simplify CreateStorageClient control flow
vipnydav Aug 8, 2026
f146ed1
test(implicit_dir): add --implicit-dirs flag to Pirlo configs in test…
vipnydav Aug 8, 2026
7a1959d
fix(test_config): add missing run: TestOperationsBase to tpc section …
vipnydav Aug 8, 2026
d03e6e4
fix(operations): remove unnecessary 2-minute sleep in WaitForSizeUpda…
vipnydav Aug 9, 2026
dc0a454
fix(operations): restore WaitDurationAfterFlushRapid to 1m and WaitDu…
vipnydav Aug 9, 2026
2401076
fix(operations): include IsPirloBucketRun in WaitForSizeUpdate
vipnydav Aug 9, 2026
1a8345b
fix(mounting): handle custom-endpoint in individual mounting packages…
vipnydav Aug 9, 2026
f92f146
fix(rapid_operations): call SyncFile unconditionally in appendToFile …
vipnydav Aug 9, 2026
c2222cc
test(stale_handle): comment out TestRenamedFileSyncAndCloseThrowsStal…
vipnydav Aug 9, 2026
46111e9
test(streaming_writes): comment out rename tests
vipnydav Aug 9, 2026
417d0fa
test(unfinalized_object): comment out rename tests
vipnydav Aug 9, 2026
508de85
test(unfinalized_object): add --enable-rapid-writes=true and --finali…
vipnydav Aug 9, 2026
18f86bc
test: comment out rename tests in operations, local_file, and implici…
vipnydav Aug 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions internal/storage/bucket_handle.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ func (bh *bucketHandle) CreateObject(ctx context.Context, req *gcs.CreateObjectR
// defaulting to the bucket's default storage class
if bh.BucketType().Pirlo == gcs.PirloStateRapidWritesEnabled {
req.StorageClass = storageClassRapid
} else if bh.BucketType().Pirlo == gcs.PirloStateRapidWritesDisabled {
req.StorageClass = ""
}

obj := bh.getObjectHandleWithPreconditionsSet(req)
Expand Down Expand Up @@ -252,6 +254,8 @@ func (bh *bucketHandle) CreateObjectChunkWriter(ctx context.Context, req *gcs.Cr
// defaulting to the bucket's default storage class.
if bh.BucketType().Pirlo == gcs.PirloStateRapidWritesEnabled {
req.StorageClass = storageClassRapid
} else if bh.BucketType().Pirlo == gcs.PirloStateRapidWritesDisabled {
req.StorageClass = ""
}

obj := bh.getObjectHandleWithPreconditionsSet(req)
Expand Down
41 changes: 20 additions & 21 deletions tools/integration_tests/implicit_dir/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package implicit_dir_test

import (
"path"
"testing"

"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/operations"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/setup/implicit_and_explicit_dir_setup"
Expand All @@ -28,29 +27,29 @@ import (
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/fileInImplicitDir1 -- File
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
func TestDeleteNonEmptyImplicitDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteNonEmptyImplicitDir() {
testDirName := "testDeleteNonEmptyImplicitDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))

dirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, s.T())
}

// Directory Structure
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/fileInImplicitDir1 -- File
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
func TestDeleteNonEmptyImplicitSubDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteNonEmptyImplicitSubDir() {
testDirName := "testDeleteNonEmptyImplicitSubDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))

subDirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, implicit_and_explicit_dir_setup.ImplicitSubDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(subDirPath, implicit_and_explicit_dir_setup.ImplicitSubDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(subDirPath, implicit_and_explicit_dir_setup.ImplicitSubDirectory, s.T())
}

// Directory Structure
Expand All @@ -60,18 +59,18 @@ func TestDeleteNonEmptyImplicitSubDir(t *testing.T) {
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/fileInImplicitDir1 -- File
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
func TestDeleteImplicitDirWithExplicitSubDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteImplicitDirWithExplicitSubDir() {
testDirName := "testDeleteImplicitDirWithExplicitSubDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))

explicitDirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, ExplicitDirInImplicitDir)

operations.CreateDirectoryWithNFiles(NumberOfFilesInExplicitDirInImplicitDir, explicitDirPath, PrefixFileInExplicitDirInImplicitDir, t)
operations.CreateDirectoryWithNFiles(NumberOfFilesInExplicitDirInImplicitDir, explicitDirPath, PrefixFileInExplicitDirInImplicitDir, s.T())

dirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, s.T())
}

// Directory Structure
Expand All @@ -81,17 +80,17 @@ func TestDeleteImplicitDirWithExplicitSubDir(t *testing.T) {
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/explicitDirInImplicitDir -- Dir
// testBucket/dirForImplicitDirTests/testDir/implicitDirectory/implicitSubDirectory/explicitDirInImplicitDir/fileInExplicitDirInImplicitDir -- File
func TestDeleteImplicitDirWithImplicitSubDirContainingExplicitDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteImplicitDirWithImplicitSubDirContainingExplicitDir() {
testDirName := "testDeleteImplicitDirWithImplicitSubDirContainingExplicitDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
explicitDirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, implicit_and_explicit_dir_setup.ImplicitSubDirectory, ExplicitDirInImplicitSubDir)

operations.CreateDirectoryWithNFiles(NumberOfFilesInExplicitDirInImplicitSubDir, explicitDirPath, PrefixFileInExplicitDirInImplicitSubDir, t)
operations.CreateDirectoryWithNFiles(NumberOfFilesInExplicitDirInImplicitSubDir, explicitDirPath, PrefixFileInExplicitDirInImplicitSubDir, s.T())

dirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ImplicitDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, s.T())
}

// Directory Structure
Expand All @@ -103,14 +102,14 @@ func TestDeleteImplicitDirWithImplicitSubDirContainingExplicitDir(t *testing.T)
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/fileInImplicitDir1 -- File
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/implicitSubDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
func TestDeleteImplicitDirInExplicitDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteImplicitDirInExplicitDir() {
testDirName := "testDeleteImplicitDirInExplicitDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryInExplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryInExplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))

dirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ExplicitDirectory, implicit_and_explicit_dir_setup.ImplicitDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ImplicitDirectory, s.T())
}

// Directory Structure
Expand All @@ -122,12 +121,12 @@ func TestDeleteImplicitDirInExplicitDir(t *testing.T) {
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/fileInImplicitDir1 -- File
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/implicitSubDirectory -- Dir
// testBucket/dirForImplicitDirTests/testDir/explicitDirectory/implicitDirectory/implicitSubDirectory/fileInImplicitDir2 -- File
func TestDeleteExplicitDirContainingImplicitSubDir(t *testing.T) {
func (s *implicitDirTestSuite) TestDeleteExplicitDirContainingImplicitSubDir() {
testDirName := "testDeleteExplicitDirContainingImplicitSubDir"
testDirPath := setupTestDir(testDirName)
implicit_and_explicit_dir_setup.CreateImplicitDirectoryInExplicitDirectoryStructureUsingStorageClient(testEnv.ctx, t, testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))
implicit_and_explicit_dir_setup.CreateImplicitDirectoryInExplicitDirectoryStructureUsingStorageClient(testEnv.ctx, s.T(), testEnv.storageClient, path.Join(DirForImplicitDirTests, testDirName))

dirPath := path.Join(testDirPath, implicit_and_explicit_dir_setup.ExplicitDirectory)

implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ExplicitDirectory, t)
implicit_and_explicit_dir_setup.RemoveAndCheckIfDirIsDeleted(dirPath, implicit_and_explicit_dir_setup.ExplicitDirectory, s.T())
}
58 changes: 52 additions & 6 deletions tools/integration_tests/implicit_dir/implicit_dir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@ import (
"log"
"os"
"path"
"strings"
"testing"

"cloud.google.com/go/storage"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/client"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/mounting/persistent_mounting"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/mounting/static_mounting"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/setup"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/setup/implicit_and_explicit_dir_setup"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/test_suite"
"github.com/stretchr/testify/suite"
)

const ExplicitDirInImplicitDir = "explicitDirInImplicitDir"
Expand All @@ -45,10 +48,51 @@ type env struct {
storageClient *storage.Client
ctx context.Context
testDirPath string
cfg *test_suite.TestConfig
bucketType string
}

var testEnv env

type implicitDirTestSuite struct {
suite.Suite
}

func (s *implicitDirTestSuite) TearDownTest() {
setup.SaveGCSFuseLogFileInCaseOfFailure(s.T())
}

func runImplicitDirSuite(t *testing.T, runSuiteFunc func()) {
// Run tests for mounted directory if the flag is set. This assumes that run flag is properly passed by GKE team as per the config.
if testEnv.cfg.GKEMountedDirectory != "" && testEnv.cfg.TestBucket != "" {
runSuiteFunc()
return
}

// Run tests for GCE environment otherwise.
flagsSet := setup.BuildFlagSets(*testEnv.cfg, testEnv.bucketType, t.Name())
for _, flags := range flagsSet {
t.Run(strings.Join(flags, "_"), func(t *testing.T) {
// 1. Static mounting
t.Run("Static", func(t *testing.T) {
static_mounting.RunSuiteForStaticMounting(testEnv.cfg, flags, t, runSuiteFunc)
})

// 2. Persistent mounting
t.Run("Persistent", func(t *testing.T) {
persistent_mounting.RunSuiteForPersistentMounting(testEnv.cfg, flags, t, runSuiteFunc)
})
})
}
}

func TestImplicitDirBase(t *testing.T) {
runImplicitDirSuite(t, func() {
suite.Run(t, new(implicitDirTestSuite))
suite.Run(t, &implicitDirLocalFileTest{isRapidWritesEnabled: false})
})
}

func setupTestDir(dirName string) string {
dir := setup.SetupTestDirectory(DirForImplicitDirTests)
dirPath := path.Join(dir, dirName)
Expand All @@ -71,7 +115,8 @@ func TestMain(m *testing.M) {

// 2. Create storage client before running tests.
testEnv.ctx = context.Background()
bucketType := setup.TestEnvironment(testEnv.ctx, &cfg.ImplicitDir[0])
testEnv.bucketType = setup.TestEnvironment(testEnv.ctx, &cfg.ImplicitDir[0])
testEnv.cfg = &cfg.ImplicitDir[0]
closeStorageClient := client.CreateStorageClientWithCancel(&testEnv.ctx, &testEnv.storageClient)
defer func() {
err := closeStorageClient()
Expand All @@ -80,11 +125,12 @@ func TestMain(m *testing.M) {
}
}()

// 3. Build the flag sets dynamically from the config.
flags := setup.BuildFlagSets(cfg.ImplicitDir[0], bucketType, "")
// 3. Set up test directory for test bucket.
setup.SetUpTestDirForTestBucket(testEnv.cfg)
setup.OverrideFilePathsInFlagSet(testEnv.cfg, setup.TestDir())

// 4. Run tests with the dynamically generated flags.
successCode := implicit_and_explicit_dir_setup.RunTestsForExplicitAndImplicitDir(&cfg.ImplicitDir[0], flags, m)
// 4. Run tests.
successCode := m.Run()
setup.SaveLogFileInCaseOfFailure(successCode)

// 5. Clean up test directory created.
Expand Down
Loading
Loading