[Http-crcsync] crccache ready for some testing I think
Toby Collett
thjc at plan9.net.nz
Mon Mar 30 02:10:25 EDT 2009
I have pulled these changes into the git repo.
Thanks,
Toby
2009/3/30 Rusty Russell <rusty at rustcorp.com.au>
> On Monday 30 March 2009 07:31:38 Alex Wulms wrote:
> > I have also investigated why the cache-server stops finding block matches
> > after the first difference. I think it is because at this moment, the
> cache
> > server does not read ahead enough in the data-stream. Basically, the
> > crc_read_block function of Rusty must be fed with as much data as
> possible,
>
> Bug fixed. Grab latest from ccan, or just apply this patch.
>
> Thanks for this: I added tests for feeding 1 byte at a time, and it showed
> the
> issue immediately.
>
> Cheers,
> Rusty.
>
> === modified file 'ccan/crcsync/crcsync.c'
> --- ccan/crcsync/crcsync.c 2009-02-17 09:16:33 +0000
> +++ ccan/crcsync/crcsync.c 2009-03-30 00:07:04 +0000
> @@ -138,6 +138,7 @@
> goto have_match;
> }
>
> + /* old is the trailing edge of the checksum window. */
> if (buffer_size(ctx) >= ctx->block_size)
> old = ctx->buffer + ctx->buffer_start;
> else
> @@ -153,6 +154,7 @@
> *old, *p,
> ctx->uncrc_tab);
> old++;
> + /* End of stored buffer? Start on data they gave
> us. */
> if (old == ctx->buffer + ctx->buffer_end)
> old = buf;
> } else {
> @@ -167,11 +169,6 @@
> p++;
> }
>
> - /* Make sure we have a copy of the last block_size bytes.
> - * First, copy down the old data. */
> - if (buffer_size(ctx)) {
> - }
> -
> if (crcmatch >= 0) {
> /* We have a match! */
> if (ctx->literal_bytes > ctx->block_size) {
> @@ -187,12 +184,15 @@
> assert(ctx->literal_bytes == 0);
> ctx->have_match = -1;
> ctx->running_crc = 0;
> + /* Nothing more in the buffer. */
> + ctx->buffer_start = ctx->buffer_end = 0;
> }
> } else {
> /* Output literal if it's more than 1 block ago. */
> if (ctx->literal_bytes > ctx->block_size) {
> *result = ctx->literal_bytes - ctx->block_size;
> - ctx->literal_bytes = ctx->block_size;
> + ctx->literal_bytes -= *result;
> + ctx->buffer_start += *result;
> } else
> *result = 0;
>
> @@ -243,29 +243,34 @@
> long crc_read_flush(struct crc_context *ctx)
> {
> long ret;
> + size_t final;
>
> - /* In case we ended on a whole block match. */
> - if (ctx->have_match == -1) {
> - size_t final;
> -
> - final = final_block_match(ctx);
> - if (!final) {
> - /* This is how many bytes we're about to consume.
> */
> - ret = buffer_size(ctx);
> - ctx->buffer_start += ret;
> - ctx->literal_bytes -= ret;
> -
> - return ret;
> - }
> - ctx->buffer_start += final;
> - ctx->literal_bytes -= final;
> - ctx->have_match = ctx->num_crcs-1;
> - }
> -
> - /* It might be a partial block match, so no assert */
> - ctx->literal_bytes = 0;
> - ret = -ctx->have_match-1;
> - ctx->have_match = -1;
> + /* We might have ended right on a matched block. */
> + if (ctx->have_match != -1) {
> + ctx->literal_bytes -= ctx->block_size;
> + assert(ctx->literal_bytes == 0);
> + ret = -ctx->have_match-1;
> + ctx->have_match = -1;
> + ctx->running_crc = 0;
> + /* Nothing more in the buffer. */
> + ctx->buffer_start = ctx->buffer_end;
> + return ret;
> + }
> +
> + /* Look for truncated final block. */
> + final = final_block_match(ctx);
> + if (!final) {
> + /* Nope? Just a literal. */
> + ret = buffer_size(ctx);
> + ctx->buffer_start += ret;
> + ctx->literal_bytes -= ret;
> + return ret;
> + }
> +
> + /* We matched (some of) what's left. */
> + ret = -(ctx->num_crcs-1)-1;
> + ctx->buffer_start += final;
> + ctx->literal_bytes -= final;
> return ret;
> }
>
>
>
>
>
--
This email is intended for the addressee only and may contain privileged
and/or confidential information
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.laptop.org/pipermail/http-crcsync/attachments/20090330/f8b75533/attachment-0001.htm
More information about the Http-crcsync
mailing list