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