<p dir="ltr">Hi Amar, </p>
<p dir="ltr">On May 15, 2017 2:15 PM, Amar Tumballi &lt;atumball@redhat.com&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Apr 11, 2017 at 2:59 PM, Amar Tumballi &lt;amarts@gmail.com&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Comments inline.<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Dec 19, 2016 at 1:47 PM, Xavier Hernandez &lt;xhernandez@datalab.es&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On 12/19/2016 07:57 AM, Aravinda wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; regards<br>
&gt;&gt;&gt;&gt; Aravinda<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On 12/16/2016 05:47 PM, Xavier Hernandez wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On 12/16/2016 08:31 AM, Aravinda wrote:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Proposal to add one more byte to GFID to store "Type" information.<br>
&gt;&gt;&gt;&gt;&gt;&gt; Extra byte will represent type(directory: 00, file: 01, Symlink: 02<br>
&gt;&gt;&gt;&gt;&gt;&gt; etc)<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; For example, if a directory GFID is f4f18c02-0360-4cdc-8c00-0164e49a7afd<br>
&gt;&gt;&gt;&gt;&gt;&gt; then, GFID2 will be 00f4f18c02-0360-4cdc-8c00-0164e49a7afd.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Changes to Backend store<br>
&gt;&gt;&gt;&gt;&gt;&gt; ------------------------<br>
&gt;&gt;&gt;&gt;&gt;&gt; Existing: .glusterfs/gfid[0:2]/gfid/[2:4]/gfid<br>
&gt;&gt;&gt;&gt;&gt;&gt; Proposed: .glusterfs/gfid2[0:2]/gfid2[2:4]/gfid2[4:6]/gfid2<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Advantages:<br>
&gt;&gt;&gt;&gt;&gt;&gt; -----------<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Automatic grouping in .glusterfs directory based on file Type.<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Easy identification of Type by looking at GFID in logs/status output<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; etc.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Above two will be good enough points to bump up the priority for the feature.<br>
&gt;&gt; &#160;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Crawling(Quota/AFR): List of directories can be easily fetched by<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; crawling `.glusterfs/gfid2[0:2]/` directory. This enables easy<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; parallel Crawling.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; With the current design, we still have to do a distributed readdir() to get all <br>
&gt;&gt; the entries in the directory. This layout change, along with proposed <br>
&gt;&gt; DHT2/EHT/DHT2+ (name for me doesn't matter here) layout, where directory <br>
&gt;&gt; entries would be created in just one place should enhance the performance overall.<br>
&gt;&gt; &#160;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Quota - Marker: Marker transator can mark xtime of current file and<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; parent directory. No need to update xtime xattr of all directories<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; till root.<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Geo-replication: - Crawl can be multithreaded during initial sync.<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; With marker changes above it will be more effective in crawling.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt; &#160;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Please add if any more advantageous.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Disadvantageous:<br>
&gt;&gt;&gt;&gt;&gt;&gt; ----------------<br>
&gt;&gt;&gt;&gt;&gt;&gt; Functionality is not changed with the above change except the length<br>
&gt;&gt;&gt;&gt;&gt;&gt; of the ID. I can't think of any disadvantages except the code changes<br>
&gt;&gt;&gt;&gt;&gt;&gt; to accommodate this change. Let me know if I missed anything here.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; One disadvantage is that 17 bytes is a very ugly number for<br>
&gt;&gt;&gt;&gt;&gt; structures. Compilers will add paddings that will make any structure<br>
&gt;&gt;&gt;&gt;&gt; containing a GFID noticeable bigger. This will also cause troubles on<br>
&gt;&gt;&gt;&gt;&gt; all binary formats where a GFID is used, making them incompatible. One<br>
&gt;&gt;&gt;&gt;&gt; clear case of this is the XDR encoding of the gluster protocol.<br>
&gt;&gt;&gt;&gt;&gt; Currently a GFID is defined this way in many places:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; &#160; &#160; &#160; &#160; opaque gfid[16]<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; This seems to make it quite complex to allow a mix of gluster versions<br>
&gt;&gt;&gt;&gt;&gt; in the same cluster (for example in a middle of an upgrade).<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Totally agree with Xavier here. Not in support of adding one more byte.<br>
&gt;&gt; &#160;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; What about this alternative approach:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Based on the RFC4122 [1] that describes the format of an UUID, we can<br>
&gt;&gt;&gt;&gt;&gt; define a new structure for new GFID's using the same length.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Currently all GFID's are generated using the "random" method. This<br>
&gt;&gt;&gt;&gt;&gt; means that all GFID have this structure:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; &#160; &#160; &#160; &#160; xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Where N can be 8, 9, A or B, and M is 4.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; There are some special GFID's that have a M=0 and N=0, for example the<br>
&gt;&gt;&gt;&gt;&gt; root GFID.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; What I propose is to use a new variant of GFID, for example E or F<br>
&gt;&gt;&gt;&gt;&gt; (officially marked as reserved for future definition) or even 0 to 7.<br>
&gt;&gt;&gt;&gt;&gt; We could use M as an internal version for the GFID structure (defined<br>
&gt;&gt;&gt;&gt;&gt; by ourselves when needed). Then we could use the first 4 or 8 bits of<br>
&gt;&gt;&gt;&gt;&gt; each GFID as you propose, without needing to extend current GFID<br>
&gt;&gt;&gt;&gt;&gt; length nor risking to collide with existing GFID's.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; If we are concerned about the collision probability (quite small but<br>
&gt;&gt;&gt;&gt;&gt; still bigger than the current version) because we loose some random<br>
&gt;&gt;&gt;&gt;&gt; bits, we could use N = 0..7 and leave M random. This way we get 5 more<br>
&gt;&gt;&gt;&gt;&gt; random bits, from which we could use 4 to represent the inode type.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; I think this way everything will work smoothly with older versions<br>
&gt;&gt;&gt;&gt;&gt; with minimal effort.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; What do you think ?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; That is really nice suggestion.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; To get the crawling advantageous as mentioned above, we need to make<br>
&gt;&gt;&gt;&gt; backend store as .glusterfs/N/gfid[0:2]/gfid[2:4]/gfid<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; That's one possibility. Since N will be 4 bits at most, it won't collide with currently existing subdirectories that represent 8 bits. Or we could use M. It all depends on the exact interpretation we give to each field.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; One suggestion I would make is to define it in a way that we use the minimal amount of bits to represent what we need now but leave space for future extensions. For example creating a "reserved" value for the field.<br>
&gt;&gt;&gt;<br>
&gt;<br>
&gt; While discussing this with Aravinda, we realized, if we just make changes in UUID generation logic, we don't need to be worried about version incompatibility.</p>
<p dir="ltr">Yes. That's one of the main advantages of keeping an standard UUID. </p>
<p dir="ltr">&gt;<br>
&gt; Also, I have a question, What are the chances of uuid collision if we take just 3 bits from the first byte ? <br>
&gt;<br>
&gt; 000 - Unspecified (can be anything).<br>
&gt; 001 - Directory<br>
&gt; 010 - Regular File<br>
&gt; 011 - Special files (symlink, Block and Char devices, socket files etc).<br>
&gt; {100 - 111} - Reserved.</p>
<p dir="ltr">This cannot be done. Since we are currently using random UUIDs, on average, one of every eight randomly generated ids will start with each one of the combinations. </p>
<p dir="ltr">Already existing GFIDs will be a problem when updating. The only thing that can avoid the problem is to create new GFIDs in a format that won't collide with existing ones, and this can only be done safely if we use the special fiels of the UUID itself. </p>
<p dir="ltr">&gt;<br>
&gt; As a side-effect, it reduces the number of directories created at as the metadata, inside of .glusterfs directory. (Will be 50% of current load). </p>
<p dir="ltr">Maybe we can find a better way to store the GFIDs using the standard fields instead of relying on the first bits, which is not a valid solution. </p>
<p dir="ltr">We can think more about this. </p>
<p dir="ltr">Xavi</p>
<p dir="ltr">&gt;<br>
&gt; -Amar<br>
&gt; &#160;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Proposal:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Use N = 00xx for special GFID's, like NULL GFID, or the ones currently used in some places. All these will also have M = 0. All other values of M will be reserved for future extensions.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Also reserve all other values of N (01xx) for future extensions.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This gives a lot of space to represent many things in the future if necessary, while keeping current usage compatible with it.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; For this particular case we could use N = 0000 and define M as (this is a mapping of the posix S_IFxxx values):<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; M = 0000 Current special GFID's<br>
&gt;&gt;&gt; M = 0001 Fifo (S_IFIFO)<br>
&gt;&gt;&gt; M = 0010 Character Device (S_IFCHR)<br>
&gt;&gt;&gt; M = 0100 Directory (S_IFDIR)<br>
&gt;&gt;&gt; M = 0110 Block Device (S_IFBLK)<br>
&gt;&gt;&gt; M = 1000 Regular File (S_IFREG)<br>
&gt;&gt;&gt; M = 1010 Symbolic Link (S_IFLNK)<br>
&gt;&gt;&gt; M = 1100 Socket (S_IFSOCK)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; M = xx11 \<br>
&gt;&gt;&gt; M = x1x1&#160; | Reserved for future extensions<br>
&gt;&gt;&gt; M = 1xx1&#160; |<br>
&gt;&gt;&gt; M = 111x /<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; If we use our own mapping instead of using the same values than IF_Sxxx macros, we can get a more compact representation if needed.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; In this case the directory structure could be .glusterfs/M/gfid[0:2]/gfid[2:4]/gfid. And use M = 0 to put all current existing gfid's, or we could leave existing gfid's in their current location.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Or we could even have .glusterfs/NM/gfid[0:2]/gfid[2:4]/gfid. This would probably be compatible even with future extensions.<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I would go with only 'M' being considered for current layout and keeping N for future developments. Even though we are not considering 'N' internally, we can keep directory name as '00MM' (zero zero M M). so that backend layout would be compatible to consider N later if required.<br>
&gt;&gt;<br>
&gt;&gt; One major thing is we need a solid plan for migration from current layout to newer layout.<br>
&gt;&gt;<br>
&gt;&gt; Regards,<br>
&gt;&gt; Amar<br>
&gt;&gt; &#160;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Xavi<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Xavi<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; [1] https://www.ietf.org/rfc/rfc4122.txt<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Changes:<br>
&gt;&gt;&gt;&gt;&gt;&gt; ---------<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Code changes to accommodate 17 bytes GFID instead of 16 bytes(Read<br>
&gt;&gt;&gt;&gt;&gt;&gt; &#160; and Write)<br>
&gt;&gt;&gt;&gt;&gt;&gt; - Migration Tool to upgrade GFIDs in Volume/Cluster<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Let me know your thoughts.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; Gluster-devel mailing list<br>
&gt;&gt;&gt; Gluster-devel@gluster.org<br>
&gt;&gt;&gt; http://www.gluster.org/mailman/listinfo/gluster-devel<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Gluster-devel mailing list<br>
&gt;&gt; Gluster-devel@gluster.org<br>
&gt;&gt; http://lists.gluster.org/mailman/listinfo/gluster-devel<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; -- <br>
&gt; Amar Tumballi (amarts)<br></p>