From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Tremer To: development@lists.ipfire.org Subject: Re: [PATCH] squid 3.5.20: latest patches from upstream Date: Wed, 03 Aug 2016 11:47:09 +0100 Message-ID: <1470221229.2710.433.camel@ipfire.org> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6721080753957259619==" List-Id: --===============6721080753957259619== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi, I didn't check the source, yet because it fails to apply before that: [root(a)rice-oxley ipfire-2.x]# pwclient git-am -s 692 Applying patch #692 using 'git am -s' Description: squid 3.5.20: latest patches from upstream Applying: squid 3.5.20: latest patches from upstream .git/rebase-apply/patch:50: trailing whitespace. #=C2=A0 .git/rebase-apply/patch:57: trailing whitespace. =C2=A0 .git/rebase-apply/patch:73: trailing whitespace. =C2=A0 .git/rebase-apply/patch:81: trailing whitespace. =C2=A0 .git/rebase-apply/patch:107: trailing whitespace. =C2=A0 error: patch failed: lfs/squid:70 error: lfs/squid: patch does not apply Patch failed at 0001 squid 3.5.20: latest patches from upstream The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". 'git am' failed with exit status 128 On Tue, 2016-08-02 at 20:49 +0200, Matthias Fischer wrote: > Hi, >=20 > On 02.08.2016 17:14, Michael Tremer wrote: > > This one won't apply onto next... :( > >=20 > > Could you please check why? >=20 > Its always the same here (*sigh*): sources seemed to be missing. >=20 > Please check again. Its running here. >=20 > Best, > Matthias >=20 > > On Sun, 2016-07-24 at 13:44 +0200, Matthias Fischer wrote: > > > Signed-off-by: Matthias Fischer > > > --- > > > =C2=A0lfs/squid=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|=C2=A0=C2=A0=C2=A03= + > > > =C2=A0src/patches/squid/squid-3.5-14067.patch | 381 > > > ++++++++++++++++++++++++++++++++ > > > =C2=A0src/patches/squid/squid-3.5-14068.patch |=C2=A0=C2=A035 +++ > > > =C2=A0src/patches/squid/squid-3.5-14069.patch |=C2=A0=C2=A030 +++ > > > =C2=A04 files changed, 449 insertions(+) > > > =C2=A0create mode 100644 src/patches/squid/squid-3.5-14067.patch > > > =C2=A0create mode 100644 src/patches/squid/squid-3.5-14068.patch > > > =C2=A0create mode 100644 src/patches/squid/squid-3.5-14069.patch > > >=20 > > > diff --git a/lfs/squid b/lfs/squid > > > index 5bc976e..a88f0c5 100644 > > > --- a/lfs/squid > > > +++ b/lfs/squid > > > @@ -70,6 +70,9 @@ $(subst %,%_MD5,$(objects)) : > > > =C2=A0$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) > > > =C2=A0 @$(PREBUILD) > > > =C2=A0 @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar xaf > > > $(DIR_DL)/$(DL_FILE) > > > + cd $(DIR_APP) && patch -Np0 -i > > > $(DIR_SRC)/src/patches/squid/squid- > > > 3.5-14067.patch > > > + cd $(DIR_APP) && patch -Np0 -i > > > $(DIR_SRC)/src/patches/squid/squid- > > > 3.5-14068.patch > > > + cd $(DIR_APP) && patch -Np0 -i > > > $(DIR_SRC)/src/patches/squid/squid- > > > 3.5-14069.patch > > > =C2=A0 cd $(DIR_APP) && patch -Np0 -i $(DIR_SRC)/src/patches/squid- > > > 3.5.17- > > > fix-max-file-descriptors.patch > > > =C2=A0 > > > =C2=A0 cd $(DIR_APP) && autoreconf -vfi > > > diff --git a/src/patches/squid/squid-3.5-14067.patch > > > b/src/patches/squid/squid-3.5-14067.patch > > > new file mode 100644 > > > index 0000000..8d9cb21 > > > --- /dev/null > > > +++ b/src/patches/squid/squid-3.5-14067.patch > > > @@ -0,0 +1,381 @@ > > > +------------------------------------------------------------ > > > +revno: 14067 > > > +revision-id: squid3(a)treenet.co.nz-20160723071620-1wzqpbyi1rk5w6vg > > > +parent: squid3(a)treenet.co.nz-20160701113616-vpjak1pq4uecadd2 > > > +fixes bug: http://bugs.squid-cache.org/show_bug.cgi?id=3D4534 > > > +committer: Amos Jeffries > > > +branch nick: 3.5 > > > +timestamp: Sat 2016-07-23 19:16:20 +1200 > > > +message: > > > +=C2=A0=C2=A0Bug 4534: assertion failure in xcalloc when using many cac= he_dir > > > +------------------------------------------------------------ > > > +# Bazaar merge directive format 2 (Bazaar 0.90) > > > +# revision_id: squid3(a)treenet.co.nz-20160723071620-1wzqpbyi1rk5w6vg > > > +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# testament_sha1: fcd663f0fd4a24d505f81eb94ef95d627a4ca363 > > > +# timestamp: 2016-07-23 07:24:01 +0000 > > > +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# base_revision_id: squid3(a)treenet.co.nz-20160701113616-\ > > > +#=C2=A0=C2=A0=C2=A0vpjak1pq4uecadd2 > > > +#=C2=A0 > > > +# Begin patch > > > +=3D=3D=3D modified file 'src/CacheDigest.cc' > > > +--- src/CacheDigest.cc 2016-01-01 00:14:27 +0000 > > > ++++ src/CacheDigest.cc 2016-07-23 07:16:20 +0000 > > > +@@ -35,12 +35,12 @@ > > > + static uint32_t hashed_keys[4]; > > > +=C2=A0 > > > + static void > > > +-cacheDigestInit(CacheDigest * cd, int capacity, int bpe) > > > ++cacheDigestInit(CacheDigest * cd, uint64_t capacity, uint8_t bpe) > > > + { > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const size_t mask_size =3D cacheDigestCalcMas= kSize(capacity, bpe); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint32_t mask_size =3D cacheDigestCalcM= askSize(capacity, bpe); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert(cd); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert(capacity > 0 && bpe > 0); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0assert(mask_size > 0); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0assert(mask_size !=3D 0); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->capacity =3D capacity; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->bits_per_entry =3D bpe; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->mask_size =3D mask_size; > > > +@@ -50,7 +50,7 @@ > > > + } > > > +=C2=A0 > > > + CacheDigest * > > > +-cacheDigestCreate(int capacity, int bpe) > > > ++cacheDigestCreate(uint64_t capacity, uint8_t bpe) > > > + { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CacheDigest *cd =3D (CacheDigest *)memAl= locate(MEM_CACHE_DIGEST); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert(SQUID_MD5_DIGEST_LENGTH =3D=3D 16= );=C2=A0=C2=A0/* our hash functions rely > > > on 16 > > > byte keys */ > > > +@@ -97,7 +97,7 @@ > > > +=C2=A0 > > > + /* changes mask size, resets bits to 0, preserves "cd" pointer */ > > > + void > > > +-cacheDigestChangeCap(CacheDigest * cd, int new_cap) > > > ++cacheDigestChangeCap(CacheDigest * cd, uint64_t new_cap) > > > + { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert(cd); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cacheDigestClean(cd); > > > +@@ -278,12 +278,12 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "%s digest: size: %= d bytes\n", > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0label ? = label : "", stats.bit_count / 8 > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "\t entries: count: %d c= apacity: %d util: > > > %d%%\n", > > > ++=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "\t entries: count: %" P= RIu64 " capacity: %" > > > PRIu64 > > > " util: %d%%\n", > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->coun= t, > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->capa= city, > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0xpercent= Int(cd->count, cd->capacity) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "\t deletion attempts: %= d\n", > > > ++=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "\t deletion attempts: %= " PRIu64 "\n", > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cd->del_= count > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0storeAppendPrintf(e, "\t bits: per entry= : %d on: %d capacity: %d > > > util: > > > %d%%\n", > > > +@@ -297,16 +297,18 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); > > > + } > > > +=C2=A0 > > > +-size_t > > > +-cacheDigestCalcMaskSize(int cap, int bpe) > > > ++uint32_t > > > ++cacheDigestCalcMaskSize(uint64_t cap, uint8_t bpe) > > > + { > > > +-=C2=A0=C2=A0=C2=A0=C2=A0return (size_t) (cap * bpe + 7) / 8; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t bitCount =3D (cap * bpe) + 7; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0assert(bitCount < INT_MAX); // dont 31-bit ov= erflow later > > > ++=C2=A0=C2=A0=C2=A0=C2=A0return static_cast(bitCount / 8); > > > + } > > > +=C2=A0 > > > + static void > > > + cacheDigestHashKey(const CacheDigest * cd, const cache_key * key) > > > + { > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const unsigned int bit_count =3D cd->mask_siz= e * 8; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint32_t bit_count =3D cd->mask_size * = 8; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unsigned int tmp_keys[4]; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* we must memcpy to ensure alignment */ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy(tmp_keys, key, sizeof(tmp_keys)); > > > + > > > +=3D=3D=3D modified file 'src/CacheDigest.h' > > > +--- src/CacheDigest.h 2016-01-01 00:14:27 +0000 > > > ++++ src/CacheDigest.h 2016-07-23 07:16:20 +0000 > > > +@@ -22,23 +22,23 @@ > > > + { > > > + public: > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* public, read-only */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0char *mask;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0/* bit mask */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int mask_size;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* mask size in bytes */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int capacity;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* expected maximum for .count, not a hard limit > > > */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int bits_per_entry;=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* number of bits allocated for each entry > > > from > > > capacity */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int count;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0/* number of digested entries */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int del_count;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* number of deletions performed so far */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t count;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* number of digested entries */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t del_count;=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* number of deletions performed so far */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t capacity;=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0/* expected maximum for .count, not a hard > > > limit */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0char *mask;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* bit mask */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint32_t mask_size;=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* mask size in bytes */ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0int8_t bits_per_entry;=C2=A0=C2=A0=C2=A0/* nu= mber of bits allocated for each entry > > > from > > > capacity */ > > > + }; > > > +=C2=A0 > > > +-CacheDigest *cacheDigestCreate(int capacity, int bpe); > > > ++CacheDigest *cacheDigestCreate(uint64_t capacity, uint8_t bpe); > > > + void cacheDigestDestroy(CacheDigest * cd); > > > + CacheDigest *cacheDigestClone(const CacheDigest * cd); > > > + void cacheDigestClear(CacheDigest * cd); > > > +-void cacheDigestChangeCap(CacheDigest * cd, int new_cap); > > > ++void cacheDigestChangeCap(CacheDigest * cd, uint64_t new_cap); > > > + int cacheDigestTest(const CacheDigest * cd, const cache_key * key); > > > + void cacheDigestAdd(CacheDigest * cd, const cache_key * key); > > > + void cacheDigestDel(CacheDigest * cd, const cache_key * key); > > > +-size_t cacheDigestCalcMaskSize(int cap, int bpe); > > > ++uint32_t cacheDigestCalcMaskSize(uint64_t cap, uint8_t bpe); > > > + int cacheDigestBitUtil(const CacheDigest * cd); > > > + void cacheDigestGuessStatsUpdate(CacheDigestGuessStats * stats, int > > > real_hit, int guess_hit); > > > + void cacheDigestGuessStatsReport(const CacheDigestGuessStats * stats, > > > StoreEntry * sentry, const char *label); > > > + > > > +=3D=3D=3D modified file 'src/PeerDigest.h' > > > +--- src/PeerDigest.h 2016-01-01 00:14:27 +0000 > > > ++++ src/PeerDigest.h 2016-07-23 07:16:20 +0000 > > > +@@ -52,7 +52,7 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0store_client *old_sc; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0HttpRequest *request; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int offset; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int mask_offset; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint32_t mask_offset; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0time_t start_time; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0time_t resp_time; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0time_t expires; > > > + > > > +=3D=3D=3D modified file 'src/peer_digest.cc' > > > +--- src/peer_digest.cc 2016-01-01 00:14:27 +0000 > > > ++++ src/peer_digest.cc 2016-07-23 07:16:20 +0000 > > > +@@ -754,7 +754,7 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!reason && !size) { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!pd->cd) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0reason =3D "null digest?!"; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (fetch->mask_= offset !=3D (int)pd->cd->mask_size) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (fetch->mask_= offset !=3D pd->cd->mask_size) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0reason =3D "premature end of digest?!"; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (!peerDi= gestUseful(pd)) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0reason =3D "useless digest"; > > > + > > > +=3D=3D=3D modified file 'src/store_digest.cc' > > > +--- src/store_digest.cc 2016-01-01 00:14:27 +0000 > > > ++++ src/store_digest.cc 2016-07-23 07:16:20 +0000 > > > +@@ -76,36 +76,63 @@ > > > + static void storeDigestRewriteFinish(StoreEntry * e); > > > + static EVH storeDigestSwapOutStep; > > > + static void storeDigestCBlockSwapOut(StoreEntry * e); > > > +-static int storeDigestCalcCap(void); > > > +-static int storeDigestResize(void); > > > + static void storeDigestAdd(const StoreEntry *); > > > +=C2=A0 > > > ++/// calculates digest capacity > > > ++static uint64_t > > > ++storeDigestCalcCap() > > > ++{ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0/* > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* To-Do: Bloom proved that the optimal = filter utilization is 50% > > > (half > > > of > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* the bits are off). However, we do not= have a formula to calculate > > > the > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* number of _entries_ we want to pre-al= locate for. > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t hi_cap =3D Store::Root().maxSi= ze() / > > > Config.Store.avgObjectSize; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t lo_cap =3D 1 + Store::Root().c= urrentSize() / > > > Config.Store.avgObjectSize; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t e_count =3D StoreEntry::inUseC= ount(); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t cap =3D e_count ? e_count : hi_cap; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "have: " << e_count << ", want = " << cap << > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0" e= ntries; limits: [" << lo_cap << ", " << hi_cap << "]"); > > > ++ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (cap < lo_cap) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cap =3D lo_cap; > > > ++ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0/* do not enforce hi_cap limit, average-based= estimation may be > > > wrong > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*if (cap > hi_cap) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*=C2=A0=C2=A0cap =3D hi_cap; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ > > > ++ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0// Bug 4534: we still have to set an upper-li= mit at some reasonable > > > value though. > > > ++=C2=A0=C2=A0=C2=A0=C2=A0// this matches cacheDigestCalcMaskSize doing= (cap*bpe)+7 < INT_MAX > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t absolute_max =3D (INT_MAX -8) / > > > Config.digest.bits_per_entry; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (cap > absolute_max) { > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0static time_t last_lo= ud =3D 0; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (last_loud < squid= _curtime - 86400) { > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0debugs(71, DBG_IMPORTANT, "WARNING: Cache Digest cannot > > > store " > > > << cap << " entries. Limiting to " << absolute_max); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0last_loud =3D squid_curtime; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} else { > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0debugs(71, 3, "WARNING: Cache Digest cannot store " << cap > > > << " > > > entries. Limiting to " << absolute_max); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cap =3D absolute_max; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0} > > > ++ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0return cap; > > > ++} > > > + #endif /* USE_CACHE_DIGESTS */ > > > +=C2=A0 > > > +-static void > > > +-storeDigestRegisterWithCacheManager(void) > > > ++void > > > ++storeDigestInit(void) > > > + { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Mgr::RegisterAction("store_digest", "Sto= re Digest", > > > storeDigestReport, > > > 0, 1); > > > +-} > > > +- > > > +-/* > > > +- * PUBLIC FUNCTIONS > > > +- */ > > > +- > > > +-void > > > +-storeDigestInit(void) > > > +-{ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0storeDigestRegisterWithCacheManager(); > > > +=C2=A0 > > > + #if USE_CACHE_DIGESTS > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const int cap =3D storeDigestCalcCap(); > > > +- > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!Config.onoff.digest_generation) { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0store_digest =3D= NULL; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 3, "L= ocal cache digest generation disabled"); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} > > > +=C2=A0 > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t cap =3D storeDigestCalcCap(); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0store_digest =3D cacheDigestCreate(cap, = Config.digest.bits_per_entry); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, DBG_IMPORTANT, "Local cache d= igest enabled; > > > rebuild/rewrite > > > every " << > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0(int) Config.digest.rebuild_period << "/" << > > > +@@ -290,6 +317,31 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0storeDigestRebuildResume(); > > > + } > > > +=C2=A0 > > > ++/// \returns true if we actually resized the digest > > > ++static bool > > > ++storeDigestResize() > > > ++{ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0const uint64_t cap =3D storeDigestCalcCap(); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0assert(store_digest); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0uint64_t diff; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (cap > store_digest->capacity) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D cap - store_= digest->capacity; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0else > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D store_digest= ->capacity - cap; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, store_digest->capacity << " -> = " << cap << "; change: > > > " << > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dif= f << " (" << xpercentInt(diff, store_digest->capacity) << > > > "%)" > > > ); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0/* avoid minor adjustments */ > > > ++ > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (diff <=3D store_digest->capacity / 10) { > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "small = change, will not resize."); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return false; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0} else { > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "big ch= ange, resizing."); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cacheDigestChangeCap(= store_digest, cap); > > > ++=C2=A0=C2=A0=C2=A0=C2=A0} > > > ++=C2=A0=C2=A0=C2=A0=C2=A0return true; > > > ++} > > > ++ > > > + /* called be Rewrite to push Rebuild forward */ > > > + static void > > > + storeDigestRebuildResume(void) > > > +@@ -439,7 +491,7 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert(e); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* _add_ check that nothing bad happened= while we were waiting @?@ > > > @?@ > > > */ > > > +=C2=A0 > > > +-=C2=A0=C2=A0=C2=A0=C2=A0if (sd_state.rewrite_offset + chunk_size > st= ore_digest->mask_size) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (static_cast(sd_state.rewrite_of= fset + chunk_size) > > > > store_digest->mask_size) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chunk_size =3D s= tore_digest->mask_size - sd_state.rewrite_offset; > > > +=C2=A0 > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0e->append(store_digest->mask + sd_state.= rewrite_offset, chunk_size); > > > +@@ -451,7 +503,7 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sd_state.rewrite_offset +=3D chunk_size; > > > +=C2=A0 > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* are we done ? */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0if (sd_state.rewrite_offset >=3D store_digest= ->mask_size) > > > ++=C2=A0=C2=A0=C2=A0=C2=A0if (static_cast(sd_state.rewrite_of= fset) >=3D store_digest- > > > > mask_size) > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0storeDigestRewri= teFinish(e); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0eventAdd("storeD= igestSwapOutStep", storeDigestSwapOutStep, data, > > > 0.0, 1, false); > > > +@@ -467,60 +519,10 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.count =3D htonl(store_di= gest->count); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.del_count =3D htonl(stor= e_digest->del_count); > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.mask_size =3D htonl(stor= e_digest->mask_size); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.bits_per_entry =3D (unsigned = char) > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0Config.digest.bits_per_entry; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.bits_per_entry =3D Config.dig= est.bits_per_entry; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sd_state.cblock.hash_func_count =3D (uns= igned char) > > > CacheDigestHashFuncCount; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0e->append((char *) &sd_state.cblock, siz= eof(sd_state.cblock)); > > > + } > > > +=C2=A0 > > > +-/* calculates digest capacity */ > > > +-static int > > > +-storeDigestCalcCap(void) > > > +-{ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0/* > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* To-Do: Bloom proved that the optimal = filter utilization is 50% > > > (half > > > of > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* the bits are off). However, we do not= have a formula to calculate > > > the > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* number of _entries_ we want to pre-al= locate for. > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const int hi_cap =3D Store::Root().maxSize() / > > > Config.Store.avgObjectSize; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const int lo_cap =3D 1 + Store::Root().curren= tSize() / > > > Config.Store.avgObjectSize; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const int e_count =3D StoreEntry::inUseCount(= ); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int cap =3D e_count ? e_count :hi_cap; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "storeDigestCalcCap: have: " <<= e_count << ", want " > > > << > > > cap << > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0" e= ntries; limits: [" << lo_cap << ", " << hi_cap << "]"); > > > +- > > > +-=C2=A0=C2=A0=C2=A0=C2=A0if (cap < lo_cap) > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cap =3D lo_cap; > > > +- > > > +-=C2=A0=C2=A0=C2=A0=C2=A0/* do not enforce hi_cap limit, average-based= estimation may be > > > wrong > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*if (cap > hi_cap) > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*=C2=A0=C2=A0cap =3D hi_cap; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0return cap; > > > +-} > > > +- > > > +-/* returns true if we actually resized the digest */ > > > +-static int > > > +-storeDigestResize(void) > > > +-{ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0const int cap =3D storeDigestCalcCap(); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0int diff; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0assert(store_digest); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0diff =3D abs(cap - store_digest->capacity); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "storeDigestResize: " << > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sto= re_digest->capacity << " -> " << cap << "; change: " << > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dif= f << " (" << xpercentInt(diff, store_digest->capacity) << > > > "%)" > > > ); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0/* avoid minor adjustments */ > > > +- > > > +-=C2=A0=C2=A0=C2=A0=C2=A0if (diff <=3D store_digest->capacity / 10) { > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "storeD= igestResize: small change, will not > > > resize."); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 0; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0} else { > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0debugs(71, 2, "storeD= igestResize: big change, resizing."); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cacheDigestChangeCap(= store_digest, cap); > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 1; > > > +-=C2=A0=C2=A0=C2=A0=C2=A0} > > > +-} > > > +- > > > + #endif /* USE_CACHE_DIGESTS */ > > > +=C2=A0 > > > + > > > +=3D=3D=3D modified file 'src/tests/stub_CacheDigest.cc' > > > +--- src/tests/stub_CacheDigest.cc 2016-01-01 00:14:27 +0000 > > > ++++ src/tests/stub_CacheDigest.cc 2016-07-23 07:16:20 +0000 > > > +@@ -16,11 +16,11 @@ > > > + class CacheDigestGuessStats; > > > + class StoreEntry; > > > +=C2=A0 > > > +-CacheDigest * cacheDigestCreate(int, int) STUB_RETVAL(NULL) > > > ++CacheDigest * cacheDigestCreate(uint64_t, uint8_t) STUB_RETVAL(NULL) > > > + void cacheDigestDestroy(CacheDigest *) STUB > > > + CacheDigest * cacheDigestClone(const CacheDigest *) STUB_RETVAL(NULL) > > > + void cacheDigestClear(CacheDigest * ) STUB > > > +-void cacheDigestChangeCap(CacheDigest *,int) STUB > > > ++void cacheDigestChangeCap(CacheDigest *,uint64_t) STUB > > > + int cacheDigestTest(const CacheDigest *, const cache_key *) > > > STUB_RETVAL(1) > > > + void cacheDigestAdd(CacheDigest *, const cache_key *) STUB > > > + void cacheDigestDel(CacheDigest *, const cache_key *) STUB > > > +@@ -28,5 +28,4 @@ > > > + void cacheDigestGuessStatsUpdate(CacheDigestGuessStats *, int, int) S= TUB > > > + void cacheDigestGuessStatsReport(const CacheDigestGuessStats *, > > > StoreEntry > > > *, const char *) STUB > > > + void cacheDigestReport(CacheDigest *, const char *, StoreEntry *) STUB > > > +-size_t cacheDigestCalcMaskSize(int, int) STUB_RETVAL(1) > > > +- > > > ++uint32_t cacheDigestCalcMaskSize(uint64_t, uint8_t) STUB_RETVAL(1) > > > + > > > diff --git a/src/patches/squid/squid-3.5-14068.patch > > > b/src/patches/squid/squid-3.5-14068.patch > > > new file mode 100644 > > > index 0000000..4766e00 > > > --- /dev/null > > > +++ b/src/patches/squid/squid-3.5-14068.patch > > > @@ -0,0 +1,35 @@ > > > +------------------------------------------------------------ > > > +revno: 14068 > > > +revision-id: squid3(a)treenet.co.nz-20160723071930-cemledcltg8pkc28 > > > +parent: squid3(a)treenet.co.nz-20160723071620-1wzqpbyi1rk5w6vg > > > +fixes bug: http://bugs.squid-cache.org/show_bug.cgi?id=3D4542 > > > +author: Anonymous > > > +committer: Amos Jeffries > > > +branch nick: 3.5 > > > +timestamp: Sat 2016-07-23 19:19:30 +1200 > > > +message: > > > +=C2=A0=C2=A0Bug #4542: authentication credentials IP TTL updated incor= rectly > > > +------------------------------------------------------------ > > > +# Bazaar merge directive format 2 (Bazaar 0.90) > > > +# revision_id: squid3(a)treenet.co.nz-20160723071930-cemledcltg8pkc28 > > > +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# testament_sha1: ee0c6aab5414532d9554ef338cce049263902fd8 > > > +# timestamp: 2016-07-23 07:24:05 +0000 > > > +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# base_revision_id: squid3(a)treenet.co.nz-20160723071620-\ > > > +#=C2=A0=C2=A0=C2=A01wzqpbyi1rk5w6vg > > > +#=C2=A0 > > > +# Begin patch > > > +=3D=3D=3D modified file 'src/auth/User.cc' > > > +--- src/auth/User.cc 2016-01-01 00:14:27 +0000 > > > ++++ src/auth/User.cc 2016-07-23 07:19:30 +0000 > > > +@@ -284,7 +284,7 @@ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0/* This ip has already been seen. */ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0found =3D 1; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0/* update IP ttl */ > > > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0ipdata->ip_expiretime =3D squid_curtime; > > > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0ipdata->ip_expiretime =3D squid_curtime + > > > ::Config.authenticateIpTTL; > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} else if (ipdat= a->ip_expiretime <=3D squid_curtime) { > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0/* This IP has expired - remove from the seen list */ > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0dlinkDelete(&ipdata->node, &ip_list); > > > + > > > diff --git a/src/patches/squid/squid-3.5-14069.patch > > > b/src/patches/squid/squid-3.5-14069.patch > > > new file mode 100644 > > > index 0000000..15ca37a > > > --- /dev/null > > > +++ b/src/patches/squid/squid-3.5-14069.patch > > > @@ -0,0 +1,30 @@ > > > +------------------------------------------------------------ > > > +revno: 14069 > > > +revision-id: squidadm(a)squid-cache.org-20160723121351-iuc8hwstrqd0l1dv > > > +parent: squid3(a)treenet.co.nz-20160723071930-cemledcltg8pkc28 > > > +committer: Source Maintenance > > > +branch nick: 3.5 > > > +timestamp: Sat 2016-07-23 12:13:51 +0000 > > > +message: > > > +=C2=A0=C2=A0SourceFormat Enforcement > > > +------------------------------------------------------------ > > > +# Bazaar merge directive format 2 (Bazaar 0.90) > > > +# revision_id: squidadm(a)squid-cache.org-20160723121351-\ > > > +#=C2=A0=C2=A0=C2=A0iuc8hwstrqd0l1dv > > > +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# testament_sha1: c9e37a723686ae2ee489ba7ec2e981ae153bda28 > > > +# timestamp: 2016-07-23 12:50:56 +0000 > > > +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 > > > +# base_revision_id: squid3(a)treenet.co.nz-20160723071930-\ > > > +#=C2=A0=C2=A0=C2=A0cemledcltg8pkc28 > > > +#=C2=A0 > > > +# Begin patch > > > +=3D=3D=3D modified file 'src/tests/stub_CacheDigest.cc' > > > +--- src/tests/stub_CacheDigest.cc 2016-07-23 07:16:20 +0000 > > > ++++ src/tests/stub_CacheDigest.cc 2016-07-23 12:13:51 +0000 > > > +@@ -29,3 +29,4 @@ > > > + void cacheDigestGuessStatsReport(const CacheDigestGuessStats *, > > > StoreEntry > > > *, const char *) STUB > > > + void cacheDigestReport(CacheDigest *, const char *, StoreEntry *) STUB > > > + uint32_t cacheDigestCalcMaskSize(uint64_t, uint8_t) STUB_RETVAL(1) > > > ++ > > > + > >=20 >=20 --===============6721080753957259619== Content-Type: application/pgp-signature Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="signature.asc" MIME-Version: 1.0 LS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KVmVyc2lvbjogR251UEcgdjIKCmlRSWNCQUFC Q2dBR0JRSlhvY3V1QUFvSkVJQjU4UDl2a0FrSHorRVAvMWswVk00b1NxdXd3bVN1NlFBV1FxT0wK SGJlUzdFZ2wrWEtqMjNWYmpMalEyeGtsc2hPNGM4cHRmdEVGNzh1WDlORFRSNytDVEdnRkpaMUdl MHNhdHBrRQphSDAzaXM5eUJmK2xLT3VJNVpVdFN3UkhMNmVYOUFZTXgyZ1lNQ21VYkFONDhaZ1Bq SXdJbWlQMUkzR1hzWTl0ClFzakEzTEY4dGd5Y1Y4NjBYMW5pTCthRmtnTG5XeWxlc0FTZlM5WGpo TU9IamphVkpGZWZGdGFVbGJDN1J4VkEKU3lEMkgveUZqQWo3QVN6dkZlY0FZaDVpYlZPYUk4VFUy RDl1bm95ZTR0cVgxSHVOdThka1lEVE9yWmNxN1FveApFRml0cVpEc1dtNVROVzlRaHNhT0N6RzBa UFJZbGQ0OU8yMVVtZ05vbzdxNkFtcndXcjZPNUpaUHZ6bnNQVFU1CnlNNEFOaVdvRytSUFFkRDNZ dExSUVh4bmlzM21JRW9IandJZDhCZVJ3RXZTQy9oemsxTWJsOEpObldHd2c1MnAKc29YejVZM1Z4 SGpHNks2YnFpcnUwZEtrNkx1Z1EvKzRCaHJoQXpoOWlzMmJZYjk1VHJLOVpFYTZPMkJ1QnNtZgpF Zko1VXAvcjNLQk5qVmduczlCdGE3Q00yL05tNXlkQkR6ZkFhTHVsMWpLQWdpeUYwZ2N6Szl1R0ZT WHp6bENmClhuVUUyUk1ZYkoxNDBTQzR2aVc1R0dTKzZQU2E0Z0tpbk1DaFpVUTdab3R3K2wyY0hH ZVlneGJNeWFET240WU0KYVJuYVZ6VEZWRWVqN1VWMkx2MFdIRisvVWo4OW5lZU5MQmdIWU1qV1dS dHRDR1VqRGcxT3hvZTVoZGdVSE9EWgp4MitvazJXdXQ1OSs5MDFTSjhvaQo9TVc3SAotLS0tLUVO RCBQR1AgU0lHTkFUVVJFLS0tLS0K --===============6721080753957259619==--