func (d *driver) MakeDirectory(file *pfs.File, shard uint64) (retErr error) { defer func() { if retErr == nil { metrics.AddFiles(1) } }() d.lock.Lock() defer d.lock.Unlock() fileType, err := d.getFileType(file, shard) if err != nil { return err } if fileType == pfs.FileType_FILE_TYPE_REGULAR { return fmt.Errorf("%s already exists and is a file", file.Path) } else if fileType == pfs.FileType_FILE_TYPE_DIR { return nil } canonicalCommit, err := d.canonicalCommit(file.Commit) if err != nil { return err } diffInfo, ok := d.diffs.get(client.NewDiff(canonicalCommit.Repo.Name, canonicalCommit.ID, shard)) if !ok { return pfsserver.NewErrCommitNotFound(canonicalCommit.Repo.Name, canonicalCommit.ID) } if diffInfo.Finished != nil { return fmt.Errorf("commit %s/%s has already been finished", canonicalCommit.Repo.Name, canonicalCommit.ID) } d.addDirs(diffInfo, file, shard) _append, ok := diffInfo.Appends[path.Clean(file.Path)] if !ok { _append = newAppend(pfs.FileType_FILE_TYPE_DIR) } else { _append.FileType = pfs.FileType_FILE_TYPE_DIR } if diffInfo.ParentCommit != nil { _append.LastRef = d.lastRef( client.NewFile( diffInfo.ParentCommit.Repo.Name, diffInfo.ParentCommit.ID, file.Path, ), shard, ) } diffInfo.Appends[path.Clean(file.Path)] = _append // The fact that this is a directory is signified by setting Children // to non-nil _append.Children = make(map[string]bool) return nil }
func (d *driver) PutFile(file *pfs.File, handle string, delimiter pfs.Delimiter, shard uint64, reader io.Reader) (retErr error) { blockClient, err := d.getBlockClient() if err != nil { return err } _client := client.APIClient{BlockAPIClient: blockClient} blockRefs, err := _client.PutBlock(delimiter, reader) if err != nil { return err } defer func() { if retErr == nil { metrics.AddFiles(1) for _, blockRef := range blockRefs.BlockRef { metrics.AddBytes(int64(blockRef.Range.Upper - blockRef.Range.Lower)) } } }() d.lock.Lock() defer d.lock.Unlock() fileType, err := d.getFileType(file, shard) if err != nil { return err } if fileType == pfs.FileType_FILE_TYPE_DIR { return fmt.Errorf("%s is a directory", file.Path) } canonicalCommit, err := d.canonicalCommit(file.Commit) if err != nil { return err } diffInfo, ok := d.diffs.get(client.NewDiff(canonicalCommit.Repo.Name, canonicalCommit.ID, shard)) if !ok { // This is a weird case since the commit existed above, it means someone // deleted the commit while the above code was running return pfsserver.NewErrCommitNotFound(canonicalCommit.Repo.Name, canonicalCommit.ID) } if diffInfo.Finished != nil { return fmt.Errorf("commit %s/%s has already been finished", canonicalCommit.Repo.Name, canonicalCommit.ID) } d.addDirs(diffInfo, file, shard) _append, ok := diffInfo.Appends[path.Clean(file.Path)] if !ok { _append = newAppend(pfs.FileType_FILE_TYPE_REGULAR) } else { _append.FileType = pfs.FileType_FILE_TYPE_REGULAR } if diffInfo.ParentCommit != nil { _append.LastRef = d.lastRef( client.NewFile(diffInfo.ParentCommit.Repo.Name, diffInfo.ParentCommit.ID, file.Path), shard, ) } diffInfo.Appends[path.Clean(file.Path)] = _append if handle == "" { _append.BlockRefs = append(_append.BlockRefs, blockRefs.BlockRef...) } else { handleBlockRefs, ok := _append.Handles[handle] if !ok { handleBlockRefs = &pfs.BlockRefs{} _append.Handles[handle] = handleBlockRefs } handleBlockRefs.BlockRef = append(handleBlockRefs.BlockRef, blockRefs.BlockRef...) } for _, blockRef := range blockRefs.BlockRef { diffInfo.SizeBytes += blockRef.Range.Upper - blockRef.Range.Lower } return nil }