Thread (15 messages) flat view 15 messages, 3 authors, 2018-08-16

Re: [PATCH v4 1/7] Add delta-islands.{c,h}

From: Ramsay Jones <hidden>
Date: 2018-08-13 12:17:23


On 13/08/18 04:33, Christian Couder wrote:
On Mon, Aug 13, 2018 at 3:14 AM, Ramsay Jones
[snip]
quoted
And neither the sha1 or str hash-maps are destroyed here.
(That is not necessarily a problem, of course! ;-) )
The instances are declared as static:

  static khash_sha1 *island_marks;

  static kh_str_t *remote_islands;

so it maybe ok.
Yes, that's fine.
quoted
quoted
+struct island_bitmap {
+     uint32_t refcount;
+     uint32_t bits[];
Use FLEX_ARRAY here? We are slowly moving toward requiring
certain C99 features, but I can't remember a flex array
weather-balloon patch.
This was already discussed by Junio and Peff there:

https://public-inbox.org/git/20180727130229.GB18599@sigill.intra.peff.net/
That is a fine discussion, without a firm conclusion, but I don't
think you can simply do nothing here:

  $ cat -n junk.c
       1	#include <stdint.h>
       2	
       3	struct island_bitmap {
       4		uint32_t refcount;
       5		uint32_t bits[];
       6	};
       7	
  $ gcc --std=c89 --pedantic -c junk.c
  junk.c:5:11: warning: ISO C90 does not support flexible array members [-Wpedantic]
    uint32_t bits[];
             ^~~~
  $ gcc --std=c99 --pedantic -c junk.c
  $ 
  
quoted
quoted
+};
quoted
quoted
+int in_same_island(const struct object_id *trg_oid, const struct object_id *src_oid)
Hmm, what does the trg_ prefix stand for?
quoted
+{
+     khiter_t trg_pos, src_pos;
+
+     /* If we aren't using islands, assume everything goes together. */
+     if (!island_marks)
+             return 1;
+
+     /*
+      * If we don't have a bitmap for the target, we can delta it
... Ah, OK, trg_ => target.
I am ok to replace "trg" with "target" (or maybe "dst"? or something
else) and "src" with "source" if you think it would make things
clearer.
If it had been dst_ (or target), I would not have had a 'huh?'
moment, but it is not all that important.
quoted
quoted
+static void add_ref_to_island(const char *island_name, const struct object_id *oid)
+{
+     uint64_t sha_core;
+     struct remote_island *rl = NULL;
+
+     int hash_ret;
+     khiter_t pos = kh_put_str(remote_islands, island_name, &hash_ret);
+
+     if (hash_ret) {
+             kh_key(remote_islands, pos) = xstrdup(island_name);
+             kh_value(remote_islands, pos) = xcalloc(1, sizeof(struct remote_island));
+     }
+
+     rl = kh_value(remote_islands, pos);
+     oid_array_append(&rl->oids, oid);
+
+     memcpy(&sha_core, oid->hash, sizeof(uint64_t));
+     rl->hash += sha_core;
Hmm, so the first 64-bits of the oid of each ref that is part of
this island is added together as a 'hash' for the island. And this
is used to de-duplicate the islands? Any false positives? (does it
matter - it would only affect performance, not correctness, right?)
I would think that a false positive from pure chance is very unlikely.
We would need to approach billions of delta islands (as 2 to the power
64/2 is in the order of billions) for the probability to be
significant. GitHub has less than 50 millions users and it is very
unlikely that a significant proportion of these users will fork the
same repo.

Now if there is a false positive because two forks have exactly the
same refs, then it is not a problem if they are considered the same,
because they are actually the same.
Yep, good point.

ATB,
Ramsay Jones
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help