github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/docs/source/architecture/uml/bimodal-put-newfile.uml (about) 1 @startuml 2 3 title Bimodal PUT API - New File Top Directory Case 4 5 autonumber 6 7 box "Swift WSGI" 8 participant WSGI 9 participant RPCclient 10 end box 11 box "ProxyFS" 12 participant PFSrpcsvr 13 participant PFSfs 14 participant PFSinode 15 end box 16 participant SwiftBE 17 18 ->WSGI: <URI>?Put 19 20 WSGI -> WSGI:Virtual account 21 22 WSGI -> RPCclient:<B><I>proxyfs_put_location(authUser, vAccount)</I></B>\n"What pPATH should I use?" 23 24 RPCclient -> PFSrpcsvr:<B><I>RpcPutLocation(authUser,\n<B><I>vAccount)</I></B> i.e. "What pPATH should I use?" 25 26 PFSrpcsvr -> PFSrpcsvr:Extract components of vPATH 27 28 PFSrpcsvr -> PFSrpcsvr:Get mapping of vAccount to volumeName 29 30 PFSrpcsvr -> PFSfs:If volume is not mounted for this user,\n<B><I>fs.Mount(volumeName, mountOptions, authUser)</I></B> 31 32 PFSfs -> PFSrpcsvr:Return mountId, rootInodeNumber, err 33 34 PFSrpcsvr -> PFSfs:<B><I>fs.CallInodeToProvisionObject()</I></B> 35 36 PFSfs -> PFSinode:<B><I>inode.ProvisionObject()</I></B> 37 38 PFSinode -> PFSfs:Respond with pPATH 39 40 PFSfs -> PFSrpcsvr: Returns pPATH for physical\naccount 41 42 PFSrpcsvr -> RPCclient: Response for\n<B><I>RpcPutLocation(vPATH)</I></B>\nis target location of object in\nphysical account. 43 44 RPCclient -> WSGI: Response for\n<B><I>proxyfs_put_location(vPATH)</I></B>\nis target location of object in physical\naccount. 45 46 WSGI -> SwiftBE:<B><I>PUT(BODY, pPATH, data)</I></B>\nPuts data for vPATH in physical account.\nNOTE: User metadata should not be\nwritten! 47 SwiftBE -> WSGI:Response for <B><I>PUT(pPATH, data)</I></B>\nis status 48 49 WSGI -> RPCclient:<B><I>proxyfs_put_complete(authUser, vPATH,\n<B><I>pPATH, size, metadata)</I></B>\nCompleted writing initial PUT of payload 50 51 RPCclient -> PFSrpcsvr:<B><I>RpcPutComplete(authUser, vPATH,\n<B><I>pPATH, metadata, size)</I></B>.\nCompleted writing initial PUT\nof payload 52 53 PFSrpcsvr -> PFSrpcsvr:Extract components of vPATH 54 55 PFSrpcsvr -> PFSrpcsvr:Get mapping of vAccount to volumeName 56 57 PFSrpcsvr -> PFSfs:If volume is not mounted for this user,\n<B><I>fs.Mount(volumeName, mountOptions, authUser)</I></B> 58 59 PFSfs -> PFSrpcsvr:Return mountId, rootInodeNumber, err 60 61 PFSrpcsvr -> PFSfs:<B><I>fs.Put(mountId, rootInodeNumber, vContainer)</I></B> 62 63 PFSfs -> PFSfs:<B><I>fs.Lookup(mountId, rootInodeNumber, vContainer)</I></B> 64 PFSfs -> PFSfs:Return dirInode 65 66 PFSfs -> PFSfs:<B><I>fs.CreateFsMetaData(vPATH, pPATH,\n<B><I>dirInode, metadata, size)</I></B> 67 68 PFSfs -> PFSinode:<B><I>inode.CreateFile()</I></B> 69 PFSinode -> PFSfs:Return fileInodeNumber, err 70 71 PFSfs -> PFSinode:<B><I>inode.Wrote(fileInodeNumber, fileoffset,\n<B><I>objectPath, objectoffset, length,\n<B><I>metadataMap[string]string ????)</I></B> 72 73 PFSinode -> PFSfs:Return status 74 75 PFSinode -> SwiftBE:When flushed,\nwrite btree 76 SwiftBE -> PFSinode: Response to flush 77 78 PFSfs -> PFSinode:<B><I>inode.Link(dirInode, "/"??,\n<B><I>targetInodeNumber???)</I></B> 79 PFSinode -> PFSfs:Return status 80 81 PFSinode -> SwiftBE:When flushed,\nwrite btree 82 83 SwiftBE -> PFSinode: Response to flush 84 85 PFSinode -> PFSfs:FsMetaData created\nflush completed 86 87 PFSfs -> PFSfs: Response to <B><I>fs.CreateMetaData()</I></B>\nis status 88 89 PFSfs -> PFSrpcsvr: Response to <B><I>fs.Put()</I></B>\nis status 90 91 PFSrpcsvr -> RPCclient:Response for\n<B><I>RpcPutComplete(vPATH,\n<B><I>pPATH, size, metadata)</I></B>\nis status 92 93 RPCclient -> WSGI:Response for\n<B><I>proxyfs_put_complete(vPATH, pPATH, size,\nmetadata)</I></B>\nis status 94 95 <-WSGI: Return status code 96 97 98 @enduml