github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/docs/source/architecture/uml/read.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 Read 12 13 participant fs.Read as "fs/api_internal.go::Read()" 14 participant dlm 15 participant inode.Access as "inode/inode.go::Access()" 16 participant inode.GetType as "inode/inode.go::GetType()" 17 participant inode.Read as "inode/file.go::Read()" 18 participant inode.fetchInodeType as "inode/inode.go::fetchInodeType()" 19 participant inode.fetchInode as "inode/inode.go::fetchInode()" 20 participant inode.fetchOnDiskInode as "inode/inode.go::fetchOnDiskInode()" 21 participant headhunter.GetInodeRec as "headhunter/api_swift.go::GetInodeRec()" 22 participant cstruct.Unpack as "cstruct.Unpack()" 23 participant json.Unmarshal as "json.Unmarshal()" 24 participant sortedmap.OldBPlusTree as "sortedmap.OldBPlusTree()" 25 participant inode.getReadPlanHelper as "inode/file.go::getReadPlanHelper()" 26 participant sortedmap as "sortedmap B+Tree API" 27 participant inode.doReadPlan as "inode/file_flusher.go::doReadPlan()" 28 participant swiftclient.Read as "swiftclient.Read()" 29 participant swiftclient.ObjectGet as "swiftclient.ObjectGet()" 30 31 fs.Read->dlm: obtain ReadLock 32 dlm->fs.Read 33 fs.Read->inode.Access: check for existence 34 inode.Access->fs.Read 35 fs.Read->inode.Access: check for read access 36 inode.Access->fs.Read 37 fs.Read->inode.GetType: ensure this is a file inode 38 inode.GetType->fs.Read 39 fs.Read->inode.Read: perform read 40 inode.Read->inode.fetchInodeType: fetch in-memory file inode object 41 inode.fetchInodeType->inode.fetchInode: fetch in-memory inode object 42 group if not in inode cache 43 inode.fetchInode->inode.fetchOnDiskInode: construct in-memory inode object 44 inode.fetchOnDiskInode->headhunter.GetInodeRec: fetch serialized inode 45 headhunter.GetInodeRec->inode.fetchOnDiskInode 46 inode.fetchOnDiskInode->cstruct.Unpack: unpack corruption field 47 cstruct.Unpack->inode.fetchOnDiskInode 48 inode.fetchOnDiskInode->cstruct.Unpack: unpack version field 49 cstruct.Unpack->inode.fetchOnDiskInode 50 inode.fetchOnDiskInode->json.Unmarshal: unpack json-encoded in-memory inode object 51 json.Unmarshal->inode.fetchOnDiskInode 52 inode.fetchOnDiskInode->sortedmap.OldBPlusTree: page in root of extent map 53 sortedmap.OldBPlusTree->inode.fetchOnDiskInode 54 inode.fetchOnDiskInode->inode.fetchInode 55 inode.fetchInode->inode.fetchInode: insert inode object in inode cache 56 end 57 inode.fetchInode->inode.fetchInodeType 58 inode.fetchInodeType->inode.Read 59 inode.Read->inode.getReadPlanHelper: fetch read plan 60 inode.getReadPlanHelper->sortedmap: BisectLeft(): find requestedOffset in extent map 61 group iterate requestedOffset for requestedLength 62 inode.getReadPlanHelper->sortedmap: GetByIndex(): find next extent 63 sortedmap->inode.getReadPlanHelper 64 end 65 inode.getReadPlanHelper->inode.Read: return read plan 66 inode.Read->inode.doReadPlan: execute read plan 67 inode.doReadPlan->inode.doReadPlan: if len(readPlan) == 1 68 activate inode.doReadPlan 69 inode.doReadPlan->inode.doReadPlan: if lone readPlanStep == zero-fill 70 activate inode.doReadPlan 71 inode.doReadPlan->inode.doReadPlan: construct zero-filled buf 72 inode.doReadPlan->inode.Read: return zero-filled buf 73 deactivate inode.doReadPlan 74 inode.doReadPlan->inode.doReadPlan: if lone readPlanStep is to inFlightLogSegment 75 activate inode.doReadPlan 76 inode.doReadPlan->swiftclient.Read: fetch buf from inFlightLogSegment 77 swiftclient.Read->inode.doReadPlan 78 inode.doReadPlan->inode.Read: return buf from inFlightLogSegment 79 deactivate inode.doReadPlan 80 inode.doReadPlan->inode.doReadPlan: if lone readPlanStep would land in single read cache line 81 activate inode.doReadPlan 82 inode.doReadPlan->swifclient.ObjectGet: if read cache miss, fill a cache line 83 swifclient.ObjectGet->inode.doReadPlan 84 inode.doReadPlan->inode.Read: return buf from reach cache line 85 deactivate inode.doReadPlan 86 deactivate inode.doReadPlan 87 inode.doReadPlan->inode.doReadPlan: make a returnBuf to receive readPlanStep data 88 group loop over each readPlanStep of readPlan 89 inode.doReadPlan->inode.doReadPlan: if readPlanStep == zero-fill 90 activate inode.doReadPlan 91 inode.doReadPlan->inode.doReadPlan: construct zero-filled buf 92 inode.doReadPlan->inode.doReadPlan: append zero-filled buf to returnBuf 93 deactivate inode.doReadPlan 94 inode.doReadPlan->inode.doReadPlan: if readPlanStep is to inFlightLogSegment 95 activate inode.doReadPlan 96 inode.doReadPlan->swiftclient.Read: fetch buf from inFlightLogSegment 97 swiftclient.Read->inode.doReadPlan 98 inode.doReadPlan->inode.doReadPlan: append buf from inFlightLogSegment to returnBuf 99 deactivate inode.doReadPlan 100 inode.doReadPlan->inode.doReadPlan: if readPlanStep needs to reference read cache 101 activate inode.doReadPlan 102 group loop for each read cache line reference 103 inode.doReadPlan->swifclient.ObjectGet: if read cache miss, fill a cache line 104 swifclient.ObjectGet->inode.doReadPlan 105 inode.doReadPlan->inode.doReadPlan: append buf from reach cache line to returnBuf 106 end 107 deactivate inode.doReadPlan 108 end 109 inode.doReadPlan->inode.Read: return returnBuf 110 inode.Read->fs.Read 111 fs.Read->dlm: release ReadLock 112 dlm->fs.Read 113 114 @enduml