github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/docs/source/architecture/uml/write.uml (about) 1 @startuml 2 3 skinparam sequenceTitleFontSize 40 4 skinparam sequenceTitleFontStyle bold 5 6 skinparam sequenceParticipantBackgroundColor #darkgrey 7 skinparam sequenceParticipantFontSize 8 8 9 skinparam sequenceGroupHeaderFontSize 9 10 11 title Write 12 13 participant fs.Write as "fs/api_internal.go::Write()" 14 participant dlm 15 participant inode.Access as "inode/inode.go::Access()" 16 participant inode.Write as "inode/file.go::Write()" 17 participant inode.fetchInodeType as "inode/inode.go::fetchInodeType()" 18 participant inode.fetchInode as "inode/inode.go::fetchInode()" 19 participant inode.fetchOnDiskInode as "inode/inode.go::fetchOnDiskInode()" 20 participant headhunter.GetInodeRec as "headhunter/api_swift.go::GetInodeRec()" 21 participant cstruct.Unpack as "cstruct.Unpack()" 22 participant json.Unmarshal as "json.Unmarshal()" 23 participant sortedmap.OldBPlusTree as "sortedmap.OldBPlusTree()" 24 participant inode.doSendChunk as "inode/file_flusher.go::doSendChunk()" 25 participant inode.fileInodeFlusherDaemon as "inode/file_flusher.go::fileInodeFlusherDaemon()" 26 participant inode.provisionObject as "inode/inode.go::provisionObject()" 27 participant headhunter.FetchNonce as "headhunter/api_swift.go::FetchNonce()" 28 participant inode.provisionPhysicalContainer as "inode/inode.go::provisionPhysicalContainer()" 29 participant swiftclient.ContainerPut as "swiftclient.ContainerPut()" 30 participant inode.setLogSegmentContainer as "inode/file.go::setLogSegmentContainer()" 31 participant headhunter.PutLogSegmentRec as "headhunter.PutLogSegmentRec()" 32 participant swiftclient.ObjectFetchChunkedPutContext as "swiftclient.ObjectFetchChunkedPutContext()" 33 participant swiftclient.BytesPut as "swiftclient.BytesPut()" 34 participant swiftclient.SendChunk as "swiftclient.SendChunk()" 35 participant inode.recordWrite as "inode/file.go::recordWrite()" 36 participant sortedmap as "sortedmap B+Tree API" 37 38 fs.Write->dlm: obtain WriteLock 39 dlm->fs.Write 40 fs.Write->inode.Access: check for existence 41 inode.Access->fs.Write 42 fs.Write->inode.Access: check for write access 43 inode.Access->fs.Write 44 fs.Write->inode.Write: perform write 45 inode.Write->inode.fetchInodeType: fetch in-memory file inode object 46 inode.fetchInodeType->inode.fetchInode: fetch in-memory inode object 47 group if not in inode cache 48 inode.fetchInode->inode.fetchOnDiskInode: construct in-memory inode object 49 inode.fetchOnDiskInode->headhunter.GetInodeRec: fetch serialized inode 50 headhunter.GetInodeRec->inode.fetchOnDiskInode 51 inode.fetchOnDiskInode->cstruct.Unpack: unpack corruption field 52 cstruct.Unpack->inode.fetchOnDiskInode 53 inode.fetchOnDiskInode->cstruct.Unpack: unpack version field 54 cstruct.Unpack->inode.fetchOnDiskInode 55 inode.fetchOnDiskInode->json.Unmarshal: unpack json-encoded in-memory inode object 56 json.Unmarshal->inode.fetchOnDiskInode 57 inode.fetchOnDiskInode->sortedmap.OldBPlusTree: page in root of extent map 58 sortedmap.OldBPlusTree->inode.fetchOnDiskInode 59 inode.fetchOnDiskInode->inode.fetchInode 60 inode.fetchInode->inode.fetchInode: insert inode object in inode cache 61 end 62 inode.fetchInode->inode.fetchInodeType 63 inode.fetchInodeType->inode.Write 64 inode.Write->inode.doSendChunk 65 group if no fileInodeFlusherDaemon 66 inode.doSendChunk-->inode.fileInodeFlusherDaemon 67 end 68 group if no openLogSegment 69 inode.doSendChunk->inode.provisionObject 70 inode.provisionObject->headhunter.FetchNonce 71 headhunter.FetchNonce->inode.provisionObject: fetch Nonce for objectNumber 72 inode.provisionObject->inode.provisionPhysicalContainer 73 group if new phyical container needed 74 inode.provisionPhysicalContainer->headhunter.FetchNonce: fetch Nonce for containerName 75 headhunter.FetchNonce->inode.provisionPhysicalContainer 76 inode.provisionPhysicalContainer->swiftclient.ContainerPut 77 swiftclient.ContainerPut->inode.provisionPhysicalContainer 78 end 79 inode.provisionPhysicalContainer->inode.provisionObject 80 inode.provisionObject->inode.doSendChunk: return containerName & objectNumber 81 inode.doSendChunk->inode.setLogSegmentContainer 82 inode.setLogSegmentContainer->headhunter.PutLogSegmentRec: record mapping from\nobjectNumber to containerName 83 headhunter.PutLogSegmentRec->inode.setLogSegmentContainer 84 inode.setLogSegmentContainer->inode.doSendChunk 85 inode.doSendChunk->swiftclient.ObjectFetchChunkedPutContext 86 swiftclient.ObjectFetchChunkedPutContext->inode.doSendChunk 87 end 88 inode.doSendChunk->swiftclient.BytesPut: fetch where we are about to write to in LogSegment 89 swiftclient.BytesPut->inode.doSendChunk 90 inode.doSendChunk->swiftclient.SendChunk: send chunk in on-going chunked PUT context 91 swiftclient.SendChunk->inode.doSendChunk 92 inode.doSendChunk->inode.Write 93 inode.Write->inode.recordWrite: update extent map 94 inode.recordWrite->sortedmap: BisectLeft(): find where it goes 95 sortedmap->inode.recordWrite 96 inode.recordWrite->sortedmap: GetByIndex(): interate to\nsee what else it may overlap 97 sortedmap->inode.recordWrite 98 inode.recordWrite->sortedmap: PatchByIndex(): modify partial overlaps 99 sortedmap->inode.recordWrite 100 inode.recordWrite->sortedmap: DeleteByIndex(): delete full overlaps 101 sortedmap->inode.recordWrite 102 inode.recordWrite->sortedmap: Put(): insert new extent 103 sortedmap->inode.recordWrite 104 inode.recordWrite->inode.Write 105 inode.Write->fs.Write 106 fs.Write->dlm: release WriteLock 107 dlm->fs.Write 108 109 @enduml