func (sub *Sub) updateMetadata(request *subproto.UpdateRequest, requiredEntry *filesystem.DirectoryEntry, myPathName string) { if sub.inodesChanged[requiredEntry.InodeNumber] { return } var inode subproto.Inode inode.Name = myPathName inode.GenericInode = requiredEntry.Inode() request.InodesToChange = append(request.InodesToChange, inode) sub.inodesChanged[requiredEntry.InodeNumber] = true }
func (sub *Sub) addInode(request *subproto.UpdateRequest, requiredEntry *filesystem.DirectoryEntry, myPathName string) { requiredInode := requiredEntry.Inode() if name, ok := sub.inodesCreated[requiredEntry.InodeNumber]; ok { makeHardlink(request, myPathName, name) return } // Try to find a sibling inode. names := sub.requiredFS.InodeToFilenamesTable()[requiredEntry.InodeNumber] subFS := sub.FileSystem if len(names) > 1 { var sameDataInode filesystem.GenericInode var sameDataName string for _, name := range names { if inum, found := subFS.FilenameToInodeTable()[name]; found { subInode := sub.FileSystem.InodeTable[inum] _, sameMetadata, sameData := filesystem.CompareInodes( subInode, requiredInode, nil) if sameMetadata && sameData { makeHardlink(request, myPathName, name) return } if sameData { sameDataInode = subInode sameDataName = name } } } if sameDataInode != nil { sub.updateMetadata(request, requiredEntry, sameDataName) makeHardlink(request, myPathName, sameDataName) return } } if inode, ok := requiredEntry.Inode().(*filesystem.RegularInode); ok { if inode.Size > 0 { if _, ok := sub.subObjectCacheUsage[inode.Hash]; ok { sub.subObjectCacheUsage[inode.Hash]++ } else { // Not in object cache: grab it from file-system. request.FilesToCopyToCache = append( request.FilesToCopyToCache, sub.getFileToCopy(myPathName, inode.Hash)) sub.subObjectCacheUsage[inode.Hash] = 1 } } } var inode subproto.Inode inode.Name = myPathName inode.GenericInode = requiredEntry.Inode() request.InodesToMake = append(request.InodesToMake, inode) sub.inodesCreated[requiredEntry.InodeNumber] = myPathName }
func makeDirectory(request *subproto.UpdateRequest, requiredInode *filesystem.DirectoryInode, pathName string, create bool) { var newInode subproto.Inode newInode.Name = pathName var newDirectoryInode filesystem.DirectoryInode newDirectoryInode.Mode = requiredInode.Mode newDirectoryInode.Uid = requiredInode.Uid newDirectoryInode.Gid = requiredInode.Gid newInode.GenericInode = &newDirectoryInode if create { request.DirectoriesToMake = append(request.DirectoriesToMake, newInode) } else { request.InodesToChange = append(request.InodesToChange, newInode) } }
func addInode(request *subproto.UpdateRequest, state *state, requiredEntry *filesystem.DirectoryEntry, myPathName string) { requiredInode := requiredEntry.Inode() if name, ok := state.inodesCreated[requiredEntry.InodeNumber]; ok { makeHardlink(request, myPathName, name) return } // Try to find a sibling inode. names := state.requiredFS.InodeToFilenamesTable[requiredEntry.InodeNumber] if len(names) > 1 { var sameDataInode filesystem.GenericInode var sameDataName string for _, name := range names { if inum, found := state.getSubInodeFromFilename(name); found { subInode := state.subFS.InodeTable[inum] _, sameMetadata, sameData := filesystem.CompareInodes( subInode, requiredInode, nil) if sameMetadata && sameData { makeHardlink(request, myPathName, name) return } if sameData { sameDataInode = subInode sameDataName = name } } } if sameDataInode != nil { updateMetadata(request, state, requiredEntry, sameDataName) makeHardlink(request, myPathName, sameDataName) return } } if inode, ok := requiredEntry.Inode().(*filesystem.RegularInode); ok { if inode.Size > 0 { if _, ok := state.subObjectCacheUsage[inode.Hash]; ok { state.subObjectCacheUsage[inode.Hash]++ } else { // Not in object cache: grab it from file-system. if state.subFS.HashToInodesTable == nil { state.subFS.BuildHashToInodesTable() } if ilist, ok := state.subFS.HashToInodesTable[inode.Hash]; ok { var fileToCopy subproto.FileToCopyToCache fileToCopy.Name = state.subFS.InodeToFilenamesTable[ilist[0]][0] fileToCopy.Hash = inode.Hash request.FilesToCopyToCache = append( request.FilesToCopyToCache, fileToCopy) state.subObjectCacheUsage[inode.Hash] = 1 } else { panic("No object in cache for: " + myPathName) } } } } var inode subproto.Inode inode.Name = myPathName inode.GenericInode = requiredEntry.Inode() request.InodesToMake = append(request.InodesToMake, inode) state.inodesCreated[requiredEntry.InodeNumber] = myPathName }