func (b *brancher) CommitOutstanding() error { if err := b.destroyable.Destroy(); err != nil { return err } for repositoryName, commitID := range b.outputRepositoryToBranchID { if err := pfsutil.Commit( b.pfsAPIClient, repositoryName, commitID, ); err != nil { return err } for inputRepositoryCommit := range b.outputRepositoryToInputRepositories[repositoryName] { if err := b.storeClient.AddPfsCommitMapping( &pps.PfsCommitMapping{ InputRepository: inputRepositoryCommit.repositoryName, InputCommitId: inputRepositoryCommit.commitID, OutputRepository: repositoryName, OutputCommitId: commitID, Timestamp: protoutil.TimeToTimestamp(b.timer.Now()), }, ); err != nil { return err } } } return nil }
func benchMount(b *testing.B, apiClient pfs.ApiClient) { repositoryName := TestRepositoryName() if err := pfsutil.InitRepository(apiClient, repositoryName, false); err != nil { b.Error(err) } directory := "/compile/benchMount" mounter := fuse.NewMounter() go func() { if err := mounter.Mount(apiClient, repositoryName, directory, 0, 1); err != nil { b.Error(err) } }() mounter.Ready() defer func() { if err := mounter.Unmount(directory); err != nil { b.Error(err) } }() bigValue := make([]byte, 1024*1024) for i := 0; i < 1024*1024; i++ { bigValue[i] = 'a' } b.ResetTimer() for i := 0; i < b.N; i++ { branchResponse, err := pfsutil.Branch(apiClient, repositoryName, "scratch") if err != nil { b.Error(err) } if branchResponse == nil { b.Error("nil branch") } newCommitID := branchResponse.Commit.Id var wg sync.WaitGroup for j := 0; j < 1024; j++ { wg.Add(1) go func(j int) { defer wg.Done() if err = ioutil.WriteFile(filepath.Join(directory, newCommitID, fmt.Sprintf("big%d", j)), bigValue, 0666); err != nil { b.Error(err) } }(j) } wg.Wait() if err := pfsutil.Commit(apiClient, repositoryName, newCommitID); err != nil { b.Error(err) } } }
func testMountBig(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient) { repositoryName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName, false) require.NoError(t, err) directory := "/compile/testMount" mounter := fuse.NewMounter() go func() { err = mounter.Mount(apiClient, repositoryName, directory, 0, 1) require.NoError(t, err) }() mounter.Ready() _, err = os.Stat(filepath.Join(directory, "scratch")) require.NoError(t, err) branchResponse, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id bigValue := make([]byte, 1024*1024*300) for i := 0; i < 1024*1024*300; i++ { bigValue[i] = 'a' } wg := sync.WaitGroup{} for j := 0; j < 5; j++ { wg.Add(1) go func(j int) { defer wg.Done() err := ioutil.WriteFile(filepath.Join(directory, newCommitID, fmt.Sprintf("big%d", j)), bigValue, 0666) require.NoError(t, err) }(j) } wg.Wait() err = pfsutil.Commit(apiClient, repositoryName, newCommitID) require.NoError(t, err) wg = sync.WaitGroup{} for j := 0; j < 5; j++ { wg.Add(1) go func(j int) { defer wg.Done() data, err := ioutil.ReadFile(filepath.Join(directory, newCommitID, fmt.Sprintf("big%d", j))) require.NoError(t, err) require.Equal(t, bigValue, data) }(j) } wg.Wait() }
func testSimple(t *testing.T, apiClient pfs.ApiClient) { repositoryName := testRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName) require.NoError(t, err) getCommitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Nil(t, getCommitInfoResponse.CommitInfo.ParentCommit) branchResponse, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_WRITE, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/b") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/c") require.NoError(t, err) var wg sync.WaitGroup for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() iErr := pfsutil.PutFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/b/file%d", i), strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) iErr = pfsutil.PutFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/c/file%d", i), strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) }() } wg.Wait() err = pfsutil.Commit(apiClient, repositoryName, newCommitID) require.NoError(t, err) getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) wg = sync.WaitGroup{} for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() reader, iErr := pfsutil.GetFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/b/file%d", i)) require.NoError(t, iErr) buffer := bytes.NewBuffer(nil) _, iErr = buffer.ReadFrom(reader) require.NoError(t, iErr) require.Equal(t, fmt.Sprintf("hello%d", i), buffer.String()) reader, iErr = pfsutil.GetFile(apiClient, repositoryName, newCommitID, fmt.Sprintf("a/c/file%d", i)) require.NoError(t, iErr) buffer = bytes.NewBuffer(nil) _, iErr = buffer.ReadFrom(reader) require.NoError(t, iErr) require.Equal(t, fmt.Sprintf("hello%d", i), buffer.String()) }() } wg.Wait() listFilesResponse, err := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(listFilesResponse.FileInfo)) listFilesResponse, err = pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/c", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(listFilesResponse.FileInfo)) var fileInfos [7][]*pfs.FileInfo wg = sync.WaitGroup{} for i := 0; i < 7; i++ { i := i wg.Add(1) go func() { defer wg.Done() listFilesResponse, iErr := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", i, 7) require.NoError(t, iErr) fileInfos[i] = listFilesResponse.FileInfo }() } wg.Wait() count := 0 for i := 0; i < 7; i++ { count += len(fileInfos[i]) } require.Equal(t, testSize, count) }
func do(appEnvObj interface{}) error { appEnv := appEnvObj.(*appEnv) clientConn, err := grpc.Dial(appEnv.Address) if err != nil { return err } apiClient := pfs.NewApiClient(clientConn) var shard int var modulus int initCmd := cobramainutil.Command{ Use: "init repository-name", Long: "Initalize a repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.InitRepository(apiClient, args[0], false) }, }.ToCobraCommand() mkdirCmd := cobramainutil.Command{ Use: "mkdir repository-name commit-id path/to/dir", Long: "Make a directory. Sub directories must already exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.MakeDirectory(apiClient, args[0], args[1], args[2]) }, }.ToCobraCommand() putCmd := cobramainutil.Command{ Use: "put repository-name branch-id path/to/file", Long: "Put a file from stdin. Directories must exist. branch-id must be a writeable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { _, err := pfsutil.PutFile(apiClient, args[0], args[1], args[2], 0, os.Stdin) return err }, }.ToCobraCommand() getCmd := cobramainutil.Command{ Use: "get repository-name commit-id path/to/file", Long: "Get a file from stdout. commit-id must be a readable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, pfsutil.GetAll, os.Stdout) }, }.ToCobraCommand() lsCmd := cobramainutil.Command{ Use: "ls repository-name branch-id path/to/dir", Long: "List a directory. Directory must exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { listFilesResponse, err := pfsutil.ListFiles(apiClient, args[0], args[1], args[2], uint64(shard), uint64(modulus)) if err != nil { return err } for _, fileInfo := range listFilesResponse.FileInfo { fmt.Printf("%+v\n", fileInfo) } return nil }, }.ToCobraCommand() lsCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") lsCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") branchCmd := cobramainutil.Command{ Use: "branch repository-name commit-id", Long: "Branch a commit. commit-id must be a readable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { branchResponse, err := pfsutil.Branch(apiClient, args[0], args[1]) if err != nil { return err } fmt.Println(branchResponse.Commit.Id) return nil }, }.ToCobraCommand() commitCmd := cobramainutil.Command{ Use: "commit repository-name branch-id", Long: "Commit a branch. branch-id must be a writeable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.Commit(apiClient, args[0], args[1]) }, }.ToCobraCommand() commitInfoCmd := cobramainutil.Command{ Use: "commit-info repository-name commit-id", Long: "Get info for a commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { commitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, args[0], args[1]) if err != nil { return err } fmt.Printf("%+v\n", commitInfoResponse.CommitInfo) return nil }, }.ToCobraCommand() listCommitsCmd := cobramainutil.Command{ Use: "list-commits repository-name", Long: "List commits on the repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { listCommitsResponse, err := pfsutil.ListCommits(apiClient, args[0]) if err != nil { return err } for _, commitInfo := range listCommitsResponse.CommitInfo { fmt.Printf("%+v\n", commitInfo) } return nil }, }.ToCobraCommand() mountCmd := cobramainutil.Command{ Use: "mount repository-name", Long: "Mount a repository as a local file system.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return fuse.NewMounter().Mount(apiClient, args[0], args[0], uint64(shard), uint64(modulus)) }, }.ToCobraCommand() mountCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") mountCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") rootCmd := &cobra.Command{ Use: "pfs", Long: `Access the PFS API. Note that this CLI is experimental and does not even check for common errors. The environment variable PFS_ADDRESS controls what server the CLI connects to, the default is 0.0.0.0:650.`, } rootCmd.AddCommand(cobramainutil.NewVersionCommand(clientConn, pachyderm.Version)) rootCmd.AddCommand(initCmd) rootCmd.AddCommand(mkdirCmd) rootCmd.AddCommand(putCmd) rootCmd.AddCommand(getCmd) rootCmd.AddCommand(lsCmd) rootCmd.AddCommand(branchCmd) rootCmd.AddCommand(commitCmd) rootCmd.AddCommand(commitInfoCmd) rootCmd.AddCommand(listCommitsCmd) rootCmd.AddCommand(mountCmd) return rootCmd.Execute() }
func testMount(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient) { repositoryName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName, false) require.NoError(t, err) directory := "/compile/testMount" mounter := fuse.NewMounter() go func() { err = mounter.Mount(apiClient, repositoryName, directory, 0, 1) require.NoError(t, err) }() mounter.Ready() _, err = os.Stat(filepath.Join(directory, "scratch")) require.NoError(t, err) branchResponse, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id _, err = os.Stat(filepath.Join(directory, newCommitID)) require.NoError(t, err) err = ioutil.WriteFile(filepath.Join(directory, newCommitID, "foo"), []byte("foo"), 0666) require.NoError(t, err) _, err = pfsutil.PutFile(apiClient, repositoryName, newCommitID, "bar", 0, strings.NewReader("bar")) require.NoError(t, err) bigValue := make([]byte, 1024*1024) for i := 0; i < 1024*1024; i++ { bigValue[i] = 'a' } err = ioutil.WriteFile(filepath.Join(directory, newCommitID, "big1"), bigValue, 0666) require.NoError(t, err) _, err = pfsutil.PutFile(apiClient, repositoryName, newCommitID, "big2", 0, bytes.NewReader(bigValue)) require.NoError(t, err) err = pfsutil.Commit(apiClient, repositoryName, newCommitID) require.NoError(t, err) fInfo, err := os.Stat(filepath.Join(directory, newCommitID, "foo")) require.NoError(t, err) require.Equal(t, int64(3), fInfo.Size()) data, err := ioutil.ReadFile(filepath.Join(directory, newCommitID, "foo")) require.NoError(t, err) require.Equal(t, "foo", string(data)) data, err = ioutil.ReadFile(filepath.Join(directory, newCommitID, "bar")) require.NoError(t, err) require.Equal(t, "bar", string(data)) data, err = ioutil.ReadFile(filepath.Join(directory, newCommitID, "big1")) require.NoError(t, err) require.Equal(t, bigValue, data) data, err = ioutil.ReadFile(filepath.Join(directory, newCommitID, "big2")) require.NoError(t, err) require.Equal(t, bigValue, data) }
func testReplica(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient) { masterName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, masterName, false) require.NoError(t, err) replicaName := TestRepositoryName() err = pfsutil.InitRepository(apiClient, replicaName, true) require.NoError(t, err) for i := 0; i < testShardsPerServer*testNumServers; i++ { var buffer bytes.Buffer err := pfsutil.PullDiff(internalAPIClient, masterName, "scratch", uint64(i), &buffer) require.NoError(t, err) err = pfsutil.PushDiff(internalAPIClient, replicaName, "scratch", uint64(i), &buffer) require.NoError(t, err) } getCommitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, replicaName, "scratch") require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.NotNil(t, getCommitInfoResponse.CommitInfo) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Nil(t, getCommitInfoResponse.CommitInfo.ParentCommit) branchResponse, err := pfsutil.Branch(apiClient, masterName, "scratch") require.NoError(t, err) require.NotNil(t, branchResponse) newCommitID := branchResponse.Commit.Id var wg sync.WaitGroup for i := 0; i < testSize; i++ { i := i wg.Add(1) go func() { defer wg.Done() _, iErr := pfsutil.PutFile(apiClient, masterName, newCommitID, fmt.Sprintf("file%d", i), 0, strings.NewReader(fmt.Sprintf("hello%d", i))) require.NoError(t, iErr) }() } wg.Wait() err = pfsutil.Commit(apiClient, masterName, newCommitID) require.NoError(t, err) for i := 0; i < testShardsPerServer*testNumServers; i++ { var buffer bytes.Buffer err := pfsutil.PullDiff(internalAPIClient, masterName, newCommitID, uint64(i), &buffer) require.NoError(t, err) err = pfsutil.PushDiff(internalAPIClient, replicaName, newCommitID, uint64(i), &buffer) require.NoError(t, err) } getCommitInfoResponse, err = pfsutil.GetCommitInfo(apiClient, replicaName, newCommitID) require.NoError(t, err) require.NotNil(t, getCommitInfoResponse) require.NotNil(t, getCommitInfoResponse.CommitInfo) require.Equal(t, newCommitID, getCommitInfoResponse.CommitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, getCommitInfoResponse.CommitInfo.CommitType) require.Equal(t, "scratch", getCommitInfoResponse.CommitInfo.ParentCommit.Id) }