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